Инструкция =>
Инструкция => - создание следствия.
Синтаксис
leftPropertyId(param1, ..., paramN) => [eventClause] rightExpr [RESOLVE [LEFT] [RIGHT]];
Описание
Инструкция => создает следствие. Этот оператор может объявлять свои локальные параметры при задании свойства посылки следствия. Затем эти параметры могут быть использованы в выражении следствия.
При создании следствия будет создано ограничение, которое во многом будет эквивалентно следующей инструкции
CONSTRAINT eventClause leftPropertyId(param1, ..., paramN) AND NOT rightExpr MESSAGE 'Нарушено следствие';
но при этом позволяет автоматически разрешать ситуации нарушения этого ограничения. Так использование опции LEFT в RESOLVE будет эквивалентно созданию простого события:
WHEN eventClause SET(leftPropertyId(param1, ..., paramN)) DO
SETACTION(rightExpr);
Опция RIGHT, соответственно:
WHEN eventClause DROPPED(rightExpr) DO
DROPACTION(leftPropertyId(param1, ..., paramN));
Параметры
-
leftPropertyIdИдентификатор свойства, задающего посылку следствия.
-
param1, ..., paramNСписок параметров свойства, задающего посылку следствия. Количество этих параметров должно совпадать с количеством параметров свойства.
-
rightExprВыражение, значение которого определяет следствие.
-
LEFTВключает автоматическое разрешение следствия: если посылка (левая часть инструкции) изменяется на не
NULL, то следствие изменяется на неNULL. -
RIGHTВключает автоматическое разрешение следствия: если следствие (правая часть инструкции) изменяется на
NULL, то посылка изменяется наNULL. -
eventClauseБлок описания события. Описывает событие, при наступлении которого будет проверяться создаваемое следствие и выполняться операции автоматического разрешения. Если не указан, используется глобальное событие
APPLY.
Примеры
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;