-
Notifications
You must be signed in to change notification settings - Fork 9
tree_sort
do- edited this page Jan 21, 2018
·
1 revision
Иерархическая сортировка заданного списка:
- каждый элемент-предок предшествует своему поддереву;
- порядок элементов с общим предком остаётся без изменения.
- id
- уникальный номер записи;
- parent
- уникальный номер предка.
- ord_local
- порядок данной записи среди множества записей с общим предком;
- ord
- порядок записи сводящий алфавитное упорядочение к иерархическому (конкатенация ord_local для корня, прародителя,... родителя и текущей записи);
- level
- уровень текущей записи в дереве.
Значения ord числовые, дополненные нулями слева таким образом, чтобы все ord в одной выборке имели одинаковую длину. Соответственно, арифметический порядок для них совпадает с алфавитным (лидирующий нуль НЕ является признаком восьмеричной системы счисления). Для каждой записи $i выполняется равенство
length ($i -> {ord}) == ($i -> {level} + 1) * length ($i -> {local})
my $rubrics = tree_sort (
[[sql_select_all]] ('SELECT id, parent, label FROM rubrics WHERE[[Поле fake. Недосозданные (фиктивные) записи | fake]] = 0 ORDER BY label')
);
my $rubrics = tree_sort (
[[sql_select_all]] ('SELECT id, parent, label FROM rubrics WHERE[[Поле fake. Недосозданные (фиктивные) записи | fake]] = 0 ORDER BY label'),
{
id => 'id',
parent => 'parent',
ord_local => '__ord_local',
ord => '__ord',
level => '__level',
},
); ## тот же результат, но другие имена дополнительных полей