Классика баз данных - статьи

       

Групповые вызовы методов.


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

Конечно, возможна суперпозиция

  • традиционных реляционных операций,
  • операций выборки объектов по значениям и раскрытия ссылок, применяемые к R-переменным полиморфных типов
  • группового вызова методов (которые также являются полиморфными).

Например, следующее выражение

((t EXPAND a.xref< a*.x* =1>).method())[x]

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

Пример. Реализуем компонент SaledItems типа Brand, содержащий информацию о продажах артикулов, принадлежащих данной(this) торговой марки. Используя операцию раскрытия ссылки SaleItems.Art, мы получаем доступ к атрибуту brandname тех объектов типа Article, ссылка на которые имеется в объектах, описывающих продажи.

ALTER CLASS Brand REALIZE SaledItems AS SUMMARIZE (Sales EXPAND SaleItems.Art<brandname = this.name>) BY Art, ADD Sum(Pieces) AS Pieces;

Следующий код представляет собой транзакцию, в которой отгружаются все не отгруженные продажи. Если это возможно для всех продаж, выполненные изменения принимаются. Если не все продажи могут быть отгружены, транзакция откатывается.

BEGIN TRANSACTIOM IF EXIST ((SALES <DateOfAction IS NULL>.DoSale(GetTodayDate()) = FALSE) THEN ROLLBACK ELSE COMMIT



Содержание  Назад  Вперед