|
Программирование >> Хронологические базы данных
RETURN ( P ) ; END ; END OPERATOR ; OPERATOR POLAR ( R RATIONAL, THETA RATIONAL ) RETURNS ( POINT ) ; RETURN ( CARTESIAN ( R * COS ( THETA ), R * SIN ( THETA ) ) ) ; END OPERATOR ; Обратите внимание на то, что при определении оператора POLAR используется оператор выбора CARTESIAN, а также встроенные операторы SIN и COS. Оператор POLAR можно определить и по-другому, непосредственно с помощью защищенных операторов. OPERATOR POLAR ( R RATIONAL, THETA RATIONAL ) RETURNS( POINT ) ; BEGIN; VAR P POINT ; Х-компонент физического представления P := R * COS ( THETA ) ; У-компонент физического представления P := R * SIN ( THETA ) ; RETURN ( P ) ; END ; END OPERATOR ; Защищенные операторы используются также определителем типа для реализации необходимых операторов ТНЕ . OPERATOR ТНЕ Х ( Р POINT ) RETURNS ( RATIONAL ) ; RETURN ( Х-компонент физического представления Р ) ; END OPERATOR ; OPERATOR THE Y ( P POINT ) RETURNS ( RATIONAL ) ; RETURN ( У-компонент физического представления P ) ; END OPERATOR ; OPERATOR THE R ( P POINT ) RETURNS ( RATIONAL ) ; RETURN ( SQRT ( THE X ( P ) ** 2+ THE У ( P ) ** 2 ) ) ; END OPERATOR ; OPERATOR THE THETA ( P POINT ) RETURNS ( RATIONAL ) ; RETURN ( ARCTAN ( THE Y ( P ) / THE X ( P ) ) ) ; END OPERATOR ; Здесь при определении операторов THE R и ТНЕ ТНЕТА используются операторы ТНЕ Х и THE Y, а также (встроенные по предположению) операторы SQRT и ARCTAN. Операторы THE R и ТНЕ ТНЕТА также можно определить непосредственно в терминах защищенных операторов. Предлагаем читателю сделать это самостоятельно в качестве упражнения. На этом наше пространное обсуждение типа POINT можно считать завершенным. Однако следует понимать, что все вышесказанное применимо и к более простым типам, например к таким, как тип QTY. Вот несколько примеров использования оператора выбора для этого типа. QTY (100) QTY (Q) QTY ( ( Ql - Q2 ) * 2 ) Операторы THE этого типа могут использоваться следующим образом. THE QTY ( Q ) THE QTY ( ( Ql - Ql ) * 2 ) Отметим, в частности, что, поскольку каждое значение всегда принадлежит какому-либо типу, совершенно некорректно говорить, например, что количество деталей определенной поставки равно 100. Количество деталей - это значение типа QTY, а не INTEGER! В этом случае более правильно было бы сказать, что количество деталей равно QTY(IOO), а не просто 100. В неформальном контексте мы часто не заботимся о такой точности и употребляем число 100 как удобное сокращение для оператора выборки QTY(IOO). В частности, подобные сокращения использовались на рис. 3.8 (база данных поставщиков и деталей) и на рис. 4.5 (база данных поставщиков, деталей и проектов). В завершение приведем пример определения типа LINESEG (отрезок). TYPE LINESEG POSSREP ( BEGIN POINT, END POINT ) ; Допустимые представления можно, конечно же, определять не только в терминах встроенных типов (как во всех предыдущих примерах), но и с помощью типов, определенных пользователем, так как это сделано в данном случае. Определение операторов в этом разделе особое внимание будет уделено определению операторов. Для этого рассмотрим еще несколько примеров. В первом примере определяется пользовательский оператор для встроенного типа RATIONAL. OPERATOR ABS ( Z RATIONAL ) RETURNS ( RATIONAL ) ; RETURN(CASE WHEN Z > 0.0 THEN +Z WHEN Z < 0.0 THEN -Z END CASE ) ; END OPERATOR ; Оператор ABS (модуль числа) определен для одного параметра Z типа RATIONAL и возвращает значение того же типа (другими словами, такое выражение, как ABS (АМТ1 -АМТ2), принадлежит типу RATIONAL). В контексте языка SQL мы делаем то же самое, но по другой причине, а именно - потому, что в языке SQL не поддерживаются (пока) типы, определенные пользователем (см. приложение Б). в следующем примере для определения оператора DIST (вычисления расстояния между двумя точками) применяются типы данных, установленные пользователем. OPERATOR DIST ( Pi POINT, P2 POINT ) RETURNS ( LENGTH ) ; RETURN ( WITH THE X( Pi ) AS XI , THE X( P2 ) AS X2 , THE Y( PI ) AS Yl , THE Y( P2 ) AS Y2 : LENGTH ( SQRT ( ( XI - X2 ) ** 2 + ( Yl - Y2 ) ** 2 ) ) ) ; END OPERATOR ; Здесь предполагается, что LENGTH - это определенный пользователем тип с допустимым представлением RATIONAL. Обратите внимание на то, что для использования в соответствующих выражениях сокращенных имен употребляется предложение WITH. В следующем примере рассмотрен оператор равенства = для типа POINT. OPERATOR EQ ( Pi POINT, P2 POINT ) RETURNS ( BOOLEAN ) ; RETURN ( THE X ( PI ) = THE X ( P2 ) AND THE~Y ( PI ) = THE Y ( P2 ) ) ; END OPERATOR ; Обратите внимание, что в выражении оператора RETURN используется встроенный оператор = для типа RATIONAL. Далее с целью упрощения будем считать, что обычное инфиксное обозначение = используется для оператора равенства (для всех типов, в частности и для типа POINT). Практическое определение данного инфиксного обозначения рассматриваться не будет, поскольку это всего лишь вопрос синтаксиса. Оператор < для типа QTY определяется следующим образом. OPERATOR LT (Q1 QTY, Q2 QTY ) RETURNS ( BOOLEAN ) ; RETURN ( THE QTY ( Ql ) < THE QTY ( Q2 ) ) ; END OPERATOR ; Здесь в выражении оператора RETURN используется встроенный оператор < для типа INTEGER. И опять же, с этого момента и далее будем считать, что обычное инфиксное обозначение < используется для этого оператора по отношению ко всем упорядоченным типам, каковым, в частности, является и тип QTY. (По определению упорядоченным типом называется тип, для которого применим оператор < . Простейшим примером неупорядоченного типа может служить тип POINT.) Рассмотрим пример определения оператора обновления (во всех предыдущих примерах операторы были операторами считывания). Мы увидим далее, что в теле определения таких операторов вместо слова RETURNS используется слово UPDATES. Операторы обновления значений не возвращают и должны активизироваться с помощью явных вызовов CALL [3.3]. Операторы считывания и обновления также называются наблюдателями и мутаторами соответственно, особенно в объектных системах (см. часть IV этой книги).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |