Инструкция =>
Инструкция =>
- создание следствия.
Синтаксис
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;