yii-treemp - поведение AcriveRecord работы с деревом

Выкладываем свои наработки
Ответить
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

yii-treemp - поведение AcriveRecord работы с деревом

Сообщение wartur »

Здравствуйте...

Недавно потребовалось сделать возможность работы с деревом. Среди алгоритмов-структур подметил "Вложенное множество" и "Материализованный путь". Вложенное множество как вы знаете грустный алгоритм в плане вставки. Материализованный путь будет получше на смешанных операциях. В общем мне нужен был материализованный путь и к сожалению нормальной реализации я не нашел, было что-то совсем невнятное.

Пришлось сделать свою версию. Встречайте:
http://www.yiiframework.com/extension/y ... -behavior/

Я старался написать расширение добротно и покрыл его тестами. Если хотите что-то добавить, то можете не париться что-нибудь сломать, скорее всего тесты это отловят.
Спасибо за внимание.
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение wartur »

Здравствуйте. Выпустил вторую v2.0.1 версию библиотеки, многое отрефакторил. Добавил демо. Добавил виджетов. Улучил скорость. Покрытие тестами сделал выше. Сделал русскую и английскую документацию.

Если требуется решить задачу с хранением дерева. Добро пожаловать.

Релиз для Yii1 последний. Далее буду портировать на Yii2
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

Дорабатывал это расширение в одном проекте. Не хватало сортировки записей.
Т.е. в ветку с 20 записями добавляю новую. Она становится 21. А затем нужно ее сделать 3...
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение wartur »

Согласен. В этой части алгоритм Nested чутка выигрывает. Я в Yii2 хочу выпустить версию с поддержкой сортировки от расширения http://www.yiiframework.com/extension/yii-sorter/. Получится 2 самых быстрых алгоритма работы. Кроме того добавлю виджет редактирования дерева с перемещением. Я где-то его видел, я его в конце концов хочу заимплементить в расширение.
Последний раз редактировалось wartur 2015.01.12, 14:33, всего редактировалось 1 раз.
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение wartur »

Loveorigami писал(а):Дорабатывал это расширение в одном проекте. Не хватало сортировки записей.
Т.е. в ветку с 20 записями добавляю новую. Она становится 21. А затем нужно ее сделать 3...
Я надеюсь вам помогло поле $sequenceOrder в поведении.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

Нет...
У меня path выполняет функцию order. Для того, чтобы одним простым запросом отсортировать записи в гриде и оформить в виде наглядного дерева с отступами.
mp.jpg
mp.jpg (72.74 КБ) 7678 просмотров
При перемещении узла (иконки со стрелочками) просто пересчитывал path для ветки.
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение wartur »

Loveorigami писал(а):Нет...
У меня path выполняет функцию order. Для того, чтобы одним простым запросом отсортировать записи в гриде и оформить в виде наглядного дерева с отступами.
При перемещении узла (иконки со стрелочками) просто пересчитывал path для ветки.
Ааа. Понятно.
Я от того, что бы path сортировал специально уходил. Я считаю это не верным. Алгоритм сортировки должен быть отдельно, а path отдельно. Иначе получается смешение функциональности и пропадает некоторое удобство пользования материализованным путем. Например материализованный путь в моей реализации может знать все узлы до первого. Во второй версии библиотеки я добавил метод, который позволяет извлекать модели от текущего до корня, что может позволить быстро строить бредкамп.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

У меня функциональность MP ничем не отличается от той, что присуща MP.
Единственное, что - сортирую по path и делаю отступ, кратный количеству символов в path.
Очень наглядно потом видно все ветки в админке.
А если отдельным полем делать сортировку, то по сути, она будет повторять path, при этом вносить путаницу при выводе дочерних элементов с отступами (как на рис выше).
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение zelenin »

Loveorigami писал(а): Единственное, что - сортирую по path и делаю отступ, кратный количеству символов в path.
каким образом идет сортировка? не вижу на скрине разделителя путей (обычно через точку 005.001.003).
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

Разделитель есть, просто он пустой на примере. за условный разделитель принято 3 символа. Хотел, чтобы поле было числовым, а не varchar (с точкой).
Сортировка идет order by path ASC
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение zelenin »

Loveorigami писал(а):Разделитель есть, просто он пустой на примере. за условный разделитель принято 3 символа. Хотел, чтобы поле было числовым, а не varchar.
Сортировка идет order by path ASC
если категорий станет тысяча, тушим свет?
сам делал на неделе сортировку дерева на основе http://dbushell.github.io/Nestable/ и было бы интересно найти лучшую практику. Но ваш метод, имхо, не очень гибок.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
Последний раз редактировалось Loveorigami 2015.01.25, 16:15, всего редактировалось 2 раза.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение zelenin »

Loveorigami писал(а):Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
ну это понятно. костыль для костыля.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

zelenin писал(а):
Loveorigami писал(а):Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
ну это понятно. костыль для костыля.
Да, но первоочередная задача ставилась - сделать вложенность записей в gridView. Толковых решений для Nested или Adjency List не нашел. Выбрал MP и доделал сортировку по пути.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

zelenin писал(а): если категорий станет тысяча, тушим свет?
Точнее - 1000 одного уровня. У каждого родителя может быть своя условно 1000 детей...

Для моей задачи 1000 хватает с головой и выше )
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение zelenin »

Loveorigami писал(а): Да, но первоочередная задача ставилась - сделать вложенность записей в gridView. Толковых решений для Nested или Adjency List не нашел. Выбрал MP и доделал сортировку по пути.
грид легко - поменял соседние строки, пересчитал и все.
я решил сделать произвольную сортировку, поэтому искал наиболее комплексный подход.
Сейчас у меня в разделе около сотни категорий и дело можно решить тупым перебором/пересбором дерева.
Но в другом разделе у меня категорий тысячи, поэтому необходимо бескостыльное решение.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: yii-treemp - поведение AcriveRecord работы с деревом

Сообщение Loveorigami »

В таком случае - выше предлагался интересный вариант сортировки (на разряженных массивах, как пишет сам автор).
http://www.yiiframework.com/extension/yii-sorter/

https://github.com/wartur/yii-sorter/bl ... ITHM.ru.md
Ответить