Перейти к основному содержимому
Версия: 5.x

Агрегации

Под агрегацией понимается создание уникального (агрегируемого) объекта соответствующего каждому не 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