Оператор AGGR
Оператор AGGR - создание агрегации.
Синтаксис
AGGR [eventClause] aggrClass WHERE aggrExpr [NEW [newEventClause]] [DELETE [deleteEventClause]]
Описание
Помимо свойства — результата оператора, содержащего значение агрегируемого объекта, — оператор AGGR для каждого параметра создаёт первичное свойство с одним параметром типа aggrClass. Имя и класс значения этого свойства совпадают с именем и классом соответствующего параметра; при создании агрегируемого объекта в него автоматически записывается значение параметра.
eventClause задаёт базовое событие проверки; NEW и DELETE — события разрешения для создания и удаления агрегируемых объектов соответственно.
В отличие от других контекстно-зависимых операторов, оператор AGGR нельзя использовать в выражениях внутри других операторов (в этом смысле он больше похож на контекстно-независимые операторы), а также в операторе JOIN (внутри [= ])
Параметры
-
eventClauseБлок описания события. Базовое событие проверки. По умолчанию — глобальное
APPLY. -
aggrClassКласс значения агрегируемого объекта. Составной идентификатор. Должен быть пользовательским классом; встроенные классы не допускаются.
-
aggrExprВыражение, не-
NULLзначения которого задают агрегацию; его типизированные параметры определяют параметры свойства-результата и автоматически создаваемых свойств для каждого параметра. -
NEWКлючевое слово. Задаёт событие разрешения для создания агрегируемых объектов.
-
newEventClauseБлок описания события. Если
NEWне указан, событие разрешения наследует отeventClauseтолько область видимости (GLOBAL/LOCAL); егоFORMS,AFTER/GOAFTERи имя события не переносятся. ЕслиNEWуказан без блока — используется глобальноеAPPLY. -
DELETEКлючевое слово. Задаёт событие разрешения для удаления агрегируемых объектов.
-
deleteEventClauseБлок описания события. Если
DELETEне указан, событие разрешения наследует отeventClauseтолько область видимости (GLOBAL/LOCAL); егоFORMS,AFTER/GOAFTERи имя события не переносятся. ЕслиDELETEуказан без блока — используется глобальноеAPPLY.
Примеры
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
// базовое LOCAL-событие: все три события выполняются в рамках сессии
sessionAggr(Invoice invoice) = AGGR LOCAL ShipmentInvoice WHERE createShipment(invoice);
// явный блок события NEW: создание выполняется локально, удаление наследует базовое (глобальное) событие
newLocalAggr(Invoice invoice) = AGGR ShipmentInvoice WHERE createShipment(invoice) NEW LOCAL;
// раздельные события: создание — глобально (пустой блок NEW трактуется как APPLY), удаление — локально
splitAggr(Invoice invoice) = AGGR ShipmentInvoice WHERE createShipment(invoice) NEW DELETE LOCAL;