4 include_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();
76 $ilDB = $DIC->database();
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())
124 $ilDB = $DIC[
'ilDB'];
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']) {
209 $ilDB = $DIC[
'ilDB'];
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'),
225 $r =
$ilDB->fetchObject($res);
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'),
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'),
272 $r =
$ilDB->fetchAssoc($res);
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')
298 $r =
$ilDB->fetchAssoc($res);
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'),
308 $r =
$ilDB->fetchAssoc($res);
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'),
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'),
376 $r =
$ilDB->fetchObject($res);
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'),
417 'SELECT * FROM ' . $this->
getTree()->getTreeTable() .
' ' .
418 'WHERE child = %s ' .
419 'AND ' . $this->
getTree()->getTreePk() .
' = %s ',
420 $ilDB->quote($a_pos,
'integer'),
424 $r =
$ilDB->fetchObject($res);
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'),
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);
499 $ilDB = $DIC[
'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);
587 $ilDB = $DIC[
'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);
629 $ilDB = $DIC[
'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;
771 $ilDB = $DIC[
'ilDB'];
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)
825 $ilDB = $DIC[
'ilDB'];
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) {
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) {
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);
977 $ilDB = $DIC[
'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;
1008 $ilDB = $DIC[
'ilDB'];
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()];
Thrown if invalid tree strucutes are found.
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...
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...
getPathIds($a_endnode, $a_startnode=0)
Get path ids.
getRelation($a_node_a, $a_node_b)
Get relation.
getSubTreeIds($a_node_id)
Get subtree ids.
getTree()
Get tree object.
Base class for nested set path based trees.
moveTree($a_source_id, $a_target_id, $a_position)
Move source subtree to target.
getTrashSubTreeQuery($a_node, $a_types, $a_force_join_reference=true, $a_fields=[])
Get subtree query for trashed tree items.mixed
insertNode($a_node_id, $a_parent_id, $a_pos)
Insert tree node.
foreach($_POST as $key=> $value) $res
__construct(ilTree $a_tree)
Constructor.
getSubtreeInfo($a_endnode_id)
Get rbac subtree info type $ilDB.
deleteTree($a_node_id)
Delete a subtree.
getSubTreeQuery($a_node, $a_types='', $a_force_join_reference=true, $a_fields=array())
Get subtree.
validateParentRelations()
Validate the parent relations of the tree implementation For nested set, validate the lft...
static getLogger($a_component_id)
Get component logger.
moveToTrash($a_node_id)
Move to trash.
Interface for tree implementations Currrently nested set or materialize path.