Obiektowe języki zapytań 1..5

Download Report

Transcript Obiektowe języki zapytań 1..5

Obiektowe języki zapytań

Wykładowca

: Kazimierz Subieta

Polsko-Japońska Wyższa Szkoła Technik Komputerowych, Warszawa [email protected]

Instytut Podstaw Informatyki PAN, Warszawa [email protected]

© K.Subieta. Obiektowe języki zapytań 08, Folia 1 Wykład 08:

Język SBQL (Stack-Based Query Language) (1)

kwiecień 2004

Generalne własności SBQL

  Język SBQL jest sformalizowanym obiektowym językiem zapytań w stylu SQL lub OQL. Posiada semantyczne odpowiedniki podstawowych konstrukcji tych języków. Może być zdefiniowany (uściślony) dla wielu modeli składu, w szczególności dla modeli M0 - M3.

W odróżnieniu od relacyjnych i obiektowych algebr, rachunków, logik i innych tego rodzaju koncepcji, definicja SBQL bazuje na pojęciu

stanu

, którego składnikami są

skład obiektów

oraz

stos środowisk

.  SBQL będziemy uważać za wzorzec teoretyczny podobny do algebry relacji. SBQL jest jednak nieporównywalnie bardziej uniwersalny i konsekwentny niż dowolna tego rodzaju algebra, włączając tzw. algebry obiektowe. Będziemy starali się wykazać, że: 

Języki zapytań mogą zawierać operatory nie-algebraiczne , których odwzorowanie w dowolną algebrę jest niemożliwe bez wprowadzenia poważnych ograniczeń koncepcyjnych.

© K.Subieta. Obiektowe języki zapytań 08, Folia 2 kwiecień 2004

Składnia SBQL (1)

  Przyjmiemy, że niektóre elementy wprowadzonego poprzednio zbioru

V

mają reprezentację „zewnętrzną”, która pozwala zapisać ten element w zapytaniu w postaci ciągu bajtów.

• Wiele elementów zbioru

V

, takich jak grafika, skompilowane procedury, itd.

nie posiada reprezentacji zewnętrznej.

• Zwykle zewnętrzny reprezentant elementu zbioru programowania

literalem V

jest zwany w językach ; nazwa ta została użyta w niewłaściwym znaczeniu w standardzie ODMG.

• Niedobrym terminem jest

stała

, gdyż następuje tu kolizja znaczeniowa z niemodyfikowalnym elementem składu obiektów.

• Wracamy do właściwych znaczeń terminów ODMG odrzucamy.

literal

i

stała

. Terminologię Zbiór literali będziemy oznaczać

L

. Będziemy zakładać, że istnieje prosta i jednoznaczna funkcja odwzorowująca element zbioru

L

w element zbioru

V

.

• Identyfikatory należące do zbioru

I

nie mają odpowiadających im literali.

© K.Subieta. Obiektowe języki zapytań 08, Folia 3 kwiecień 2004

Składnia SBQL (2)

• Jedyną możliwością odwołania się do obiektów znajdujących się w składzie obiektów będzie użycie ich zewnętrznej nazwy należącej do zbioru

N

.

Przyjmiemy, że każdy element zbioru N może być użyty w zapytaniu.

Dowolny literal jest zapytaniem

; np. 2, 3.14, ”

Kowalski

” 

Dowolny element zbioru N jest zapytaniem

; np.

zarobek, wiek

.

Osoba, Student,

Zapytania operatorów

.

można łączyć w większe zapytania przy pomocy

• Wykorzystamy tu typowy zestaw operatorów występujących w znanych językach zapytań, np. w SQL.

• Musimy przy tym rozróżniać leksykalną reprezentację operatora i sam operator, podobnie jak w przypadku rozróżnienia pomiędzy zbiorami

L

i

V

.

Np. element leksykalny

sum

sumującą funkcję zagregowaną.

jest ciągiem trzech znaków, który oznacza • Operatory będą podzielone na

nie-algebraiczne

.

© K.Subieta. Obiektowe języki zapytań 08, Folia 4

unarne

i

binarne

, oraz

algebraiczne

kwiecień 2004 i

Składnia SBQL (3)

   Jeżeli  jest oznaczeniem operatora algebraicznego unarnego, zaś zapytaniem, wówczas  (

q

) jest zapytaniem.

q

jest • Przykładami operatorów algebraicznych unarnych są:

