4include_once
'./Services/Tree/interfaces/interface.ilTreeImplementation.php';
26 $this->tree = $a_tree;
49 $query =
'SELECT s.child FROM ' .
50 $this->
getTree()->getTreeTable() .
' s, ' .
51 $this->
getTree()->getTreeTable() .
' t ' .
52 'WHERE t.child = %s ' .
53 'AND s.lft > t.lft ' .
54 'AND s.rgt < t.rgt ' .
55 'AND s.' . $this->
getTree()->getTreePk() .
' = %s';
59 array(
'integer',
'integer'),
60 array($a_node_id,$this->
getTree()->getTreeId())
63 $childs[] = $row->child;
65 return $childs ? $childs : array();
79 if (is_array($a_types)) {
81 $type_str =
"AND " .
$ilDB->in($this->
getTree()->getObjectDataTable() .
".type", $a_types,
false,
"text");
83 } elseif (strlen($a_types)) {
84 $type_str =
"AND " . $this->
getTree()->getObjectDataTable() .
".type = " .
$ilDB->quote($a_types,
"text");
88 if ($type_str or $a_force_join_reference) {
89 $join = $this->
getTree()->buildJoin();
93 if (count($a_fields)) {
94 $fields = implode(
',', $a_fields);
99 "FROM " . $this->
getTree()->getTreeTable() .
" " .
101 "WHERE " . $this->
getTree()->getTreeTable() .
'.lft ' .
102 'BETWEEN ' .
$ilDB->quote($a_node[
'lft'],
'integer') .
' ' .
103 'AND ' .
$ilDB->quote($a_node[
'rgt'],
'integer') .
' ' .
104 "AND " . $this->
getTree()->getTreeTable() .
"." . $this->
getTree()->getTreePk() .
' < 0 ' .
106 "ORDER BY " . $this->
getTree()->getTreeTable() .
".lft";
120 public function getSubTreeQuery($a_node, $a_types =
'', $a_force_join_reference =
true, $a_fields = array())
127 if (is_array($a_types)) {
129 $type_str =
"AND " .
$ilDB->in($this->
getTree()->getObjectDataTable() .
".type", $a_types,
false,
"text");
131 } elseif (strlen($a_types)) {
132 $type_str =
"AND " . $this->
getTree()->getObjectDataTable() .
".type = " .
$ilDB->quote($a_types,
"text");
136 if ($type_str or $a_force_join_reference) {
137 $join = $this->
getTree()->buildJoin();
141 if (count($a_fields)) {
142 $fields = implode(
',', $a_fields);
147 "FROM " . $this->
getTree()->getTreeTable() .
" " .
149 "WHERE " . $this->
getTree()->getTreeTable() .
'.lft ' .
150 'BETWEEN ' .
$ilDB->quote($a_node[
'lft'],
'integer') .
' ' .
151 'AND ' .
$ilDB->quote($a_node[
'rgt'],
'integer') .
' ' .
152 "AND " . $this->
getTree()->getTreeTable() .
"." . $this->
getTree()->getTreePk() .
" = " .
$ilDB->quote($this->
getTree()->getTreeId(),
'integer') .
' ' .
154 "ORDER BY " . $this->
getTree()->getTreeTable() .
".lft";
169 if ($a_node_a[
'child'] == $a_node_b[
'child']) {
172 if ($a_node_a[
'lft'] < $a_node_b[
'lft'] and $a_node_a[
'rgt'] > $a_node_b[
'rgt']) {
175 if ($a_node_b[
'lft'] < $a_node_a[
'lft'] and $a_node_b[
'rgt'] > $a_node_a[
'rgt']) {
180 if ($a_node_a[
'parent'] == $a_node_b[
'parent']) {
211 $insert_node_callable =
function (
ilDBInterface $ilDB) use ($a_node_id, $a_parent_id, $a_pos) {
217 'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
218 'WHERE child = %s ' .
219 'AND ' . $this->
getTree()->getTreePk() .
' = %s ',
220 $ilDB->quote($a_parent_id,
'integer'),
221 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
227 if ($r->parent ===
null) {
236 if ($this->
getTree()->__isMainTree()) {
238 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
239 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
240 'rgt = CASE WHEN rgt > %s THEN rgt + 2 ELSE rgt END ',
241 $ilDB->quote($left,
'integer'),
242 $ilDB->quote($left,
'integer')
247 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
248 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
249 'rgt = CASE WHEN rgt > %s THEN rgt + 2 ELSE rgt END ' .
250 'WHERE ' . $this->
getTree()->getTreePk() .
' = %s ',
251 $ilDB->quote($left,
'integer'),
252 $ilDB->quote($left,
'integer'),
253 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
262 if ($this->
getTree()->getGap() > 0) {
265 'SELECT rgt,lft,parent FROM ' . $this->
getTree()->getTreeTable() .
' ' .
266 'WHERE child = %s ' .
267 'AND ' . $this->
getTree()->getTreePk() .
' = %s',
268 $ilDB->quote($a_parent_id,
'integer'),
269 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
274 if ($r[
'parent'] ===
null) {
278 $parentRgt = $r[
'rgt'];
279 $parentLft = $r[
'lft'];
282 $availableSpace = $parentRgt - $parentLft;
283 if ($availableSpace < 2) {
291 if ($this->
getTree()->__isMainTree()) {
293 'SELECT MAX(rgt) max_rgt FROM ' . $this->
getTree()->getTreeTable() .
' ' .
294 'WHERE parent = %s ',
295 $ilDB->quote($a_parent_id,
'integer')
301 'SELECT MAX(rgt) max_rgt FROM ' . $this->
getTree()->getTreeTable() .
' ' .
302 'WHERE parent = %s ' .
303 'AND ' . $this->
getTree()->getTreePk() .
' = %s',
304 $ilDB->quote($a_parent_id,
'integer'),
305 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
311 if (isset($r[
'max_rgt'])) {
314 $availableSpace = $parentRgt - $r[
'max_rgt'];
315 $lft = $r[
'max_rgt'] + 1;
320 $lft = $parentLft + 1;
327 if ($availableSpace < 2) {
328 if ($this->
getTree()->__isMainTree()) {
330 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
331 'lft = CASE WHEN lft > %s THEN lft + %s ELSE lft END, ' .
332 'rgt = CASE WHEN rgt >= %s THEN rgt + %s ELSE rgt END ',
333 $ilDB->quote($parentRgt,
'integer'),
334 $ilDB->quote((2 + $this->getTree()->getGap() * 2),
'integer'),
335 $ilDB->quote($parentRgt,
'integer'),
336 $ilDB->quote((2 + $this->getTree()->getGap() * 2),
'integer')
341 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
342 'lft = CASE WHEN lft > %s THEN lft + %s ELSE lft END, ' .
343 'rgt = CASE WHEN rgt >= %s THEN rgt + %s ELSE rgt END ' .
344 'WHERE ' . $this->
getTree()->getTreePk() .
' = %s ',
345 $ilDB->quote($parentRgt,
'integer'),
346 $ilDB->quote((2 + $this->getTree()->getGap() * 2),
'integer'),
347 $ilDB->quote($parentRgt,
'integer'),
348 $ilDB->quote((2 + $this->getTree()->getGap() * 2),
'integer'),
349 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
359 if ($this->
getTree()->__isMainTree()) {
361 'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
363 $ilDB->quote($a_parent_id,
'integer')
368 'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
369 'WHERE child = %s ' .
370 'AND ' . $this->
getTree()->getTreePk() .
' = %s ',
371 $ilDB->quote($a_parent_id,
'integer'),
372 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
378 if ($r->parent ===
null) {
388 if ($this->
getTree()->__isMainTree()) {
390 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
391 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
392 'rgt = CASE WHEN rgt >= %s THEN rgt + 2 ELSE rgt END ',
393 $ilDB->quote($right,
'integer'),
394 $ilDB->quote($right,
'integer')
399 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
400 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
401 'rgt = CASE WHEN rgt >= %s THEN rgt + 2 ELSE rgt END ' .
402 'WHERE ' . $this->
getTree()->getTreePk() .
' = %s',
403 $ilDB->quote($right,
'integer'),
404 $ilDB->quote($right,
'integer'),
405 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
417 'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
418 'WHERE child = %s ' .
419 'AND ' . $this->
getTree()->getTreePk() .
' = %s ',
420 $ilDB->quote($a_pos,
'integer'),
421 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
427 if ($r->parent != $a_parent_id) {
436 if ($this->
getTree()->__isMainTree()) {
438 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
439 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
440 'rgt = CASE WHEN rgt > %s THEN rgt + 2 ELSE rgt END ',
441 $ilDB->quote($right,
'integer'),
442 $ilDB->quote($right,
'integer')
447 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
448 'lft = CASE WHEN lft > %s THEN lft + 2 ELSE lft END, ' .
449 'rgt = CASE WHEN rgt > %s THEN rgt + 2 ELSE rgt END ' .
450 'WHERE ' . $this->
getTree()->getTreePk() .
' = %s',
451 $ilDB->quote($right,
'integer'),
452 $ilDB->quote($right,
'integer'),
453 $ilDB->quote($this->getTree()->getTreeId(),
'integer')
463 $depth = $this->
getTree()->getDepth($a_parent_id) + 1;
467 'INSERT INTO ' . $this->
getTree()->getTreeTable() .
' (' . $this->
getTree()->getTreePk() .
',child,parent,lft,rgt,depth) ' .
468 'VALUES (%s,%s,%s,%s,%s,%s)',
469 $ilDB->quote($this->getTree()->getTreeId(),
'integer'),
470 $ilDB->quote($a_node_id,
'integer'),
471 $ilDB->quote($a_parent_id,
'integer'),
472 $ilDB->quote($lft,
'integer'),
473 $ilDB->quote($rgt,
'integer'),
474 $ilDB->quote($depth,
'integer')
479 if ($this->
getTree()->__isMainTree()) {
480 $ilAtomQuery =
$ilDB->buildAtomQuery();
481 $ilAtomQuery->addTableLock(
'tree');
482 $ilAtomQuery->addQueryCallable($insert_node_callable);
485 $insert_node_callable(
$ilDB);
505 $query =
'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
506 'WHERE child = ' .
$ilDB->quote($a_node_id,
'integer') .
' ' .
507 'AND ' . $this->
getTree()->getTreePk() .
' = ' .
$ilDB->quote($this->
getTree()->getTreeId(),
'integer');
513 'DELETE FROM ' . $this->
getTree()->getTreeTable() .
' ' .
514 'WHERE lft BETWEEN %s AND %s ' .
515 'AND rgt BETWEEN %s AND %s ' .
516 'AND ' . $this->
getTree()->getTreePk() .
' = %s',
517 $ilDB->quote($a_node[
'lft'],
'integer'),
518 $ilDB->quote($a_node[
'rgt'],
'integer'),
519 $ilDB->quote($a_node[
'lft'],
'integer'),
520 $ilDB->quote($a_node[
'rgt'],
'integer'),
521 $ilDB->quote($a_node[$this->getTree()->getTreePk()],
'integer')
529 $diff = $a_node[
"rgt"] - $a_node[
"lft"] + 1;
531 $a_node[$this->
getTree()->getTreePk()] >= 0 &&
532 $a_node[
'rgt'] - $a_node[
'lft'] >= $this->
getTree()->getGap() * 2
534 if ($this->
getTree()->__isMainTree()) {
536 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
537 'lft = CASE WHEN lft > %s THEN lft - %s ELSE lft END, ' .
538 'rgt = CASE WHEN rgt > %s THEN rgt - %s ELSE rgt END ',
539 $ilDB->quote($a_node[
'lft'],
'integer'),
540 $ilDB->quote($diff,
'integer'),
541 $ilDB->quote($a_node[
'lft'],
'integer'),
542 $ilDB->quote($diff,
'integer')
547 'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
548 'lft = CASE WHEN lft > %s THEN lft - %s ELSE lft END, ' .
549 'rgt = CASE WHEN rgt > %s THEN rgt - %s ELSE rgt END ' .
550 'WHERE ' . $this->
getTree()->getTreePk() .
' = %s ',
551 $ilDB->quote($a_node[
'lft'],
'integer'),
552 $ilDB->quote($diff,
'integer'),
553 $ilDB->quote($a_node[
'lft'],
'integer'),
554 $ilDB->quote($diff,
'integer'),
555 $ilDB->quote($a_node[$this->getTree()->getTreePk()],
'integer')
563 if ($this->
getTree()->__isMainTree()) {
564 $ilAtomQuery =
$ilDB->buildAtomQuery();
565 $ilAtomQuery->addTableLock(
'tree');
566 $ilAtomQuery->addQueryCallable($delete_tree_callable);
569 $delete_tree_callable(
$ilDB);
590 $node = $this->
getTree()->getNodeTreeData($a_node_id);
592 $query =
'UPDATE ' . $this->
getTree()->getTreeTable() .
' ' .
593 'SET tree = ' .
$ilDB->quote(-1 * $node[
'child'],
'integer') .
' ' .
594 'WHERE ' . $this->
getTree()->getTreePk() .
' = ' .
$ilDB->quote($this->
getTree()->getTreeId(),
'integer') .
' ' .
595 'AND lft BETWEEN ' .
$ilDB->quote($node[
'lft'],
'integer') .
' AND ' .
$ilDB->quote($node[
'rgt'],
'integer') .
' ';
602 if ($this->
getTree()->__isMainTree()) {
603 $ilAtomQuery =
$ilDB->buildAtomQuery();
604 $ilAtomQuery->addTableLock(
"tree");
606 $ilAtomQuery->addQueryCallable($move_to_trash_callable);
610 $move_to_trash_callable(
$ilDB);
636 $takeId = $a_startnode_id == 0;
638 $depth_cache = $this->
getTree()->getDepthCache();
639 $parent_cache = $this->
getTree()->getParentCache();
642 $this->
getTree()->__isMainTree() &&
643 isset($depth_cache[$a_endnode_id]) &&
644 isset($parent_cache[$a_endnode_id])) {
645 $nodeDepth = $depth_cache[$a_endnode_id];
646 $parentId = $parent_cache[$a_endnode_id];
648 $nodeDepth = $this->
getTree()->getDepth($a_endnode_id);
649 $parentId = $this->
getTree()->getParentId($a_endnode_id);
658 } elseif ($nodeDepth == 1) {
659 $takeId = $takeId || $a_endnode_id == $a_startnode_id;
661 $pathIds[] = $a_endnode_id;
663 } elseif ($nodeDepth == 2) {
664 $takeId = $takeId || $parentId == $a_startnode_id;
666 $pathIds[] = $parentId;
668 $takeId = $takeId || $a_endnode_id == $a_startnode_id;
670 $pathIds[] = $a_endnode_id;
672 } elseif ($nodeDepth == 3) {
673 $takeId = $takeId || $this->
getTree()->getRootId() == $a_startnode_id;
675 $pathIds[] = $this->
getTree()->getRootId();
677 $takeId = $takeId || $parentId == $a_startnode_id;
679 $pathIds[] = $parentId;
681 $takeId = $takeId || $a_endnode_id == $a_startnode_id;
683 $pathIds[] = $a_endnode_id;
685 } elseif ($nodeDepth < 32) {
695 $qSelect =
't1.child c0';
697 for (
$i = 1;
$i < $nodeDepth - 2;
$i++) {
698 $qSelect .=
', t' .
$i .
'.parent c' .
$i;
699 if ($this->
getTree()->__isMainTree()) {
700 $qJoin .=
' JOIN ' . $this->
getTree()->getTreeTable() .
' t' .
$i .
' ON ' .
701 't' .
$i .
'.child=t' . (
$i - 1) .
'.parent ';
703 $qJoin .=
' JOIN ' . $this->
getTree()->getTreeTable() .
' t' .
$i .
' ON ' .
704 't' .
$i .
'.child=t' . (
$i - 1) .
'.parent AND ' .
705 't' .
$i .
'.' . $this->
getTree()->getTreePk() .
' = ' . (int) $this->
getTree()->getTreeId();
710 if ($this->
getTree()->__isMainTree()) {
711 $types = array(
'integer');
712 $data = array($parentId);
713 $query =
'SELECT ' . $qSelect .
' ' .
714 'FROM ' . $this->
getTree()->getTreeTable() .
' t0 ' . $qJoin .
' ' .
715 'WHERE t0.child = %s ';
717 $types = array(
'integer',
'integer');
719 $query =
'SELECT ' . $qSelect .
' ' .
720 'FROM ' . $this->
getTree()->getTreeTable() .
' t0 ' . $qJoin .
' ' .
721 'WHERE t0.' . $this->
getTree()->getTreePk() .
' = %s ' .
722 'AND t0.child = %s ';
728 if (
$res->numRows() == 0) {
734 $takeId = $takeId || $this->
getTree()->getRootId() == $a_startnode_id;
736 $pathIds[] = $this->
getTree()->getRootId();
738 for (
$i = $nodeDepth - 4;
$i >= 0;
$i--) {
739 $takeId = $takeId || $row[
'c' .
$i] == $a_startnode_id;
741 $pathIds[] = $row[
'c' .
$i];
744 $takeId = $takeId || $parentId == $a_startnode_id;
746 $pathIds[] = $parentId;
748 $takeId = $takeId || $a_endnode_id == $a_startnode_id;
750 $pathIds[] = $a_endnode_id;
780 if ($this->
getTree()->__isMainTree()) {
781 $fields = array(
'integer');
782 $data = array($a_endnode_id);
783 $query =
"SELECT T2.child " .
784 "FROM " . $this->
getTree()->getTreeTable() .
" T1, " . $this->
getTree()->getTreeTable() .
" T2 " .
785 "WHERE T1.child = %s " .
786 "AND T1.lft BETWEEN T2.lft AND T2.rgt " .
789 $fields = array(
'integer',
'integer',
'integer');
791 $query =
"SELECT T2.child " .
792 "FROM " . $this->
getTree()->getTreeTable() .
" T1, " . $this->
getTree()->getTreeTable() .
" T2 " .
793 "WHERE T1.child = %s " .
794 "AND T1.lft BETWEEN T2.lft AND T2.rgt " .
795 "AND T1." . $this->
getTree()->getTreePk() .
" = %s " .
796 "AND T2." . $this->
getTree()->getTreePk() .
" = %s " .
802 $takeId = $a_startnode_id == 0;
804 if ($takeId || $row[
'child'] == $a_startnode_id) {
806 $pathIds[] = $row[
'child'];
809 return $pathIds ? $pathIds : array();
821 public function moveTree($a_source_id, $a_target_id, $a_position)
827 $move_tree_callable =
function (
ilDBInterface $ilDB) use ($a_source_id, $a_target_id, $a_position) {
829 $query =
'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
830 'WHERE ( child = %s OR child = %s ) ' .
831 'AND ' . $this->
getTree()->getTreePk() .
' = %s ';
832 $res =
$ilDB->queryF(
$query, array(
'integer',
'integer',
'integer'), array(
835 $this->
getTree()->getTreeId()));
838 if (
$res->numRows() != 2) {
840 throw new InvalidArgumentException(
'Error moving subtree');
842 while ($row =
$ilDB->fetchObject(
$res)) {
843 if ($row->child == $a_source_id) {
844 $source_lft = $row->lft;
845 $source_rgt = $row->rgt;
846 $source_depth = $row->depth;
847 $source_parent = $row->parent;
849 $target_lft = $row->lft;
850 $target_rgt = $row->rgt;
851 $target_depth = $row->depth;
856 if ($target_lft >= $source_lft and $target_rgt <= $source_rgt) {
858 throw new InvalidArgumentException(
'Error moving subtree: target is child of source');
863 $spread_diff = $source_rgt - $source_lft + 1;
864 #var_dump("<pre>","SPREAD_DIFF: ",$spread_diff,"<pre>");
866 $query =
'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
867 'lft = CASE WHEN lft > %s THEN lft + %s ELSE lft END, ' .
868 'rgt = CASE WHEN rgt >= %s THEN rgt + %s ELSE rgt END ';
870 if ($this->
getTree()->__isMainTree()) {
871 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer'), [
878 $query .= (
'WHERE ' . $this->
getTree()->getTreePk() .
' = %s ');
879 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer',
'integer'), array(
884 $this->
getTree()->getTreeId()));
890 if ($source_lft > $target_rgt) {
891 $where_offset = $spread_diff;
892 $move_diff = $target_rgt - $source_lft - $spread_diff;
895 $move_diff = $target_rgt - $source_lft;
897 $depth_diff = $target_depth - $source_depth + 1;
900 $query =
'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
901 'parent = CASE WHEN parent = %s THEN %s ELSE parent END, ' .
904 'depth = depth + %s ' .
908 if ($this->
getTree()->__isMainTree()) {
909 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'integer'), [
915 $source_lft + $where_offset,
916 $source_rgt + $where_offset
920 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'integer'), array(
926 $source_lft + $where_offset,
927 $source_rgt + $where_offset,
928 $this->
getTree()->getTreeId()));
933 $query =
'UPDATE ' . $this->
getTree()->getTreeTable() .
' SET ' .
934 'lft = CASE WHEN lft >= %s THEN lft - %s ELSE lft END, ' .
935 'rgt = CASE WHEN rgt >= %s THEN rgt - %s ELSE rgt END ' ;
937 if ($this->
getTree()->__isMainTree()) {
938 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer'), [
939 $source_lft + $where_offset,
941 $source_rgt + $where_offset,
945 $query .= (
'WHERE ' . $this->
getTree()->getTreePk() .
' = %s ');
947 $res =
$ilDB->manipulateF(
$query, array(
'integer',
'integer',
'integer',
'integer',
'integer'), array(
948 $source_lft + $where_offset,
950 $source_rgt + $where_offset,
952 $this->
getTree()->getTreeId()));
957 if ($this->
getTree()->__isMainTree()) {
958 $ilAtomQuery =
$ilDB->buildAtomQuery();
959 $ilAtomQuery->addTableLock(
'tree');
960 $ilAtomQuery->addQueryCallable($move_tree_callable);
963 $move_tree_callable(
$ilDB);
979 $query =
"SELECT t2.lft lft, t2.rgt rgt, t2.child child, type " .
980 "FROM " . $this->
getTree()->getTreeTable() .
" t1 " .
981 "JOIN " . $this->
getTree()->getTreeTable() .
" t2 ON (t2.lft BETWEEN t1.lft AND t1.rgt) " .
982 "JOIN " . $this->
getTree()->getTableReference() .
" obr ON t2.child = obr.ref_id " .
983 "JOIN " . $this->
getTree()->getObjectDataTable() .
" obd ON obr.obj_id = obd.obj_id " .
984 "WHERE t1.child = " .
$ilDB->quote($a_endnode_id,
'integer') .
" " .
985 "AND t1." . $this->
getTree()->getTreePk() .
" = " .
$ilDB->quote($this->
getTree()->getTreeId(),
'integer') .
" " .
986 "AND t2." . $this->
getTree()->getTreePk() .
" = " .
$ilDB->quote($this->
getTree()->getTreeId(),
'integer') .
" " .
993 $nodes[$row->child][
'lft'] = $row->lft;
994 $nodes[$row->child][
'rgt'] = $row->rgt;
995 $nodes[$row->child][
'child'] = $row->child;
996 $nodes[$row->child][
'type'] = $row->type;
998 return (array) $nodes;
1010 $query =
'select child from ' . $this->
getTree()->getTreeTable() .
' child where not exists ' .
1012 'select child from ' . $this->
getTree()->getTreeTable() .
' parent where child.parent = parent.child and (parent.lft < child.lft) and (parent.rgt > child.rgt) ' .
1014 'and ' . $this->
getTree()->getTreePk() .
' = ' . $this->
getTree()->getTreeId() .
' and child <> 1';
1017 $failures = array();
1019 $failures[] = $row[$this->
getTree()->getTreePk()];
An exception for terminatinating execution or to throw for unit testing.
Thrown if invalid tree strucutes are found.
static getLogger($a_component_id)
Get component logger.
Base class for nested set path based trees.
moveToTrash($a_node_id)
Move to trash.
getRelation($a_node_a, $a_node_b)
Get relation.
insertNode($a_node_id, $a_parent_id, $a_pos)
Insert tree node.
getPathIds($a_endnode, $a_startnode=0)
Get path ids.
getTree()
Get tree object.
getTrashSubTreeQuery($a_node, $a_types, $a_force_join_reference=true, $a_fields=[])
Get subtree query for trashed tree items.mixed
deleteTree($a_node_id)
Delete a subtree.
getSubTreeQuery($a_node, $a_types='', $a_force_join_reference=true, $a_fields=array())
Get subtree.
moveTree($a_source_id, $a_target_id, $a_position)
Move source subtree to target.
getPathIdsUsingAdjacencyMap($a_endnode_id, $a_startnode_id=0)
get path from a given startnode to a given endnode if startnode is not given the rootnode is startnod...
__construct(ilTree $a_tree)
Constructor.
getSubtreeInfo($a_endnode_id)
Get rbac subtree info @global type $ilDB.
getPathIdsUsingNestedSets($a_endnode_id, $a_startnode_id=0)
get path from a given startnode to a given endnode if startnode is not given the rootnode is startnod...
validateParentRelations()
Validate the parent relations of the tree implementation For nested set, validate the lft,...
getSubTreeIds($a_node_id)
Get subtree ids.
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
Interface for tree implementations Currrently nested set or materialize path.
foreach($_POST as $key=> $value) $res