Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 10
App\Models\NestedSet
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
6
0.00% covered (danger)
0.00%
0 / 10
 setTable
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 getAllNodes
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
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;
//    }
}