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; | |
// } | |
} |