count, sum, avg, log, -, sin, sqrt, not

, itd. Dla operatorów - oraz

not

, będziemy pomijać nawiasy, o ile nie doprowadzi to do niejednoznaczności.

Jeżeli  jest oznaczeniem operatora algebraicznego binarnego, zaś są zapytaniami, wówczas

q 1

q 2

jest zapytaniem.

q 1

• Przykładami operatorów algebraicznych binarnych są: =, +, -, *, /, <, >, i

q 2 and, or, union

, itd. Przecinek jest operatorem algebraicznym - konstruktorem struktur i kolekcji.

Jeżeli  jest oznaczeniem operatora nie-algebraicznego, zaś zapytaniami, wówczas

q 1

q 2

jest zapytaniem.

q 1

i

q 2

są • Przykładami operatorów nie-algebraicznych są: selekcja (

where

), projekcja lub nawigacja (.), zależne złączenie (

join

), kwantyfikatory, itd. Dla kwantyfikatorów zastosujemy tradycyjną składnię 

q 1

(

q 2

) oraz 

q 1

(

q 2

); jest ona równoważna podanej wyżej uniwersalnej składni

q 1

q 2

i

q 1

q 2

© K.Subieta. Obiektowe języki zapytań 08, Folia 5 kwiecień 2004

Składnia SBQL (4)

 Jeżeli

q

jest zapytaniem, zaś

n

N

, wówczas q as n jest zapytaniem.

• Operator

as

jest unarnym operatorem algebraicznym parametryzowanym nazwą

n

. Operator ten będziemy wykorzystywać w większości sytuacji wymagających zdefiniowania pomocniczej nazwy.

 Jeżeli

q

jest zapytaniem, zaś

n

N

, wówczas q group as n zapytaniem.

Operator

group as

jest podobny do

as

, o nieco innej semantyce.

jest  Jeżeli

q

jest zapytaniem, to (

q

) jest zapytaniem.

 Jeżeli

n

N

jest nazwą procedury, funkcji, lub metody posiadającej parametrów, zaś

q 1

,

q 2

, ... ,

q k

są zapytaniami, wówczas

n

(

q 1

;

q 2

; ... ,

k q k

) jest zapytaniem.

 Jeżeli

n

N

jest nazwą procedury, funkcji, lub metody nie posiadającej parametrów, wówczas

n

() oraz

n

są zapytaniami.

 Zapytania będą podlegać ograniczeniom typologicznym, które najczęściej będą tutaj zakładane

implicite

.

© K.Subieta. Obiektowe języki zapytań 08, Folia 6 kwiecień 2004

Przykładowe zapytania

2000

zarobek Osoba

2+2 "Kowalski"

zarobek

> 2000 Osoba where (

zarobek

> 2000) ( Osoba where (

wiek

() > 30)) . (

zarobek

+

x

+ 2000/y) (( Osoba as p )

join

(

p

.

pracuje_w

.

Dział as d )) . (

p

.

nazwisko

,

d.nazwa

) 

Osoba

(

wiek

< 65) Dział where (  (

zatrudnia

.

Osoba

) as p (

p.wiek

() < 17)) ((( Osoba as p )

join

(

p

.

pracuje_w

.

Dział as d ))

where

(

p.Nazwisko

= "Nowak" and d.Nazwa = "Kontrola")) . (

p

.

nazwisko

,

d.nazwa

) © K.Subieta. Obiektowe języki zapytań 08, Folia 7 kwiecień 2004

Podsumowanie składni SBQL

zapytanie zapytanie zapytanie zapytanie

::=

L

::=

N

::=

operUna zapytanie

::=

operUna

(

zapytanie

)

zapytanie

::=

zapytanie operBin zapytanie zapytanie operNieAlg

::=

zapytanie zapytanie

::=

zapytanie operNieAlg zapytanie

where | .| join | ::= 

zapytanie

(

zapytanie

::= 

zapytanie

( 

|

zapytanie

) )

zapytanie zapytanie

::= zapytanie as N ::= zapytanie group as N

zapytanie zapytanie zapytanie parametr

::= (

zapytanie

) ::=

N

( ) ::=

N

(

parametr

{;

parametr

} ) ::=

zapytanie L

V

jest zbiorem literali

N

jest zbiorem nazw

operUna

jest operatorem algebraicznym unarnym

operBin

