Инструкция =>
Инструкция => - создание следствия.
Синтаксис
leftPropertyId(param1, ..., paramN) => eventClause rightExpr [RESOLVE resolveType];
Описание
Инструкция => создает следствие. Этот оператор может объявлять свои локальные параметры при задании свойства посылки следствия. Затем эти параметры могут быть использованы в выражении следствия.
При создании следствия будет создано ограничение, которое во многом будет эквивалентно следующей инструкции
CONSTRAINT eventClause leftPropertyId(param1, ..., paramN) AND NOT rightExpr MESSAGE 'Нарушено следствие';
но при этом позволяет автоматически разрешать ситуации нарушения этого ограничения. Так тип разрешения RESOLVE LEFT будет эквивалентен созданию простого события:
WHEN eventClause SET(leftPropertyId(param1, ..., paramN)) DO
SETACTION(rightExpr);
А RESOLVE RIGHT соответственно:
WHEN eventClause DROPPED(rightExpr) DO
DROPACTION(leftPropertyId(param1, ..., paramN));
Параметры
-
leftPropertyIdИдентификатор свойства, задающего посылку следствия.
-
param1, ..., paramNСписок параметров свойства, задающего посылку следствия. Количество этих параметров должно совпадать с количеством параметров свойства.
-
rightExprВыражение, значение которого определяет следствие.
-
resolveTypeТип автоматического разрешения при нарушении следствия. Задается одним из следующих вариантов:
LEFT- если посылка (левая часть инструкции) изменяется на неNULL, то следствие изменяется на неNULL.RIGHT- если следствие (правая часть инструкции) изменяется наNULL, то посылка изменяется наNULL.LEFT RIGHT- аналогичноLEFTиRIGHTвместе.
-
eventClauseБлок описания события. Описывает событие, при наступлении которого будет проверяться создаваемое следствие и выполняться операции автоматического разрешения.
Примеры
is(Sku s) = s IS Sku;
// для товара должны быть заданы штрих-код и наименование
is(Sku s) => barcode(s);
is(Sku s) => name(s);
CLASS Invoice;
CLASS InvoiceLine;
invoice = DATA Invoice (InvoiceLine);
is(InvoiceLine l) = l IS InvoiceLine;
// для строки документа должен быть задан документ, и при удалении документа, чтобы удалялись строки этого документа
is(InvoiceLine l) => invoice(l) RESOLVE RIGHT;
// равносильно объявлению document = DATA Invoice (InvoiceLine) NONULL DELETE;
// агрегация для f(a,b) создавать объект класса x, у которого свойство a(x) равняется a, а свойство b(x) равняется b
CLASS A;
CLASS B;
f = DATA BOOLEAN (A, B);
CLASS X;
a = DATA A(X);
b = DATA B(X);
is (X x) = x IS X;
f(a,b) => [ GROUP AGGR X x WHERE x IS X BY a(x), b(x)](a,b) RESOLVE LEFT;
is(X x) => f(a(x), b(x)) RESOLVE RIGHT;