Даноны, есть один алгоритм ЕОАИ этому алгоритму имя Nested setДля чего он, я думаю знают многие, если не знают погуглите, для общего представления. Но у меня конкретный вопрос, который уже проел мне мозг, т.к В большинстве случаев источников информации об этом алгоритме, написаны статьи, в которых нигде толком не указаны способы редактирования иерархии дерева, если и есть, то отведенный параграф для этой задачи описан крайне мутно, В чем собственно вопрос, вопрос о сдвиге ключей, в левую и правую часть, в зависимости от ситуации, куда перемещается узел или ветка в дереве.Для перемещения одного узла в другой узел, без потомков, все куда проще, но когда дело доходит о перемещении ветки в ветку, вот тут начинается батхерт, лютый.И так, анонамус, решим задачу здесь, и закрепим тред, по всем вопросам возникшим об таком алгоритме хранения деревьев в базах данных - sql как Nested set.Для наглядности освящаю пик для понимания вложенных множеств
Анон доставляет. Надеюсь разберещся. Там нужно переписать часть кода, где юзается mysql. Мож на недели найдется время и я перепишу и выложу. Вообщем-то играйся.https://gist.github.com/catsAND/f706356b50fe7a10b52219656b2725b8
>>897446Благодарю, будь подписан на этот тред, буду задавать вопросы, разберём всё подробно, и хоть где-то будет нормальная статья об этом алгоритме во всем рунете
Я в гист комментарием добавил create базы, если что.
>>897520Так весь код валидно работал?Просто у меня сомнения по поводу метода moveBranchа именно вот выражение:$delta2 = $rgt - $node['LEFT'] + 1; ведь получается отрицательное число, что в первом что во втором случае:$delta2 = $rgt - $node['LEFT'] + 1 - $delta1;По идее родительский $rgt будет ВСЕГДА меньше чем $node['LEFT'] если узел/ветка перемещается влево, может кто пояснить, что я не так понял?
Когда я его давно тестил - был валидный.>ведь получается отрицательное число,Почему отрицательное? Мы переносим ведь в родительской ветке. Right всегда больше чем left.
>>898179Хорошо, ну вот смотри, красным выделена ветка которая перемещается, зеленым выделена ветка куда мы перемещаем краснуюв приведенном примере кода который выше>>897970 переменная $rgt это правая граница нового родителя, в данном случае на новом изображении я указал что зеленым выделен новый родитель, а красный, это перемещаемый, получается чтоКонкретно в этом случае как на изображении этого поста $node['LEFT'] равен 9А $rgt равен $rgt = $parent['RIGHT'] - 1; то есть 6$delta2 = $rgt - $node['LEFT'] + 1;6-9+1вот про что я имею ввиду, результат будет отрицательным
>>898423Да, теперь понял. Я с утра протестирую этот случай и отпишусь.
Погоди, а этот rgt же может быть отрицательным. И это значит что всем кто больше этого rgt, но меньше чем левая сторона переносимой ноды, мы обновляем правую и левую часть добавляя дельту. Или я щас уже чтото путаю?
>>898468>И это значит что всем кто больше этого rgtвсем кто больше отрицательного числа?Дельта2 это как раз те числа, которые в итоге должны либо уменьшить либо прибавить в зависимости от случая переноса в перемещаемой ветке
>>898468потому что далее следует запрос $this->DB->query("UPDATE `" . $this->table . "` SET `LEFT` = `LEFT` + ?i, `RIGHT` = `RIGHT` + ?i, `LEVEL` = `LEVEL` + ?i WHERE `ID` IN (?a)", $delta2, $delta2, $lvl_delta, $id_edit);