jest operatorem algebraicznym binarnym

operNieAlg

jest operatorem nie-algebraicznym Możliwe są dalsze operatory nie-algebraiczne Meta-nawiasy {} oznaczają iterację od 0 (

Plus ograniczenia typologiczne

: np. 2+"Kowalski" nie jest poprawnym zapytaniem,

Nazwisko

= "Nowak") where Osoba nie jest poprawnym zapytaniem; itd.

© K.Subieta. Obiektowe języki zapytań 08, Folia 8 kwiecień 2004

Drzewa syntaktyczne zapytań

 Jest to struktura danych, która powstaje jako rezultat rozbioru gramatycznego zapytania.

• Jest podstawą działania procedury

eval

wyznaczania rezultatu zapytania.

• Może być przedtem poddane przekształceniom mającym na celu optymalizację zapytania.

 Np. drzewo syntaktyczne zapytania: Osoba where Nazwisko = ”

Nowak

Start

Operator niealgebraiczny

where

Lewe podzapytanie Prawe podzapytanie Nazwa

Osoba

Operator algebraiczny

=

Lewe podzapytanie Prawe podzapytanie Operator

deref

Literał ”

Nowak

” Nazwa

Nazwisko

© K.Subieta. Obiektowe języki zapytań 08, Folia 9 kwiecień 2004

Stos rezultatów zapytań (QRES)

   Wszelkie pośrednie i końcowe rezultaty zapytań (wyrażeń) będą odkładane na stosie rezultatów

QRES

(

Query REsult Stack

). • Stos rezultatów jest uogólnieniem stosu arytmetycznego spotykanego w implementacji języków programowania. • Dość często osoby mało wyrobione w semantyce języków programowania plączą stos środowisk ze stosem rezultatów. Są to różne stosy, o odmiennej budowie, operacjach i przeznaczeniu. W SBA zajmujemy się obydwoma stosami.

Elementami stosu będą rezultaty zapytań (elementy zbioru

Rezultat

) zdefiniowane poprzednio; • Stos będzie przechowywał także wszelkie pomocnicze elementy niezbędne do obliczania zapytań; w szczególności, liczniki pętli iteracyjnych implikowanych przez operatory działające na kolekcjach. Elementy te nie będą uwzględniane w opisie formalnej semantyki.

Stos rezultatów jest strukturą danych przechowywaną w pamięci operacyjnej. Zmienia się w trakcie obliczeń. © K.Subieta. Obiektowe języki zapytań 08, Folia 10 kwiecień 2004

Przykład działania stosu rezultatów

Wyrażenie (2 *((5 + 3 ) / 4)) - 1 Odwrotna notacja polska 2 5 3 + 4 / * 1 -

pusty

2 5 2 3 5 2 + 8 2 4 8 2 / 2 2 * 4 1 4 3 © K.Subieta. Obiektowe języki zapytań 08, Folia 11 kwiecień 2004

Dlaczego wprowadzamy stos QRES?

 QRES nie będzie przez nas uważany za składową pojęcia

stanu

.

• Dla sformułowania semantyki stos QRES ma znaczenie drugorzędne.

• W niektórych sformułowaniach tej semantyki (np. w semantyce

denotacyjnej

) QRES jest w ogóle zbędny.

• Jest również zbędny, jeżeli semantykę zaimplementujemy poprzez zestaw rekurencyjnych procedur.

 Stos QRES jest wygodny przy podejściu operacyjnym do semantyki.

• Doświadczenie pokazuje, że inne podejścia (np. denotacyjne) są za trudne; • Stos ten uzupełnia koncepcję podejścia stosowego. Dzięki temu nasze rozważania teoretyczne można dość łatwo zaimplementować;

abstrakcyjnej implementacji

, która jest zaletą • Stos rezultatów jest skojarzony z jego statycznym odpowiednikiem funkcjonującym podczas statycznej analizy zapytania (kompilacji). Statyczny stos rezultatów jest niezbędnym elementem optymalizatora zapytań.

© K.Subieta. Obiektowe języki zapytań 08, Folia 12 kwiecień 2004

Operatory działające na stosie QRES

 Stos

QRES

operatory: jest abstrakcyjną strukturą danych obsługiwaną przez cztery •

push

(włóż nowy element na wierzchołek stosu), •

pop

(zdejmij jeden element z wierzchołka stosu), • •

top

