Obiektowe języki zapytań 1..5

Download Report

Transcript Obiektowe języki zapytań 1..5

Języki i środowiska programowania
systemów rozproszonych
Wykład 6
Język SBQL (StackBased Query Language)
(1)
Wykładowca: Tomasz Kowalski
Wykłady przygotowane na
podstawie materiałów
prof. Kazimierza Subiety
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 1
2011
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 V jest zwany w językach
programowania literalem;
• Niedobrym terminem jest stała, gdyż następuje tu kolizja znaczeniowa z
niemodyfikowalnym elementem składu obiektów.
 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 2
2011
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. Osoba, Student,
zarobek, wiek.
 Zapytania można łączyć w większe zapytania przy pomocy
operatorów.
• 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 jest ciągiem trzech znaków, który oznacza
sumującą funkcję zagregowaną.
• Operatory będą podzielone na unarne i binarne, oraz algebraiczne i
nie-algebraiczne.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 3
2011
Składnia SBQL (3)
 Jeżeli  jest oznaczeniem operatora algebraicznego unarnego, zaś q jest
zapytaniem, wówczas ( q ) jest zapytaniem.
• 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ś q1 i q2
są zapytaniami, wówczas q1  q2 jest zapytaniem.
• Przykładami operatorów algebraicznych binarnych są: =, +, -, *, /, <, >, and,
or, union, itd. Przecinek jest operatorem algebraicznym - konstruktorem
struktur i kolekcji.
 Jeżeli  jest oznaczeniem operatora nie-algebraicznego, zaś q1 i q2 są
zapytaniami, wówczas q1  q2 jest zapytaniem.
• 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ę q1( q2 ) oraz q1( q2 ); jest
ona równoważna podanej wyżej uniwersalnej składni q1q2 i q1q2
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 4
2011
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
jest
zapytaniem. Operator group as jest podobny do as, o nieco innej semantyce.
 Jeżeli q jest zapytaniem, to (q) jest zapytaniem.
 Jeżeli n N jest nazwą procedury, funkcji, lub metody posiadającej k
