Skip to content

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',
  },
 ); ## тот же результат, но другие имена дополнительных полей

Clone this wiki locally