(odczytaj wierzchołek stosu),

empty

(sprawdź czy stos jest pusty).

  Operacje na stosie odbywają się zawsze na jego wierzchołku (uwzględniają jeden lub dwa wierzchołkowe elementy). Pozostałe elementy stosu staną się widoczne dopiero wtedy, gdy zdejmiemy odpowiednią liczbę elementów z jego wierzchołka. © K.Subieta. Obiektowe języki zapytań 08, Folia 13 kwiecień 2004

Przykład zawartości stosu QRES

15 i 17

struct

{ x(i 61 ), y(i 93 ) }

bag

{

struct

{ n("Nowak"), s(i 9 )},

struct

{ n("Stec"), s(i 14 )},

struct

{ n("Mikuła" ), s(i 18 )}} dół stosu wierzchołek stosu jedyny widoczny element niewidoczne elementy stosu © K.Subieta. Obiektowe języki zapytań 08, Folia 14 kwiecień 2004

Ogólna architektura elementów semantyki

Stos środowisk ENVS

Operatory niealgebraiczne Ewaluacja zapytań

Stos rezultatów QRES

referencje do obiektów

Skład obiektów

Obiekty ulotne Obiekty trwałe referencje do obiektów © K.Subieta. Obiektowe języki zapytań 08, Folia 15 kwiecień 2004

Procedura ewaluacji zapytań eval

(

eval

uation

)  Semantyka SBQL będzie zdefiniowana poprzez procedurę

eval

.

 Argumentem procedury

eval

jest dowolne zapytanie, zaś wynikiem procedury jest rezultat tego zapytania włożony na wierzchołek

QRES

.

• Procedura

eval

jest realizacją omawianej wcześniej zasady modularności lub kompozycyjności języka. Jest rekurencyjna, wywołuje sama siebie dla podzapytań danego zapytania.

 Procedura

eval

będzie korzystać ze składu obiektów,

ENVS

oraz

QRES

.

Dla zapytań bez efektów ubocznych przyjmiemy następujące założenia: • Procedura

eval

nie zmienia stanu składu obiektów; • Procedura

eval

w trakcie ewaluacji zapytania

q

może zmieniać stan

ENVS

, ale po zakończeniu ewaluacji

q

stan ten będzie taki sam, jak na początku.

• Procedura

eval

w trakcie ewaluacji zapytania

q

którą zastała w momencie rozpoczęcia ewaluacji.

nie zmienia tej części

QRES

,  Semantyka będzie sterowana abstrakcyjną składnią. • Procedura

eval

jest wspomagana przez analizator gramatyczny (

parser

).

© K.Subieta. Obiektowe języki zapytań 08, Folia 16 kwiecień 2004

Działanie procedury eval

rezultat zapytania q eval

(

q

)

poprzedni stan QRES poprzedni stan QRES

 Rezultaty zapytań zapisane na QRES są „konsumowane” przez operatory języka, dla których zapytania były parametrami.

• Takim operatorem może być usunięcie danych, np.:

print

lub operator SQL delete Osoba where Nazwisko

delete

oznaczający = ”

Nowak

”; • Wykonanie tego polecenia oznacza ewaluację przez procedurę

eval

zapytania Osoba where Nazwisko = ”

Nowak

” , w wyniku czego na wierzchołku QRES pojawi się referencja do obiektu Nowaka. • Ten rezultat zostanie „skonsumowany” przez operator

delete

, który następnie usunie go ze stosu QRES.

• Po zakończeniu kompletu operacji QRES pozostanie taki sam, jak na początku. Na koniec wszystkich obliczeń QRES będzie pusty.

© K.Subieta. Obiektowe języki zapytań 08, Folia 17 kwiecień 2004

Wynik procedury eval dla elementarnych zapytań

  Jeżeli zapytanie jest literalem

l

L

, to procedura

eval

odpowiadającą mu wartość atomową

l

V

wkłada na wierzchołek

QRES

. Jeżeli zapytanie jest nazwą

n

N

, to procedura

eval

dokonuje wiązania tej nazwy na

ENVS

(funkcja

bind

), a następnie wynik tego wiązania wkłada na wierzchołek stosu

QRES

.

procedure eval (

q

:

zapytanie

)

begin

parse

(

q

); (* rozbiór gramatyczny *) case q jest rozpoznane jako

l

L

:

push

(

QRES

,

l

); case q jest rozpoznane jako