parametrów, zaś q1, q2, ... , qk są zapytaniami, wówczas n(q1; q2; ... , qk)
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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 5
2011
Przykładowe zapytania
2000
"Kowalski"
zarobek
Osoba
2+2
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)
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 6
2011
Podsumowanie składni SBQL
zapytanie ::= L
zapytanie ::= N
zapytanie ::= operUna zapytanie
zapytanie ::= operUna ( zapytanie )
zapytanie ::= zapytanie operBin zapytanie
zapytanie ::= zapytanie operNieAlg zapytanie
operNieAlg ::= where | .| join |  | 
zapytanie ::= zapytanie ( zapytanie )
zapytanie ::=  zapytanie ( zapytanie )
zapytanie ::= zapytanie as N
zapytanie ::= zapytanie group as N
zapytanie ::= ( zapytanie )
zapytanie ::= N ( )
zapytanie ::= N ( parametr {; 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 7
2011
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
Nazwa Osoba
Prawe podzapytanie
Operator algebraiczny =
Lewe podzapytanie
Operator deref
Prawe podzapytanie
Literał ”Nowak”
Nazwa Nazwisko
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 8
2011
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ń.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 9
2011
Przykład działania stosu rezultatów
Wyrażenie
Odwrotna notacja polska
(2 *((5 + 3 ) / 4)) - 1
pusty
2
5
2
3
+
5
2
253+4/*1-
8
2
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 10
4
8
2
/
2
2
* 4
1
4
-
3
2011
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ę abstrakcyjnej implementacji, która jest zaletą
podejścia stosowego. Dzięki temu nasze rozważania teoretyczne można dość
łatwo zaimplementować;
• 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ń.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 11
2011
Operatory działające na stosie QRES
 Stos QRES jest abstrakcyjną strukturą danych obsługiwaną przez cztery
operatory:
• 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 12
2011
Przykład zawartości stosu QRES
15
wierzchołek stosu jedyny widoczny element
i17
struct{ x(i61), y(i93) }
bag{
struct{ n("Nowak"), s(i9)},
struct{ n("Stec"),
s(i14)},
struct{ n("Mikuła" ), s(i18)}}
niewidoczne
elementy stosu
dół stosu
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 13
2011
Ogólna architektura elementów semantyki
Stos środowisk
ENVS
referencje
do obiektów
Operatory
niealgebraiczne
Skład obiektów
Ewaluacja
zapytań
Obiekty trwałe
Stos rezultatów
QRES
referencje
do obiektów
Obiekty ulotne
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 14
2011
Procedura ewaluacji zapytań eval (evaluation)
 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 nie zmienia tej części QRES,
którą zastała w momencie rozpoczęcia ewaluacji.
 Semantyka będzie sterowana abstrakcyjną składnią.
• Procedura eval jest wspomagana przez analizator gramatyczny (parser).
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 15
2011
Działanie procedury eval
rezultat zapytania q
poprzedni stan
QRES
eval( q )
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ć print lub operator SQL delete oznaczający
usunięcie danych, np.:
delete Osoba where Nazwisko = ”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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 16
2011
Wynik procedury eval dla elementarnych zapytań
 Jeżeli zapytanie jest literalem l  L, to procedura eval wkłada
odpowiadającą mu wartość atomową l  V 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;
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 17
2011
Operatory algebraiczne i nie-algebraiczne
 Operatory łączące zapytania będziemy dzielić na algebraiczne i niealgebraiczne.
• Istotą podejścia stosowego są operatory nie-algebraiczne.
 Fundamentalna różnica pomiędzy operatorami algebraicznymi i niealgebraicznymi 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 18
2011
Operatory algebraiczne
 Cechą dowolnej algebry jest m.in. to, że w wyrażeniu x1  x2 (gdzie  jest
operatorem algebry) kolejność ewaluacji argumentów x1 oraz x2 tego
operatora nie ma znaczenia. Jest to zasadnicza różnica w stosunku do
operatorów nie-algebraicznych.
 W matematycznym (denotacyjnym) sformułowaniu wynik zapytań ( q1 )
oraz q1  q2 można zapisać jako:
wynik( ( q1 ) ) =  ( wynik( q1 ) )
 jest implementacją 
wynik( q1  q2 ) = wynik( q1 )  wynik( q2 )
 Funkcja wynik jest parametryzowana stanem, ale jej definicja nie
odwołuje się do tego stanu bezpośrednio.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 19
2011
Funkcja eval dla operatorów algebraicznych
procedure eval( q : zapytanie )
begin
.....
case q jest rozpoznane jako ( q1 ) lub  q1:
begin
wynik_q1: Rezultat; (* lokalna zmienna typu Rezultat *)
eval( q1 );
(* rezultat q1 na wierzchołku stosu QRES *)
wynik_q1 := top( QRES ); pop( QRES );
push( QRES,  ( wynik_q1 );
end;
case q jest rozpoznane jako q1  q2 :
begin
wynik_q1, wynik_q2: Rezultat; (* lokalne zmienne *)
eval( q1 ); (* rezultat q1 na wierzchołku stosu QRES *)
eval( q2 ); (* rezultat q2 na wierzchołku stosu QRES *)
wynik_q2 := top( QRES ); pop( QRES );
wynik_q1 := top( QRES ); pop( QRES );
push( QRES, wynik_q1  wynik_q2 );
end;
case .....
.....
end;
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 20
2011
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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 21
2011
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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 22
2011
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 - count), funkcja
usuwająca duplikaty z kolekcji (w SQL - distinct), 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:
count(Pracownik) ,
distinct(Pracownik.zawód) , exists(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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 23
2011
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 itego 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 24
2011
Konstruktor struktur
 Składnia: ( q1, q2, q3,...)
• gdzie q1, q2, q3,... są zapytaniami zwracającymi pojedyncze elementy wartości atomowe, referencje lub bindery.
• Jeżeli qi zwraca ri, to wyrażenie ( q1, q2, q3,...) zwraca struct{ r1, r2, r3,...}
• 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{i1, i5, i9}, Dział zwraca bag{i17, i22}, to
(Prac, Dział, 3) zwraca
bag{ struct{i1, i17, 3}, struct{i5, i17, 3}, struct{i9, i17, 3},
struct{i1, i22, 3}, struct{i5, i22, 3}, struct{i9, i22, 3} }
 Możliwe jest uogólnienie typu "outer join": jeżeli w (.., qi-1, qi, qi+1,..)
qi zwraca pusty wynik, to zapytanie jest równoważne (..., qi-1, qi+1,...) .
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 25
2011
Konstruktor wielozbiorów
 Składnia: bag( q1, q2, q3,...)
• gdzie q1, q2, q3,... są zapytaniami zwracającymi pojedyncze elementy wartości atomowe, referencje lub bindery.
• Jeżeli qi zwraca ri, to wyrażenie bag( q1, q2, q3,...) zwraca bag{ r1, r2, r3,...}
• 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( q1, q2, q3,...) jest równoważne q1 union q2 union q3 union ...
• przy czym jeżeli qi zwraca element ri , to jest on traktowany jak bag{ri}.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 26
2011
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ń.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 27
2011
Definicja nazwy jako operator algebraiczny
 Operator definiowania pomocniczej nazwy as jest unarnym operatorem
algebraicznym parametryzowanym nazwą.
 Niech q będzie zapytaniem, które zwraca kolekcję bag{x1, x2, x3, ...}.
Wówczas zapytanie
q as n
zwróci kolekcję binderów bag{ n(x1), n(x2), n(x3), ...}.
• Operator as 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{x1, x2,...}, to q as n zwraca sequence{ n(x1), n(x2),...}.
• Operator as może być zagnieżdżany: np. jeżeli q zwraca bag{x1, x2, x3, ...}, to
(q as n1) as n2 zwraca bag{ n2( n1(x1) ), n2( n1(x2) ), n2( n1(x3) ), ...}
 Powyższa definicja wydaje się banalna, ale okazuje się uniwersalna i
precyzyjna, zwiększająca znacznie potencjał dla optymalizacji zapytań.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 28
2011
Przykład działania operatora as
Zapytanie
Prac
Prac as p
Wynik
i1
i6
i11
p( i1 )
p( i6 )
p( i11 )
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 29
2011
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
Prac.( Nazwisko as n, Zar as z ) ;
przez
zapytanie,
np.
 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) };
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 30
2011
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
Wynik
Prac
bag{ i1, i6, i11 }
Prac group as p
p( bag{ i1, i6, i11 } )
 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.
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 31
2011