Перейти к основному содержимому
Version: 4.x

Простые ограничения

В платформе на данный момент поддерживается четыре типа простых ограничений : следствие, исключение, равенство, определенность. Для всех простых ограничений поддерживается механизм автоматического разрешения, при включении которого, платформа вместо выдачи ошибки, сама приводит систему в целостное состояние.

СледствиеИсключениеРавенствоОпределенность
Количество свойств22...N21
ОписаниеЕсли значение одного свойства (посылка) не NULL, то значение второго свойства (следствие) также должно быть не NULLТолько одно из значений заданных свойств должно быть не NULLЕсли значение одного свойство не NULL и значение второго свойства не NULL, то они должны быть равныЕсли все параметры свойства подходят по классам, то для них должно быть задано не NULL значение
Инструкция=>Пока не реализованоПока не реализованоОпция NONULL в задании свойств
Автоматическое разрешениеПоддерживаются два режима:

LEFT - если посылка изменяется на не NULL, то изменить* следствие на не NULL

RIGHT - если следствие изменяется на NULL, то изменить посылку на NULL
Если одно из свойств изменяется на не NULL, изменить остальные на NULLЕсли одно из свойств изменяется на не NULL значение, изменить второе на это же значениеAGGR - если значение свойства изменяется на NULL, удалить объекты соответствующие параметрам.

DEFAULT значение - если добавляются (доклассифицируются) объекты соответствующие классам параметров, изменить значение свойства для этих объектов на значение по умолчанию.

* Под изменением на NULL / не NULL понимается:

  • Для первичного свойства - запись NULL или значения по умолчанию для класса значения этого свойства.
  • Для принадлежности классу - удаление объекта / добавление объекта класса, для которого проверяется принадлежность.
  • Для агрегирующего оператора - (только если изменение на не NULL) добавление объекта базового класса (System.Object), изменение на не NULL условия агрегирующего оператора, запись во все значения группировок значений соответствующих параметров.

Также как и для обычного ограничения, для каждого простого ограничения необходимо задать базовое событие, которое определяет когда будет проверяться заданное ограничение.

Отметим что ограничение определенности является частным случаем следствия, у которого следствием является свойство, которое должно быть определено, а посылкой является его сигнатура (свойство полученное из него при помощи соответствующего оператора).

Также существует неявный пятый вид простых ограничений - уникальность, но он совмещен с агрегирующим оператором (который получает это самое уникальное значение), поэтому здесь не рассматривается. Вместе со следствиями этот вид ограничений позволяет реализовывать механизм агрегаций.

Примеры

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;