n

N

:

push

(

QRES

,

bind

(

n

) );

case

.....

.....

end

; © K.Subieta. Obiektowe języki zapytań 08, Folia 18 kwiecień 2004

Operatory algebraiczne i nie-algebraiczne

    Operatory łączące zapytania będziemy dzielić na

algebraiczne

i

nie algebraiczne

.

• Istotą podejścia stosowego są operatory nie-algebraiczne. Fundamentalna różnica pomiędzy operatorami algebraicznymi i nie algebraicznymi polega na ich stosunku do stosu środowisk

ENVS

. Operatory algebraiczne nie używają

ENVS

: działanie takiego operatora dotyczy wyłącznie stosu

QRES

(z reguły jednego lub dwóch wierzchołkowych elementów). Operatory nie-algebraiczne, oprócz działań na

QRES

, bezpośrednio odwołują się do konstrukcji i operacji zachodzących na

ENVS

. © K.Subieta. Obiektowe języki zapytań 08, Folia 19 kwiecień 2004

Operatory algebraiczne

  Cechą dowolnej algebry jest m.in. to, że w wyrażeniu

x 1

operatorem algebry) kolejność ewaluacji argumentów operatorów nie-algebraicznych.

x 1

x 2

oraz (gdzie

x 2

 tego operatora nie ma znaczenia. Jest to zasadnicza różnica w stosunku do jest W matematycznym (denotacyjnym) sformułowaniu wynik zapytań oraz

q 1

q 2

można zapisać jako:

wynik wynik

( (  (

q 1 q 1

 ) ) =

q 2

) =  (

wynik

(

wynik

(

q 1

)

q 1

 ) )

wynik

(

q 2

)  jest  ( implementacją

q 1

 )  Funkcja

wynik

jest parametryzowana stanem, ale jej definicja nie odwołuje się do tego stanu bezpośrednio.

© K.Subieta. Obiektowe języki zapytań 08, Folia 20 kwiecień 2004

Funkcja eval dla operatorów algebraicznych

procedure eval (

q

:

zapytanie

)

begin

.....

case q jest rozpoznane jako  (

begin

q 1

) lub 

q 1

:

wynik_q1

:

Rezultat

; (* lokalna zmienna typu

Rezultat eval

(

q 1

); (* rezultat

q 1

*) na wierzchołku stosu QRES *)

wynik_q1

:=

top

(

QRES

);

pop

(

QRES

push

(

QRES

,  (

wynik_q1

); );

end

; case q jest rozpoznane jako

q 1

begin

q 2

:

wynik_q1, wynik_q2

:

Rezultat

; (* lokalne zmienne *)

eval

(

q 1

); (* rezultat

q 1

na wierzchołku stosu QRES *)

eval

(

q 2

); (* rezultat

q 2

na wierzchołku stosu QRES *)

wynik_q2

:=

top

(

QRES

);

pop

(

QRES

);

end

;

wynik_q1

:=

top

(

QRES

);

pop

(

QRES

push

(

QRES

,

wynik_q1

wynik_q2

); );

case

.....

.....

end

; © K.Subieta. Obiektowe języki zapytań 08, Folia 21 kwiecień 2004

Rodzaje operatorów algebraicznych - ogólnie

 Języki zapytań wprowadzają wiele operatorów algebraicznych. • Granica pomiędzy operatorami „wbudowanymi” w dany język, a operatorami „dobudowanymi” na wierzchołku języka jest rozmyta. • Liczba operatorów „wbudowanych” powinna być minimalna. Prawie wszystkie powinny wchodzić w skład bibliotek, które nie należą do definicji języka, ale raczej uzupełniają pewien jego aspekt lub dziedzinę zastosowań.  Może być duża liczba operatorów bibliotecznych przywiązanych do specyficznych dziedzin zastosowań, np. operatory obsługujące hurtownie danych, systemy geograficzne, systemy temporalne, systemy przestrzenne, systemy oparte o XML, systemy przetwarzania języka naturalnego, itd.

• Nas będą interesować głównie operatory generyczne, niezależne od dziedziny zastosowań.

• Nie będziemy jednak przesądzać, które operatory algebraiczne należą do SBQL, a które nie należą. Przyjmiemy, że do SBQL teoretycznie należy dowolny operator algebraiczny, który jest potrzebny i implementowalny.

• Jeżeli zaimplementowano 100 operatorów algebraicznych, to implementacja 101-szego jest zazwyczaj bardzo prosta.

© K.Subieta. Obiektowe języki zapytań 08, Folia 22 kwiecień 2004

Rodzaje operatorów algebraicznych (1)

• Generyczny operator porównania na równość, oznaczany zwykle =, i operator odwrotny oznaczany   . Np.

Nazwisko

= ”

Kowalski

” ,

x

=

y

,

Zarobek

2000 , itd. Operatory te są zwykle zdefiniowane dla wszystkich typów wprowadzanych w danym języku.

• Porównania i operatory dotyczące liczba całkowitych i rzeczywistych: <,  , +, - , *, /. Np.

Zarobek

< 3000 , 2+2 , -(

głebokosc

+ x) , itd.

 , >, • Funkcje liczbowe: część całkowita liczby, zaokrąglenie liczby, wartość bezwzględna liczby, sinus, kosinus, tangens, cotangens, logarytm dziesiętny, logarytm naturalny, funkcja wykładnicza, pierwiastek kwadratowy, itd.; Np.

sqrt

( x  2 + y  2) , sin(x+45) , itd; • Porównania, operatory i funkcje na stringach znaków: porównanie na porządek leksykograficzny stringów, zawieranie się stringów, obcięcie stringów, konkatenacja stringów, zamiana wszystkich liter na wersaliki i odwrotnie, określenie długości stringu, itd.

• Porównanie, operatory i funkcje na datach i czasie godzinowym: porównanie dat, porównanie czasu, zmiana czasu na liczbę sekund, itd.

© K.Subieta. Obiektowe języki zapytań 08, Folia 23 kwiecień 2004

Rodzaje operatorów algebraicznych (2)

• Funkcje arytmetyczne zagregowane:

sum

(suma liczb),

avg

(średnia),

min

(liczba minimalna),

max

(liczba maksymalna), itd. Argumentem takiej funkcji jest kolekcja liczb, zaś wynikiem - pojedyncza liczba. W SQL funkcje te nie są ortogonalne (niezależne), gdyż są związane z operatorem

group by

. Jest to konsekwencja wadliwej koncepcji. W naszym ujęcie takie związanie jest zbędne. Przykłady:

sum

(

Pracownik.zarobek

) ,

avg

(

bag

(25, 43, 47, 11) ) .

• Funkcja zliczająca liczbę elementów w kolekcji (w SQL usuwająca duplikaty z kolekcji (w SQL -

distinct count

), funkcja ), funkcja sprawdzająca, czy kolekcja nie jest pusta (w SQL -

exists

). W SQL funkcje te nie są składniowo ortogonalne. Będziemy tego unikać. Przykłady:

distinct

(

Pracownik.zawód

) ,

exists

(

count

(

Pracownik

) , Pracownik where zawód = ”

analityk

”) .

• Funkcja dereferencji; zwykle występuje

implicite

. Jest wywoływana wtedy, gdy pewną referencję trzeba zamienić na wartość. Np. w zapytaniu Pracownik where Zarobek > 2000 nazwa

Zarobek

zwróci referencję do danej

Zarobek

. Funkcja dereferencji jest wymuszona przez operator >. Funkcję dereferencji będziemy oznaczać

dereferencja

i przyjmować, że dla wartości

v

nie będącej referencją zwróci

v

.

© K.Subieta. Obiektowe języki zapytań 08, Folia 24 kwiecień 2004

Rodzaje operatorów algebraicznych (3)

• Operatory działające na multizbiorach: suma, przecięcie, iloczyn kartezjański, różnica, równość, zawieranie się, itd.

Przykłady: (

Prac.Nazwisko

)  (

Emeryt.Nazwisko

) (

Pracownik.Zawód

) 

bag(

analityk

”) • Analogiczne do powyższych, operatory na sekwencjach: konkatenacja sekwencji, obcięcie sekwencji poprzez usunięcie elementów z przodu lub z tyłu, porównanie sekwencji na równość, zawieranie się sekwencji, pobranie i tego elementu sekwencji itd.

• Operatory zmiany typu i/lub reprezentacji, czyli tzw.

koercje

: zmiana liczby rzeczywistej na string (i odwrotnie), zmiana liczby całkowitej na rzeczywistą (i odwrotnie), zmiana sekwencji na wielozbiór (i odwrotnie), itd. W zależności od liczby typów wprowadzonych do języka liczba tych operatorów może być znaczna.

• Konstruktory wartość złożonych: zmiana wartości na strukturę z etykietowanymi polami, zmiana wartości na wielozbiór lub sekwencję, itd.

• ...... itd.

© K.Subieta. Obiektowe języki zapytań 08, Folia 25 kwiecień 2004

Konstruktor struktur

  Składnia: (

q 1 , q 2 , q 3 ,...

) • gdzie

q 1 , q 2 , q 3 ,...

są zapytaniami zwracającymi pojedyncze elementy wartości atomowe, referencje lub bindery.

• Jeżeli

q i

zwraca

r i

, to wyrażenie (

q 1 , q 2 , q 3 ,...

) zwraca

struct

{

r 1 , r 2 , r 3 ,...

} • Np.: (2, 3, 5) , (

Nazwisko, Zar

) , ( Nazwisko as n , (

Zar

+100) as z , "p" as r ) Konstruktor ten uogólnimy do specyficznego "iloczynu Kartezjańskiego": • Jeżeli dowolny argument konstruktora struktury jest wielozbiorem, to pozostałe też muszą być wielozbiorami.

• Jeżeli wśród nich są pojedyncze elementy to automatycznie są one traktowane jako jedno-elementowe wielozbiory. • Np. jeżeli

Prac

zwraca

bag

{

i 1

,

i 5

,

i 9

},

Dział

(

Prac

,

Dział

, 3) zwraca zwraca

bag

{

i 17

,

i 22

}, to

bag

{

struct

{

i 1

,

i 17

, 3},

struct

{

i 5

,

i 17

, 3},

struct

{

i 9

,

i 17

, 3}, 

struct

{

i 1

,

i 22

, 3},

struct

{

i 5

,

i 22

, 3},

struct

{

i 9

,

i 22

, 3} } Możliwe jest uogólnienie typu "

outer join

": jeżeli w (..,

q i-1 , q i , q i+1 ,..

)

q i

zwraca pusty wynik, to zapytanie jest równoważne (...,

q i-1 , q i+1 ,...

) .

© K.Subieta. Obiektowe języki zapytań 08, Folia 26 kwiecień 2004

Konstruktor wielozbiorów

  Składnia:

bag

(

q 1 , q 2 , q 3 ,...

) • gdzie

q 1 , q 2 , q 3 ,...

są zapytaniami zwracającymi pojedyncze elementy wartości atomowe, referencje lub bindery.

• Jeżeli

q i

zwraca

r i

, to wyrażenie

bag

(

q 1 , q 2 , q 3 ,...

) zwraca

bag

{

r 1 , r 2 , r 3 ,...

} • Np.:

bag

(2, 3, 5) ,

bag

(

Nazwisko, Nazwa

) ,

bag

("x" as r , "y" as r , "z"

as

r) Konstruktor ten uogólnimy dla argumentów będących wielozbiorami: • Jeżeli wśród argumentów konstruktora są pojedyncze elementy to automatycznie są one traktowane jako jedno-elementowe wielozbiory. • Np. jeżeli zapytanie

Lokacja

zwraca

bag

{ "Kielce", "Krosno" }, to zapytanie

bag

(

Lokacja

, "Radom", "Płock" ) zwraca

bag

{"Kielce", "Krosno", "Radom", "Płock" } • W innej terminologii konstruktor

bag

jest sumą wielozbiorów:

bag

(

q 1 , q 2 , q 3 ,...

) jest równoważne

q 1

union q

2

union q

3

union ... • przy czym jeżeli

q i

zwraca element

r i

, to jest on traktowany jak

bag

{

r i

}.

© K.Subieta. Obiektowe języki zapytań 08, Folia 27 kwiecień 2004

Operator definiowania pomocniczej nazwy

  Wiele zapytań wymaga zdefiniowania pomocniczych nazw.

• Są one istotnym środkiem konceptualizacji zapytań lub programów.

• Zwiększają moc języka: bez nich niektóre zapytania nie dadzą się wyrazić.

• Występują również jako "zmienne związane kwantyfikatorami", lub "jako zmienne iteracyjne" w konstrukcjach

for each ... do ...

• W SBA występują również jako etykiety struktur.

• SBQL, podobnie jak SQL, i w odróżnieniu od OQL, nie zmusza do używania pomocniczych nazw.

Generalnie, inne podejścia nie radzą sobie z tym pojęciem, w związku z tym rozwiązania są niespójne.

 W SBA i SBQL semantyka pomocniczych nazw jest potraktowana ogólnie i precyzyjnie, dzięki temu że: 

Każda

nazwa występująca w zapytaniu lub programie podlega tym samym regułom

zakresu i wiązania

, które zostały zrealizowane w postaci mechanizmu stosu środowisk. Dotyczy to także wszelkich pomocniczych nazw definiowanych wewnątrz zapytań.

© K.Subieta. Obiektowe języki zapytań 08, Folia 28 kwiecień 2004

Definicja nazwy jako operator algebraiczny

 Operator definiowania pomocniczej nazwy

as algebraicznym

parametryzowanym nazwą.

jest

unarnym operatorem

 Niech

q

będzie zapytaniem, które zwraca kolekcję Wówczas zapytanie

bag

{

x 1

,

x 2

,

x 3

, ...}.

q as n  zwróci kolekcję binderów

bag

{

n

(

x 1

), • Operator

as

n

(

x 2

),

n

(

x 3

), ...}.

etykietuje określoną nazwą każdą wartość zwróconą przez zapytanie będące jego argumentem.

• Operator ten nie zmienia charakteru kolekcji: w szczególności, jeżeli

q

zwraca

sequence

{

x 1

,

x 2

,...}, to q as n zwraca

sequence

{

n

(

x 1

),

n

(

x 2

),...}.

• Operator ( q as n

1

)

as

as n może być zagnieżdżany: np. jeżeli

2 q

zwraca

bag

{

x 1

,

x 2

,

x 3

, ...}, to zwraca

bag

{

n 2

(

n 1

(

x 1

) ),

n 2

(

n 1

(

x 2

) ),

n 2

(

n 1

(

x 3

) ), ...} Powyższa definicja wydaje się banalna, ale okazuje się uniwersalna i precyzyjna, zwiększająca znacznie potencjał dla optymalizacji zapytań.

© K.Subieta. Obiektowe języki zapytań 08, Folia 29 kwiecień 2004

Przykład działania operatora as

Zapytanie Prac Wynik i 1 i 6 i 11 Prac

as

p p( i 1 p( i 6 p( i 11 ) ) ) © K.Subieta. Obiektowe języki zapytań 08, Folia 30 kwiecień 2004

Zastosowania operatora as

 „Zmienne” (krotkowe, dziedzinowe, itd.) definiowane w ramach klauzulami

from

w językach takich jak SQL i OQL; np.

Prac as p .

• Pokażemy, że operator zależnego złączenia znany z OQL i SQL-99 jest ortogonalny w stosunku do operatora

as

, wobec czego nie zachodzi potrzeba definiowania go w tym szczególnym kontekście;  Zmienna związana kwantyfikatorem, np.

Prac as p (p.Zar > 10000);  Etykiety składników struktur zwracanych przez zapytanie, np.

Prac

.( Nazwisko as n , Zar as z ) ;  Kursor w zdaniu

for each

; np.

for each Prac as p do p.Zar :=

p.Zar

+100;  Definicja nowych nazw atrybutów dla wirtualnej perspektywy (

view

); np: create view BogatyProjektant {

return

( Prac where Stan = ”

projektant

and Zar > 10000). ( Nazwisko as N, PracujeW as NrD ) }; © K.Subieta. Obiektowe języki zapytań 08, Folia 31 kwiecień 2004

Operator group as

  Podobny do operatora

as

.

Jeżeli

q

zwraca pewną wartość

r

(w szczególności, kolekcję), to q group as n zwraca pojedynczy binder

n

(

r

). • W odróżnieniu od operatora

as

, operator

group as

przypisuje nazwę n do rezultatu całości zapytania, a nie do poszczególnych elementów kolekcji zwracanej przez to zapytanie. Zapytanie Prac Prac

group as

p Wynik

bag

{ i 1 , i 6 , i 11 } p(

bag

{ i 1 , i 6 , i 11 } )  Operator

group as

powstał w wyniku prób sformalizowania mętnej semantycznie klauzuli

group by

języka OQL.

• Głównym motywem była "ortogonalizacja" tej klauzuli. I to się udało.

© K.Subieta. Obiektowe języki zapytań 08, Folia 32 kwiecień 2004