Агрегации
Под агрегацией понимается создание уникального (агрегируемого) объекта соответствующего каждому не NULL значению некоторого агрегируемого свойства. Для такого объекта предполагается наличие свойств, которые отображают этот объект на каждый из параметров агрегируемого свойства, и наличие свойства, которое, наоборот, отображает параметры агрегируемого свойства на этот объект.
Агрегируемый объект и каждый параметр агрегируемого свойства должны принадлежать некоторому заданному классу.
Механизм агрегации работает на основе трёх событий:
- Базовое событие — событие проверки согласованности: платформа проверяет, что для каждого не
NULLзначения агрегируемого свойства существует соответствующий агрегируемый объект, и наоборот. - Событие создания — событие разрешения: когда агрегируемое свойство становится не
NULLи агрегируемый объект отсутствует, платформа его создаёт и заполняет свойства значениями параметров. - Событие удаления — событие разрешения: когда агрегируемое свойство становится
NULLи агрегируемый объект ещё существует, платформа его удаляет.
В конкретной агрегации все три события могут совпадать, а события создания и удаления могут отличаться и от базового события, и друг от друга.
Язык
Для создания агрегаций используется оператор AGGR.
Примеры
CLASS A; CLASS B; CLASS C;
f = DATA INTEGER (A, B);
c = AGGR C WHERE f(A a, B b) MATERIALIZED INDEXED;
CLASS AB;
ab = AGGR AB WHERE A a IS A AND B b IS B; // для каждой пары A B создает объект AB
CLASS Shipment 'Поставка';
date = ABSTRACT DATE (Shipment);
CLASS Invoice 'Инвойс';
createShipment 'Создавать поставку' = DATA BOOLEAN (Invoice);
date 'Дата накладной' = DATA DATE (Invoice);
CLASS ShipmentInvoice 'Поставка по инвойсу' : Shipment;
// создаем поставку по инвойсу, если для инвойса задана опция создавать поставку
shipment(Invoice invoice) = AGGR ShipmentInvoice WHERE createShipment(invoice);
date(ShipmentInvoice si) += sum(date(invoice(si)),1); // дата поставки = дата инвойса + 1