События
События - это механизм, позволяющий в определенные моменты времени выполнять те или иные действия (эти действия будем называть обработками событий).
Типы событий
События бывают двух типов:
- Синхронные - происходят непосредственно после изменения данных.
- Асинхронные - происходят в произвольные моменты времени по мере того, как сервер успевает выполнить все заданные обработки и / или по истечению некоторого периода времени.
В свою очередь, с точки зрения области видимости изменений, события можно разделить на:
- Локальные - происходят локально для каждой сессии изменений.
- Глобальные - происходят глобально для всей базы данных.
Таким образом, события могут быть синхронными локальными, синхронными глобальными, асинхронными локальными и асинхронными глобальными. Отметим, что по умолчанию глоба льные события - синхронные, а локальные - асинхронные (как самые часто используемые комбинации). Также, по умолчанию, все события глобальные.
Преимущества синхронных событий:
- При необходимости в обработках можно выполнять отмену изменений, если, например, эти изменения не удовлетворяют необходимым условиям.
- Они гарантируют большую целостность, так как после окончания записи изменений пользователь гарантированно будет работать уже с обновленными данными.
Преимущества асинхронных событий:
- Можно сразу отпустить пользователя, а обработки выполнять "на фоне". Это улучшает эргономику системы, правда, возможно, только когда обновление данных не критично для дальнейшей работы пользователя (для глобальных событий, например, в течение ближайших 5-10 минут, пока сервер не успеет выполнить очередной цикл обработок).
- Обработки группируются для большого количества изменений, в том числе сделанных различными пользователями (в случае глобальных событий), и, соответственно, выполняются меньшее число раз, тем самым улучшая общую производительность системы.
Преимущества локальных событий:
- Пользователь сразу видит результаты обработок событий, а не только после того, как он сохранил их в общую базу.
Преимущества глобальных событий:
- Обеспечивают лучшую производительность и целостность, как за счет того, что обработки выполняются только после сохранения изменений в общую базу (то есть существенно реже), так и за счет использования многочисленных возможностей СУБД, связанных с работой с транзакциями.
Также в платформе существует возможность дополнительно указать, что событие будет происходить, только если сессия изменений принадлежит одной из заданных форм. Если этого не сделано, то необходимо учитывать, что большинство описанных событий происходят очень часто, поэтому их обработки не должны иметь последействия (например, выдавать сообщения) при отсутствии изменений в сессии. В идеале события должны быть простыми, а использоваться в общем случае только для оптимизации выполнения действительно сложных случаев.
Событийный режим операторов изменений
При выполнении обработки событий можно использовать специальный режим работы оператора предыдущего значения свойства (будем называть его событийным). В этом режиме оператор предыдущего значения будет возвращать значения свойства не на момент начала сессии, а на момент предыдущего возникновения этого события (а точнее, окончания выполнения всех его обработок). Аналогичный режим поддерживается для всех операторов изменений.
Событийный режим также поддерживается для оператора отмены изменений. В этом случае, при отмене изменений внутри обработки глобального события сессия не очищается, а вместо этого отменяется применение изменений, которое привело к выполнению этой обработки. Глобальное событие при этом должно быть синхронным, в противном случае платформа выдаст ошибку.
По умолчанию, при использовании в обработке событий используются следующие режимы:
- для оператора предыдущего значения - стандартный режим (значение на начало сессии)
- для операторов изменений - событийный (значение на момент возникновения предыдущего события).
- для отмены изменений - событийный режим (отмена применения, а не очистка сессии).
Для операторов изменений и оператора предыдущего значения при выполнении глобальных синхронных событий эти режимы (стандартный и событийный) совпадают
Язык
Для создания действий, обрабатывающих события, используется инструкция ON
.
Примеры
CLASS Sku;
name = DATA STRING[100] (Sku);
ON {
LOCAL changedName = BOOLEAN (Sku);
changedName(Sku s) <- CHANGED(name(s));
IF (GROUP SUM 1 IF changedName(Sku s)) THEN {
MESSAGE 'Changed ' + (GROUP SUM 1 IF changedName(Sku s)) + ' skus!!!';
}
}
CLASS Order;
CLASS Customer;
name = DATA STRING[50] (Customer);
customer = DATA Customer (Order);
discount = DATA NUMERIC[6,2] (Order);
ON LOCAL {
FOR CHANGED(customer(Order o)) AND name(customer(o)) == 'Best customer' DO
discount(o) <- 50;
}