How-to: Переопределение значений
Часто возникают задачи, когда необходимо предоставить пользователю возможность вводить значение некоторого атрибута, уточняя затем его для более детального объекта.
Рассмотрим случай, когда для книги нужно определить торговую надбавку. При этом определена логика категорий, которые образуют дерево путем задания для каждой категории своего родителя. Пользователь должен иметь возможность задать надбавку как для товара, так и для категории на любом уровне.
Определим логику категорий и первичное свойство надбавки для категории.
CLASS Category 'Категория';
name 'Наименование' = DATA ISTRING[50] (Category) IN id;
parent 'Родитель' = DATA Category (Category) AUTOSET;
nameParent 'Родитель' (Category c) = name(parent(c)) IN id;
markup 'Надбавка' = DATA NUMERIC[8,2] (Category);
Используя оператор RECURSION
для любых двух категорий посчитаем свойство 'Уровень'
, которое будет равно двойке возведенной в степень расстояния между ними.
level 'Уровень' (Category child, Category parent) = RECURSION 1l IF child IS Category AND parent == child
STEP 2l IF parent == parent($parent) MATERIALIZED;
Построим свойство, которое будет по категории и уровню определять соответствующего родителя.
parent (Category child, LONG level) = GROUP MAX Category parent
BY level(child, parent);
Находим минимальный уровень категории, для которой задана надбавка. Он же будет уровнем "ближайшей вверх" категории с заданной надбавкой.
nearestGroupLevel 'Ближайший уровень, для которого задана надбавка' (Category child) =
GROUP MIN level(child, Category parent) IF markup(parent);