|
Программирование >> Хронологические базы данных
операции должен быть ellipse. Таким образом, и для операции объединения в результирующем отношении объявленный тип атрибута А также должен быть ellipse (но об этом частном случае, в отличие от операций join, intersect и minus, вряд ли можно сказать, что он интуитивно непредсказуем). Теперь сформулируем общее правило. Пусть гх и гу - отношения с общим атрибутом А, и пусть объявленные типы атрибута А в отношениях гх и гу - соответственно dt(Ax) и dt(Ay). Рассмотрим соединение отношений гх и гу (обязательно по атрибуту А или по крайней мере с его участием). Объявленный тип dt(Ax) должен быть подтипом типа dt(Ay) или наоборот, в противном случае выполнение соединения будет недопустимо (проверяется во время компиляции). Если соединение допустимо, можно считать, не теряя общности, что dt(Ay) - это подтип dt(Ax). Тогда объявленный тип атрибута А в результирующем отношении операции будет dt(Ах). Аналогичные соображения справедливы и для операций объединения, пересечения и разности. В каждом случае соответствующие атрибуты операндов должны быть такими, чтобы объявленный тип одного из них был подтипом объявленного типа другого и объявленный тип соответствующего атрибута результата будет менее конкретным из двух объявленных типов (здесь под менее конкретным из двух типов т и т, один из которых является подтипом другого, подразумевается тот, который является супертипом). Операторы проверки типа в предыдущем разделе был приведен фрагмент кода, в котором применялись операторы вида is square, is circle и т.д., используемые для проверки, относится ли указанное значение к определенному типу. Рассмотрим эти операторы подробнее. Прежде всего, будем считать, что определение некоторого типа т приводит к автоматическому определению оператора следующего вида. is t ( x ) Здесь x- скалярное выражение, такое, что dt(x) является супертипом типа т (проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение x принадлежит типу т, и значение ложь - в противном случае. Отметим, что объявленный тип указанного аргумента x должен быть супертипом указанного типа т. Поэтому, например, если с - переменная объявленного типа circle, то приведенное ниже выражение будет недопустимым (ошибка типа будет обнаружена при компиляции). is square ( с ) С другой стороны, оба следующих выражения допустимы и в результате дают значение истина. is circle ( с ) is ellipse ( с ) Наконец, если Е - переменная объявленного типа ELLIPSE, но конкретный тип ее текущего значения - некоторый подтип типа CIRCLE, то результат приведенного ниже выражения также будет иcтинoй. IS CIRCLE ( Е ) Мы также подразумеваем, что определение некоторого типа Т приводит к автоматическому определению оператора следующего вида. IS MS T ( X ) Здесь X - скалярное выражение, а DT(X) - супертип типа Т (опять же, это проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение X принадлежит типу Т, и значение ложь - в противном случае. Замечание. Обратите внимание, что в то время как, например, оператор IS ELLIPSE на естественном языке можно лучще всего сформулировать как является эллипсом , то оператор IS MS ELLIPSE на естественном языке лучще всего сформулировать как является конкретно эллипсом . Ниже приводится пример, включающий типы прямоугольника, квадрата и оператор IS MS RECTANGLE. VAR R RECTANGLE ; IF IS MS RECTANGLE ( R ) THEN CALL ROTATE ( R ) ; END IF ; Интуитивно ясно, что оператор ROTATE (Вращать) - это оператор, с помощью которого заданный в качестве аргумента прямоугольник поворачивается на 90° вокруг центра, и что в подобном вращении нет никакого смысла, если рассматриваемый прямоугольник является квадратом. Проверка типа также важна для реляционных операторов. Рассмотрим следующий пример. Пусть переменная-отнощение R имеет атрибут А объявленного типа ELLIPSE, и допустим, что требуется получить такие кортежи переменной-отнощения R, в которых значение атрибута А в действительности является окружностью с радиусом, большим 2. Можно попытаться решить эту задачу следующим образом. R WHERE THE R ( А ) > LENGTH ( 2.0 ) Однако это выражение будет квалифицировано как ошибочное при компиляции, поскольку для оператора THE R требуется, чтобы аргумент имел тип CIRCLE, а атрибут А имеет объявленный тип ELLIPSE, а не CIRCLE. (Если бы проверка при компиляции не выполнялась, то ошибка была бы, конечно, обнаружена во время выполнения, причем это произошло бы при обработке первого же из кортежей, который является просто эллипсом, а не окружностью.) В [3.3] определяются обобщенные формы всех операторов проверки типов , которые представлены в этом подразделе. Например, обобщенная форма оператора IS Т проверяет, относится ли один операнд к тому же типу, что и другой. Она может использоваться вместо оператора, просто проверяющего, принадлежит ли переменная некоторому явно указанному типу. Очевидно, что необходимо как-то отсеять кортежи, в которых значение атрибута А является просто эллипсом, и только после этого проверить условие, что радиус должен быть больше 2. Рассмотрим теперь другую формулировку возможного решения. R : IS CIRCLE ( А ) WHERE THE R ( А ) > LENGTH ( 2.0 ) Согласно этому выражению при выполнении операции должны возвращаться такие кортежи, в которых значение атрибута А является окружностью с радиусом, большим 2. Точнее, возвращается отношение, имеющее следующие свойства. 1. Оно имеет тот же заголовок, что и переменная-отношение R, но объявленный тип атрибута А в нем - CIRCLE, а не ELLIPSE. 2. Его тело содержит те кортежи из переменной-отношения R, в которых значение атрибута А будет иметь тип CIRCLE, т.е. будет окружностью и радиус этой окружности будет больше 2. Другими словами, то, что мы только что рассмотрели, - это новый реляционный оператор следующего вида. R : IS T ( А ) Здесь R - реляционное выражение, а А - атрибут отношения (скажем, г), обозначаемого этим выражением. Объявленный тип DT(A) атрибута А должен быть супертипом типа Т (проверяется при компиляции). Значение данного выражения в целом определяет отношение со следующими свойствами. 1. Оно имеет тот же заголовок, что и отношение г, но объявленный тип атрибута А в этом заголовке - Т. 2. Его тело содержит кортежи г, в которых атрибут А имеет значение типа Т, и, кроме того, объявленный тип атрибута А в каждом из таких кортежей будет Т. Аналогично определяется другой новый реляционный оператор следующего вида. R : IS MS T ( А ) 19.7. Операторы, версии и сигнатуры Как утверждалось в разделе 19.3, любой заданный оператор может иметь много различных скрытых версий реализации (что известно также как явная специализация). Это означает, что по мере продвижения в иерархии типов от некоторого супертипа Т к некоторому подтипу Т необходимо, чтобы по крайней мере существовала возможность переписать реализацию (по разным соображениям) операторов типа Т для типа Т. В качестве примера рассмотрим следующий оператор MOVE. OPERATOR MOVE ( Е ELLIPSE, R RECTANGLE ) RETURNS ( ELLIPSE ) VERSION ER MOVE ; RETURN ( ELLIPSE ( THE A ( E ), THE B ( E ), R CTR ( R ) ) ; END OPERATOR ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |