|
Программирование >> Реляционные базы данных
порождает множество ф1ыьмов, снятых до 1920 г Его типом является Set<Movie>. Еслн oldMovies - переменная главного языка такого же типа, можно записать (в С++, раеш1изен ном за счет OQL): OldMovies = SELECT DIST NCT m FROM Movies m WHERE m year < 1920; и значением oldMovies станет множество этих объектов класса Movie. □ 8.4-2 Извлечение элементов из множества Поскольку выражения типа seiect-Ггот-where и group-bj порождают множества илн мультимножества, для получения единственного элемента нужны дополт1 ель-ные срсдстиа. Это верно, даже когда точно известно, что мгюжество cocrotr из единственного элемента. Оператор ELEMENT в OQL преврашет одноэлементное множество НЛП мультимножество в единственный его член. Этот оператор можно применить, например, к результату запроса, которьи1 заведомо возвращает одноэлементное мультпм ножество. Пример 8.17. Допустим, переменной gwtw типа Movie (т.е. ее типом является класс Movie) нужно присвоить объект, представляюший фильм Gone With the Wind . Результатом stmpocj SELECT m FROM Movies m WHERE nn.litle = Gone With the Wind является мультимножество, содержащее один этот объект. Невозможно прямо присвоить это мультимножество переменной gwtw, так как это разные типы. Но если сначала применить оператор ELEMENT: gwtw = ELEMENT(SELECT m FROM Movies m WHERE m.title =Gone With the Wind т1[пы переменной и выражения будут соответствовать друг другу и приписывание будет допустимо □ 8.4.3 Получение каждого члена множества Получить каждый член множества или мультимножества доста очно сложно, но все же проще, чем применять основанные на курсорах алгоритмы SQL. Сначала НУЖНО превратить м1Южество или мультимножество в список с помощью выражения типа select-from where с оператором ORDER BY Результатом такого выражения будет список выбранных объектов пли значений. Пример 8.18. Предположим, нужно по.пучить список всех объектов класса Movie Для этого можно исиользовать название и гол выпуска фильма, ibk как (title, year) является ключо.м для Movie. Выражение movleList SELECT m FROM Movies m ORDER BY m.title, m year. приписывает переменной главного языка movieUst список всех объектов кчасса Movie, упорядоченных по назгзанию и году П Каждый элечсепт упорядоченного или неупорядоченного списка, можно получить по но.меру: /-Й элемент списка L получается как выражение L.\i- \\. Предполагается, что списки и наборы всегда нумеруются, начиная с О, как в С пли в С++. Пример 8,19. Допусти.м, нужно написать функцию С++, печазаюшую название, гоа выпуска и прололжтельиосгь каждого фильма. Краткая запись этой функции дани на рис. ЬМО. 1) movieLlst = SELECT m FROM Movies m ORDER BY m.title. m.year; 2) numberOfMovies = COUNT(Movies): 3) for(i=0; i<numberOfMovies; i++) { 4) movie = movieList[i]; 5) count movie.title movte.year 6) movie.length \n : . 7) ) рис. 8.10. npoeepKo и вывод но печоть каждого фильма Строка (I) сортирует класс Movie, помещая результат сортировки в переменную movieList с типом List<Movie>. Строка (2) вычисляет количество фильмов с помощью оператора OQL COUIMT. Строки (3) - (7) - это цикл, в котором числовая переменная / пробегает по всем позициям списка. Для удобства /-й ългыьт списка приписывается неременной movie. На строках (5) и (6) печатаются соответствующие атрибуты фильма. □ 8.4.4 Создание новых объектов Выражения OQL типа select-fiom-wliere позволяют создавать новые объекты путем вычислений на множестве существующих объектов. Можно создавать объекты и объединением констант или других выражений в структуры и применением конструкторов типов к значениям. Вместо угловых скобок, применяемых при описании типов, прн конструировании значений используются круглые скобки. Соглашение проиллюстрировано в примере 8.7, где строка SELECT DISTINCT Struct(star1: si. star2- s2) означает, что результатом запроса является множество объектов, с типом Slruct{star1: Star, star2: Star}. Имена полей starl и star2 определяют структуру, а типы этих палей можно вывести из типов переменных si и s2. Пример 8.20. Множества можно создать, применяя любой нз конструкторов (Ser, Bag, L st или Array) к объектам одного типа. Рассмотрим последовательность присвоений x = Struct(a-1. b:2). у = Bag(x. X, Slruct{a : 3, b : 4)): Первое из ни\ присваивает переменной ж значение типа Stmct(a : Integer, b integer) т.е. структуру с двумя численнозначными полями а и Ь. Значения такого типа можно считать не именами полей а и Ь, а кортежами, компонентами которых являются натуральные числа. Поэтому значение х можно представить как (1,2). Второе определяет у как мультимножество, членами которого яапяются структуры того же типа, что и .\. Пара (1,2) входит в эю мультимножество два раза, а пара (3,4) - один риз. □ Если задан тип и запрос порождает множество объектов этого типа, вместо явного выражения данного типа можно использовать его имя. Пример 8.7 показал создание явным образом множества пар кинозвезд. За ключевым словом SELECT указьикиюсь выражение, и котором конструктор типов Struct применялся для построения объектов, содержащих два поля, значениями которых были объекты, представляющие кинозвезд. Предположим, тип StarPair определеи как Struct{star1: Star. star2: Star} Тогда можно переписать запрос нз примера 8.7, используя этот тип в пункте SELECT: SELECT DISTINCT StarPair(Etar1: s1, star2: s2) FROM Stars si. Stars s2 WHERE sl.addr-s2.addr AND s1 name < s2.name Единственное изменение старого запроса состоит в том, что результат его истюго варианта имеет тип Set<StarPair> и ,\южет быть приписан переменное главного языка, илгеющей этот же тип. Применение имени инш к аргументам особенно полезно, когда именем типа являе1х;я класс. Классы обычно имеют .множество различных форм функций-конструкторов, зависящих от того, какое свойство инициируется явным образом, а какое имеет значен le по умолчанию. Например, методы наверняка не инициируются, большинство атрибутов получает исходные значения, а связи люг! быть сначала заданы в виде пустого множества и добавлены позже. Имя каждой такой функинн-конст1уктора - это имя класса, и различаются они по именам полей, упомянутых в их яргумента.х. Детипи определения таких функций зависят от главного языка. Пример 8.21. Рассмотрим одну из возможных функинй-конструкторов для объектов класса Movie. Из значений атрибутов title, year, length и ownedBy она порояшает объект, имеющий эти значения в перечисленных полях и пустое множество кинозвезд. Если mgm - переменная, значением которой является объект МСМ Studio, хюжио создать объект Gone With the Wind с помошью выражения: gwtw = Movie(tltle: Gone With the Wind , yesr: 1939, length: 239 ownedBy: mgm); Этот оператор дает два результата. I. Создается новый объект класса Movie, который стгшовнтся частью степени Movies. Этот объект становится значением переменной главного языка gvjt/j. О 8.4-5 Упражнения к разделу 8.4 Упражнение 8.4.1. Присвойте переменной главного мзьиса х консг<1Нты; а) Множество {I. 2, 3J. b) Мультимножество {I, 2, 3, 1. c) Список (I. 2. 3, li.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |