Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 10 |
| App\Models\NestedSet | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
6 | |
0.00% |
0 / 10 |
| setTable | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getAllNodes | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
| <?php | |
| namespace App\Models; | |
| use App\Models\DatabaseMySql; | |
| class NestedSet implements NestedSetInterface { | |
| protected $table; | |
| public function setTable($table) { | |
| $this->table = $table; | |
| } | |
| // public function addAfter($nodeId1, $nodeId2) { | |
| // | |
| // if ($nodeId1 == $nodeId2) { | |
| // return false; | |
| // } | |
| // $sql = 'SELECT id, lft, rgt, level ' | |
| // . 'FROM ' . $this->table . | |
| // ' WHERE id = :nodeId1 OR id = :nodeId2'; | |
| // $placeholders = [ | |
| // 'nodeId1' => $nodeId1, | |
| // 'nodeId2' => $nodeId2 | |
| // ]; | |
| // $query = Database::query($sql, $placeholders); | |
| // | |
| // if (count($query) != 2) { | |
| // return false; // no node | |
| // } | |
| // | |
| // if ($query[0]['id'] == $nodeId1) { | |
| // $node1 = $query[0]; | |
| // $node2 = $query[1]; | |
| // } else { | |
| // $node1 = $query[1]; | |
| // $node2 = $query[0]; | |
| // } | |
| // | |
| // var_dump($node1, $node2); | |
| // | |
| // Database::getDB()->beginTransaction(); | |
| // | |
| // try { | |
| // if ($node1['level'] != $node2['level']) { | |
| // $this->addChild($nodeId1, $this->getParentId($nodeId2)); | |
| // return $this->addAfter($nodeId1, $nodeId2); | |
| // } | |
| // | |
| // $node1Size = ''; | |
| // } catch (Exception $ex) { | |
| // | |
| // } | |
| // } | |
| // | |
| // public function addBefore($nodeId1, $nodeId2) { | |
| // | |
| // } | |
| // | |
| // public function addChild($nodeId1, $nodeId2) { | |
| // | |
| // } | |
| // | |
| // /** | |
| // * | |
| // * @param string $name | |
| // * @param string $nodeParentId | |
| // */ | |
| // public function addNode($name = '', $nodeParentId = '') { | |
| // //if no parent then add to root | |
| // if ($nodeParentId == '') { | |
| // $sql = 'SELECT id FROM ' . $this->table . ' WHERE level = 0'; | |
| // $placeholders = []; | |
| // $query = Database::query($sql, $placeholders); | |
| // | |
| // // check if root node exists | |
| // if (empty($query)) { | |
| // $this->addRoot(); | |
| // return $this->addNode($name, $nodeParentId); | |
| // } | |
| // | |
| // $result = $query; | |
| // $nodeParentId = $result[0]['id']; | |
| // } | |
| // //check if nodeParentId exists | |
| // $sql = 'SELECT * FROM ' . $this->table . ' WHERE id = :id'; | |
| // $placeholderNodeParentId = [ | |
| // 'id' => $nodeParentId | |
| // ]; | |
| // $query = Database::query($sql, $placeholderNodeParentId); | |
| // $parentRight = $query[0]['rgt']; | |
| // $parentLevel = $query[0]['level']; | |
| // | |
| // Database::getDB()->beginTransaction(); | |
| // | |
| // try { | |
| // //shift the node to give some room for new node | |
| // $sql = 'UPDATE ' . $this->table . ' | |
| // SET | |
| // lft = CASE | |
| // WHEN lft > :parentRgt THEN lft + 2 | |
| // ELSE lft | |
| // END, | |
| // rgt = CASE | |
| // WHEN rgt >= :parentRgt THEN rgt + 2 | |
| // ELSE rgt | |
| // END | |
| // WHERE | |
| // rgt >= :parentRgt'; | |
| // | |
| // $placeholdersParentRgt = [ | |
| // 'parentRgt' => $parentRight, | |
| // 'parentRgt' => $parentRight, | |
| // 'parentRgt' => $parentRight | |
| // ]; | |
| // Database::update($sql, $placeholdersParentRgt); | |
| // | |
| // $sql = 'INSERT INTO ' . $this->table . | |
| // '(name, lft, rgt, level) VALUES(:name, :lft, :rgt, :level)'; | |
| // | |
| // $placeholdersInsert = [ | |
| // 'name' => $name, | |
| // 'lft' => $parentRight, | |
| // 'rgt' => $parentRight + 1, | |
| // 'level' => $parentLevel + 1 | |
| // ]; | |
| // | |
| // Database::insert($sql, $placeholdersInsert); | |
| // $lastId = Database::getDB()->lastInsertId(); | |
| // Database::getDB()->commit(); | |
| // } catch (Exception $e) { | |
| // Database::getDB()->rollBack(); | |
| // throw $e; | |
| // } | |
| // | |
| // return $lastId; | |
| // } | |
| // | |
| // /** | |
| // * | |
| // * add root to the table (initialization only) | |
| // * @param string $rootName | |
| // * @return boolean if root already exists | |
| // * @todo transaction | |
| // */ | |
| // public function addRoot() { | |
| // $sql = 'SELECT COUNT(1) AS rowCount FROM ' . $this->table . ' WHERE level = 0;'; | |
| // $placeholders = []; | |
| // $result = Database::query($sql, $placeholders); | |
| // if ($result[0]['rowCount'] != '0') { | |
| // return false; // root exists, exit | |
| // } | |
| // | |
| // $sql = 'INSERT INTO ' . $this->table . '(name, lft, rgt, level) VALUES(:name, :lft, :rgt, :level)'; | |
| // $placeholdersInsert = [ | |
| // 'name' => 'rootName', | |
| // 'lft' => '1', | |
| // 'rgt' => '2', | |
| // 'level' => '0' | |
| // ]; | |
| // Database::insert($sql, $placeholdersInsert); | |
| // } | |
| // | |
| // public function deleteNode($nodeId) { | |
| // | |
| // $sql = 'SELECT id, lft, rgt, level FROM ' . $this->table . ' WHERE id = :id'; | |
| // $placeholders = [ | |
| // 'id' => $nodeId | |
| // ]; | |
| // | |
| // $query = Database::query($sql, $placeholders); | |
| // | |
| // if (empty($query)) { | |
| // return false; | |
| // } | |
| // | |
| // $lft = $query[0]['lft']; | |
| // $rgt = $query[0]['rgt']; | |
| // | |
| // Database::getDB()->beginTransaction(); | |
| // | |
| // try { | |
| // | |
| // $sql = 'DELETE | |
| // FROM ' . $this->table . ' | |
| // WHERE lft >= :lft | |
| // AND rgt <= :rgt'; | |
| // | |
| // $placeholderForDelete = [ | |
| // 'lft' => $lft, | |
| // 'rgt' => $rgt | |
| // ]; | |
| // Database::delete($sql, $placeholderForDelete); | |
| // | |
| // $tmpNode = $rgt - $lft + 1; | |
| // | |
| // // shift other nodes to correct posotion | |
| // | |
| // $sql = 'UPDATE ' . $this->table . ' | |
| // SET lft = CASE WHEN lft > :lft THEN lft - :tmpNode ELSE lft END, | |
| // rgt = CASE WHEN rgt >= :rgt THEN rgt - :tmpNode ELSE rgt END | |
| // WHERE rgt >= :rgt'; | |
| // | |
| // $placeholderForUpdate = [ | |
| // 'lft' => $lft, | |
| // 'tmpNode' => $tmpNode, | |
| // 'rgt' => $rgt, | |
| // 'tmpNode' => $tmpNode, | |
| // 'rgt' => $rgt | |
| // ]; | |
| // | |
| // Database::update($sql, $placeholderForUpdate); | |
| // | |
| // Database::getDB()->commit(); | |
| // } catch (Exception $e) { | |
| // Database::getDB()->rollBack(); | |
| // throw $e; | |
| // } | |
| // } | |
| // | |
| // public function getRoot() { | |
| // $sql = 'SELECT * FROM ' . $this->table . ' WHERE level = 0'; | |
| // $placeholders = []; | |
| // return Database::query($sql, $placeholders); | |
| // } | |
| /** | |
| * Gets all nodes with children-count and isBranch identifier | |
| * | |
| * @return array | |
| */ | |
| public function getAllNodes() { | |
| $db = DatabaseMySql::getInstance(); | |
| $sql = 'SELECT * , | |
| FORMAT((((rgt - lft) -1) / 2),0) AS children, | |
| CASE WHEN rgt - lft > 1 THEN 1 ELSE 0 END AS isBranch | |
| FROM ' . $this->table . ' ORDER BY lft'; | |
| $placeholders = []; | |
| return $db->query($sql, $placeholders); | |
| } | |
| // /** | |
| // * | |
| // * @param string $nodeId | |
| // * @return array | |
| // */ | |
| // public function getLeaf($nodeId) { | |
| // $sql = 'SELECT * | |
| // FROM ' . $this->table . ' | |
| // WHERE rgt = lft + 1 | |
| // AND id = :id;'; | |
| // | |
| // $placeholders = [ | |
| // 'name' => $nodeId | |
| // ]; | |
| // | |
| // return Database::query($sql, $placeholders); | |
| // } | |
| // | |
| // /** | |
| // * Gets Leafs (last nodes in tree structure) | |
| // * | |
| // * @return array | |
| // */ | |
| // public function getLeafs() { | |
| // $sql = 'SELECT * | |
| // FROM ' . $this->table . ' | |
| // WHERE rgt = lft + 1;'; | |
| // | |
| // $placeholders = []; | |
| // | |
| // return Database::query($sql, $placeholders); | |
| // } | |
| // | |
| // /** | |
| // * | |
| // * @param string $nodeId | |
| // * @return array | |
| // */ | |
| // public function getPathOfNode($nodeId) { | |
| // $sql = 'SELECT parent.* | |
| // FROM ' . $this->table . ' AS node, | |
| // ' . $this->table . ' AS parent | |
| // WHERE node.lft BETWEEN parent.lft AND parent.rgt | |
| // AND node.id = :id | |
| // ORDER BY parent.lft;'; | |
| // | |
| // $placeholders = [ | |
| // "id" => $nodeId | |
| // ]; | |
| // | |
| // return Database::query($sql, $placeholders); | |
| // } | |
| // | |
| // /** | |
| // * | |
| // * @param string $nodeId | |
| // * @return array | |
| // */ | |
| // public function getSingleNode($nodeId) { | |
| // $sql = 'SELECT * | |
| // FROM ' . $this->table . ' | |
| // WHERE id = :id;'; | |
| // | |
| // $placeholders = [ | |
| // "id" => $nodeId | |
| // ]; | |
| // | |
| // return Database::query($sql, $placeholders); | |
| // } | |
| // | |
| // public function getParentId($nodeId) { | |
| // $sql = 'SELECT id, (SELECT id | |
| // FROM ' . $this->table . ' t2 | |
| // WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt | |
| // ORDER BY t2.rgt-t1.rgt ASC | |
| // LIMIT 1) AS parent | |
| // FROM nested_test t1 | |
| // WHERE id = :id | |
| // ORDER BY (rgt-lft) DESC;'; | |
| // | |
| // $placeholders = [ | |
| // 'id' => $nodeId | |
| // ]; | |
| // | |
| // $query = Database::query($sql, $placeholders); | |
| // $parentId = $query[0]['parent']; | |
| // | |
| // return $parentId; | |
| // } | |
| } |