Obiektowe języki zapytań 1..5 - Dydaktyka
Download
Report
Transcript Obiektowe języki zapytań 1..5 - Dydaktyka
Języki i środowiska programowania
systemów rozproszonych
Wykładowca: Tomasz Kowalski
Wykłady przygotowane na
podstawie materiałów
prof. Kazimierza Subiety
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 1
Wykład 7
Język SBQL (StackBased Query Language)
(2)
Operatory
niealgebraiczne,
2011
Dlaczego "niealgebraiczne"? (1)
Do nich należą operator where, operator kropki, kwantyfikatory, zależne
złączenie join, sortowanie (order by), i inne. Wszystkie są binarne.
Mimo podobieństwa do operatorów algebraicznych, semantyka
operatorów niealgebraicznych nie da się prosto sprowadzić do algebry.
• To zdanie może wydawać się niejasne. W modelu relacyjnym operatory
selekcji (operator where), projekcji (operator kropki) oraz złączenia są
przecież traktowane jako operatory algebraiczne algebry relacji.
• Tu właśnie jest nieporozumienie. Takie traktowanie jest możliwe wyłącznie
przy ograniczonej funkcjonalności, oraz po przyjęciu triku formalnego.
• Trik polega na tym, że część semantyki jest przenoszona na poziom
metajęzykowy. Operatory te są dodatkowo kwalifikowane wyrażeniem
metajęzykowym. Np. w wyrażeniu algebry relacyjnej:
Zar>1000( Prac )
operator selekcji jest kwalifikowany wyrażeniem metajęzykowym
Zar >1000. Operator selekcji nie jest pojedynczym operatorem, lecz
nieskończoną rodziną zawierającą tyle operatorów, ile jest warunków selekcji.
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 2
2011
Dlaczego "niealgebraiczne"? (2)
W podejściu stosowym dowolne operatory nie są indeksowane
wyrażeniami meta-językowymi.
• Nie występuje więc semantyczna schizofrenia nazw dzieląca je na
„językowe” i „meta-językowe”.
• Nie ma podziału na nazwy „pierwszej kategorii” i „drugiej kategorii”. Każda
nazwa ma dokładnie taką samą semantykę i podlega dokładnie tym samym
regułom wiązania i zakresu
• Podobnie z operatorami: nie występuje semantyczne zróżnicowanie
operatorów: operator < występuje na tym samym poziomie semantycznym jak
operator selekcji where.
Koncepcja operatorów niealgebraicznych jest bardzo prosta oraz ma
dobrze ugruntowane korzenie w semantyce języków programowania.
Definicja operatorów niealgebraicznych będzie się nieco różniła w
zależności od tego, który modelu składu (AS0 - AS3) będzie
rozpatrywany. Wszystkie te definicje będą bazowały na podanej niżej
podstawowej definicji dla modelu AS0.
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 3
2011
Opis procedury eval dla operatora nie-algebr.
Aby dokonać ewaluacji zapytania q1 q2 wykonaj następujące czynności:
• Dokonaj ewaluacji zapytania q1. Zapytanie to zwraca wielozbiór elementów.
• Dla każdego elementu e należącego do wyniku q1 wykonaj następujące
czynności:
• Oblicz wartość funkcji nested( e ). Wynik jest zbiorem binderów.
• Włóż obliczony zbiór binderów jako nową sekcje na wierzchołek stosu ENVS.
• Dokonaj ewaluacji zapytania q2 w tym nowym środowisku.
• Oblicz wynik cząstkowy dla danego elementu e poprzez połączenie e z wynikiem
zwróconym przez q2. Funkcja łącząca zależy od operatora .
• Usuń nowo wstawioną górną sekcję ze stosu ENVS.
• Zsumuj wszystkie wyniki cząstkowe w wynik końcowy. Sposób sumowania
sumuj ( U ) zależy od rodzaju operatora .
Stan stosu środowisk ENVS po zakończeniu ewaluacji jest taki sam, jak
przez rozpoczęciem ewaluacji.
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 4
2011
Formalny zapis procedury eval dla oper. niealgebr.
procedure eval( q : zapytanie )
begin
......
case q jest rozpoznane jako q1 q2 : (* q1 , q2 są zapytaniami, jest operatorem niealgebraicznym *)
begin
wyniki_pośr: bag of Rezultat;
(* lokalna kolekcja wyników pośrednich *)
wynik_pośredni: Rezultat;
(* lokalna zmienna na wynik pośredni *)
wynik_końcowy: Rezultat;
(* lokalna zmienna na wynik końcowy *)
e: Rezultat;
(* lokalna zmienna na element kolekcji zwracanej przez q1 *)
wyniki_pośr := ;
(* zerowanie kolekcji wyników pośrednich *)
eval( q1 ); (*q1 zwraca kolekcję elementów; wynik q1 na czubku stosu QRES *)
for each e in top( QRES ) do (* iteracja po wszystkich elementach wyniku q1 *)
begin
push( ENVS, nested( e ) );
(* nowa sekcja na stosie środowisk *)
eval( q2 );
(* wynik q2 na czubku stosu QRES *)
wynik_pośredni := połącz ( e, top( QRES ) ); (* połączenie e z wynikiem q2; zależne od *)
wyniki_pośr := wyniki_pośr U { wynik_pośredni }; (* akumulacja wyniku pośredniego *)
pop( QRES );
(* usuniecie z QRES wyniku q2 *)
pop( ENVS );
(* usuniecie z ENVS nowej sekcji *)
end;
wynik_końcowy := sumuj ( wyniki_pośr ); (* zsumowanie wyników pośrednich; zależne od *)
pop( QRES );
(* usuniecie z QRES wyniku q1 *)
push( QRES, wynik_końcowy );
(* włożenie na QRES końcowego wyniku *)
end;
.......
end;
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 5
2011
Poglądowy obraz małej bazy danych
i1
Prac
i2 Nazwisko ”Nowak”
i3 Zar 2500
i4 PracujeW
i5
Prac
i9
i6 Nazwisko ”Kowalski”
Prac
i10 Nazwisko ”Barski”
i7 Zar 2000
i11 Zar 900
i12 Adres
i8 PracujeW
i13 Miasto ”Radom”
i14 Ulica ”Wolska”
i15 NrDomu 12
i16 PracujeW
i17
Dział
i22
Dział
i18 Nazwa ”Produkcja”
i23 Nazwa ”Sprzedaż”
i19 Lokacja ”Kielce”
i24 Lokacja ”Radom”
i20 Lokacja ”Kraków”
i25 Zatrudnia
i21 Zatrudnia
i26 Zatrudnia
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 6
2011
Operator where (selekcja)
Składnia: q1 where q2
• Ograniczenie: podzapytanie q2 zwraca wartość prawda lub fałsz.
Semantyka
• Dla każdego elementu e zwróconego przez q1, ENVS jest podwyższany o
nested(e)
• Następnie ewaluowane jest q2
• Po ewaluacji q2 stos ENVS wraca do poprzedniego stanu
• e należy do ostatecznego wyniku wyłącznie wtedy, gdy q2 zwróciło prawda.
Objaśnienie funkcji eval
• Funkcja połącz: dla danego e należącego do wyniku q1 zwraca
jednoelementowy wielozbiór { e } w przypadku, gdy dla tego e podzapytanie
q2 zwróciło prawda, lub pusty wielozbiór { }, jeżeli podzapytanie q2 zwróciło
fałsz.
• Funkcja sumuj: sumuje (mnogościowo) wszystkie wyniki pośrednie.
Przykład: Prac where ( Zar > 1000 )
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 7
2011
Operator where - ilustracja działania
Rezultat
zwracany przez
zapytanie Prac
(wiązanie Prac)
i1
i5
Stan stosu ENVS
przed ewaluacją
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
i9
Prac
Iteracja po
elementach e
poprzedniego
rezultatu: na ENVS
wkłada się nested(e)
Rezultat
zwracany
przez
zapytanie Zar
(wiązanie Zar)
Nazwisko(i2) Zar(i3)
PracujeW(i4)
Rezultat Końcowy
zwracany rezultat
przez
zapytania
zapytanie
Zar>1000
Rezultat
dereferencji
wymuszanej
przez
operator >
Rezultat
zwracany
przez
zapytanie
1000
i3
2500
1000
prawda
i1
i7
2000
1000
prawda
i5
i11
900
1000
fałsz
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i6) Zar(i7)
PracujeW(i8)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i10) Zar(i11)
Adres(i12) PracujeW(i16)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
where
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 8
(
Zar
> 1000 )
2011
Operator kropki (projekcja, nawigacja)
Składnia: q1 . q2
Semantyka
• Dla każdego elementu e zwróconego przez q1, ENVS jest podwyższany o
nested(e)
• Następnie ewaluowane jest q2
• Po ewaluacji q2 stos ENVS wraca do poprzedniego stanu
• Ostateczny wynik jest sumą mnogościową wyników q2
Objaśnienie funkcji eval
• Funkcja połącz: ignoruje e; zwraca wynik podzapytania q2.
• Funkcja sumuj: sumuje (mnogościowo) wszystkie wyniki pośrednie.
Przykład: Prac . Zar
Operator kropki przykrywa tzw. wyrażenia ścieżkowe (path expressions)
w najbardziej uniwersalnej postaci, pozwalając je jednocześnie dowolnie
kombinować z innymi operatorami.
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 9
2011
Operator kropki - ilustracja działania
Rezultat
zwracany przez
zapytanie Prac
(wiązanie Prac)
i1
Iteracja po
elementach e
poprzedniego
rezultatu: na ENVS
wkłada się nested(e)
Nazwisko(i2) Zar(i3)
PracujeW(i4)
Rezultat
zwracany
przez
zapytanie Zar
(wiązanie Zar)
Końcowy
rezultat
zapytania
i3
i3
i7
i7
i11
i11
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
i5
Nazwisko(i6) Zar(i7)
PracujeW(i8)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Stan stosu ENVS
przed ewaluacją
i9
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i10) Zar(i11)
Adres(i12) PracujeW(i16)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Prac
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 10
.
Zar
2011
Operator zależnego złączenia
Składnia: q1 join q2
Semantyka
•
•
•
•
Dla każdego e zwróconego przez q1, ENVS jest podwyższany o nested(e)
Następnie ewaluowane jest q2
Po ewaluacji q2 stos ENVS wraca do poprzedniego stanu
Ostateczny wynik jest sumą mnogościową wszystkich struktur, w których na
początku jest e, zaś dalej jest element wyniku q2 zwrócony dla tego e.
Objaśnienie funkcji eval
• Funkcja połącz: zarówno e jak i każdy element e2 zwracany przez q2 traktuje
jako struktury (jednoelementowe lub wieloelementowe). Dla każdego e2
zwracanego przez q2 tworzy strukturę poprzez połączenie e oraz e2.
Wynikiem pośrednim jest kolekcja wszystkich takich struktur.
• Funkcja sumuj: sumuje (mnogościowo) wszystkie wyniki pośrednie.
Przykład: Prac join Zar
• Zależne złączenie jest zdefiniowane w ODMG OQL (klauzula from) w znacznie
ograniczonej postaci w stosunku do powyższej definicji.
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 11
2011
Operator zależnego złączenia - ilustracja działania
Rezultat
zwracany przez
zapytanie Prac
(wiązanie Prac)
i1
Iteracja po
elementach e
poprzedniego
rezultatu: na ENVS
wkłada się nested(e)
Nazwisko(i2) Zar(i3)
PracujeW(i4)
Rezultat
zwracany
przez
zapytanie Zar
(wiązanie Zar)
Końcowy
rezultat
zapytania
i3
struct(i1, i3)
i7
struct(i5, i7)
i11
struct(i9, i11 )
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
i5
Nazwisko(i6) Zar(i7)
PracujeW(i8)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Stan stosu ENVS
przed ewaluacją
i9
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i10) Zar(i11)
Adres(i12) PracujeW(i16)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Prac
join
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 12
Zar
2011
Operator sortowania
Składnia: q1 order by q2
Semantyka
• Wykonywane jest zapytanie: q1 join dereferencja( q2 )
• Wynik (bag) jest sortowany według części struktur zwróconej przez q2 .
Po posortowaniu wynik jest sekwencją.
• Końcowy wynik uzyskuje się poprzez projekcję tej sekwencji (bez zmiany
kolejności elementów na części struktur zwrócone przez q1 .
• Np. Prac order by Nazwisko
Prac order by ((PracujeW.Dział.Nazwa), Zarobek)
Operator ten można dodatkowo wyposażyć w kwalifikatory asc
(wzrastająco) i desc (malejąco) przy każdej składowej q2.
• Np. Prac order by ((PracujeW.Dział.Nazwa) asc, Zarobek desc)
• Operator asc jest komentarzem, operator desc jest odwrotnością wartości: np.
5 desc oznacza -5, "abceg" desc oznacza "zyxvt", itd.
Operator ten należy parametryzować (najlepiej konfiguracyjnie) funkcją
porównania elementów (zależną od języka: angielski, polski, niemiecki,.. ).
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 13
2011
Kwantyfikator egzystencjalny
Składnia: q1 ( q2 ) lub q1 q2 (lub w ODRA: forsome(q1 ( q2 )) )
• Ograniczenie: podzapytanie q2 zwraca wartość prawda lub fałsz.
Semantyka
•
•
•
•
Dla każdego e zwróconego przez q1, ENVS jest podwyższany o nested(e)
Następnie ewaluowane jest q2
Po ewaluacji q2 stos ENVS wraca do poprzedniego stanu
Ostateczny wynik jest prawda wtedy i tylko wtedy, jeżeli dla co najmniej
jednego e podzapytanie q2 zwróciło prawda.
Objaśnienie funkcji eval
• Funkcja połącz: ignoruje e; zwraca wynik podzapytania q2.
• Funkcja sumuj: Zwraca prawda jeżeli co najmniej jeden wynik pośredni
zwrócony przez q2 jest prawda; w przeciwnym wypadku zwraca fałsz.
Przykład: foresome Prac ( Zar > 1000 )
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 14
2011
Kwantyfikator uniwersalny
Składnia: q1 ( q2 ) lub q1 q2 (lub w ODRA: forall(q1 ( q2 )) )
• Ograniczenie: podzapytanie q2 zwraca wartość prawda lub fałsz.
Semantyka
•
•
•
•
Dla każdego e zwróconego przez q1, ENVS jest podwyższany o nested(e)
Następnie ewaluowane jest q2
Po ewaluacji q2 stos ENVS wraca do poprzedniego stanu
Ostateczny wynik jest prawda wtedy i tylko wtedy, jeżeli dla wszystkich e
podzapytanie q2 zwróciło prawda. Jeżeli q1 zwróciło pusty wielozbiór, to
wynik także jest prawda.
Objaśnienie funkcji eval
• Funkcja połącz: ignoruje e; zwraca wynik podzapytania q2.
• Funkcja sumuj: Zwraca fałsz jeżeli co najmniej jeden wynik pośredni
zwrócony przez q2 jest fałsz ; w przeciwnym wypadku zwraca prawda.
Przykład: forall Prac ( Zar > 1000 )
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 15
2011
Kwantyfikator uniwersalny - ilustracja działania
Rezultat
zwracany przez
zapytanie Prac
(wiązanie Prac)
i1
i5
Stan stosu ENVS
przed ewaluacją
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
i9
Prac
Iteracja po
elementach e
poprzedniego
rezultatu: na ENVS
wkłada się nested(e)
Rezultat
zwracany
przez
zapytanie Zar
(wiązanie Zar)
Nazwisko(i2) Zar(i3)
PracujeW(i4)
Rezultat
dereferencji
wymuszanej
przez
operator >
Rezultat
zwracany
przez
zapytanie
1000
Rezultat
zwracany
przez
zapytanie
Zar>1000
i3
2500
1000
prawda
i7
2000
1000
prawda
i11
900
1000
fałsz
Końcowy
rezultat
zapytania
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i6) Zar(i7)
PracujeW(i8)
fałsz
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Nazwisko(i10) Zar(i11)
Adres(i12) PracujeW(i16)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 16
(
Zar
> 1000 )
2011
Kroki ewaluacji zapytania z pomocniczą nazwą
Rezultat
zwracany
przez
zapytanie
Prac
i1
i5
i9
(Prac
Rezultat
zwracany
przez
zapytanie
Prac as x
x(i1)
x(i5 )
x(i9)
as x)
Iteracja po
elementach e
poprzedniego
rezultatu: na
ENVS wkłada
się nested(e)
Rezultat
zwracany
przez
zapytanie x
(wiązanie x)
Iteracja po
elementach e
poprzedniego
rezultatu: na
ENVS wkłada
się nested(e)
Rezultat
zwracany
przez
zapytanie
Zar
Rezultat
dereferencji
wymuszanej
przez operator
>
Rezultat
zwracany
przez
zapytanie
1000
Rezultat
zwracany
przez
zapytanie
Zar>1000
Końcowy
rezultat
zapytania
Nazwisko(i2) Zar(i3)
PracujeW(i4)
x(i1)
i3
2500
1000
prawda
x(i1)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Prac(i1) Prac(i5) Prac(i9) Dział(i17)
Dział(i22)
x(i5 )
i5
Nazwisko(i6) Zar(i7)
PracujeW(i8)
x(i5 )
2000
1000
prawda
x(i5 )
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
Prac(i1) Prac(i5) Prac(i9) Dział(i17)
Dział(i22)
i7
x(i9)
i9
Nazwisko(i10) Zar(i11)
Adres(i12) PracujeW(i16)
x(i9)
i11
900
1000
fałsz
i1
x(i1)
Prac(i1) Prac(i5) Prac(i9)
Dział(i17) Dział(i22)
where
Prac(i1) Prac(i5) Prac(i9) Dział(i17)
Dział(i22)
( ( x
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 17
.
Zar )
> 1000 )
2011
Zamiana "zmiennej" na etykietę struktury
Dla zapytania (Prac as x) where (( x . Zar ) > 1000 ) końcowy wynik
jest różny od wyniku zapytania Prac where Zar > 1000 , mianowicie,
elementy wyniku są opatrzone nazwą x.
Elementy takie można uważać za proste struktury (w sensie języków
C/C++), których jedynym polem jest pole o nazwie x.
• W standardzie ODMG są "tajemnicze" miejsca, w których zmienna
dziedzinowa zmienia się w etykietę struktury. Standard tego nie wyjaśnia.
• Dopiero na gruncie SBA widać jasno, dlaczego tak się dzieje. Wymagało to
jednak bardzo istotnych założeń odnośnie semantyki. Standard ODMG jest
semantycznie nieprecyzyjny, więc nie jest w stanie tego wyjaśnić.
• Tego efektu nie można także wyjaśnić na gruncie „algebry obiektowej”,
„rachunku obiektowego”, lub innego tradycyjnego formalizmu.
Można pokazać, że zapytanie Prac where Zar > 1000 jest równoważne
zapytaniu ((Prac as x) where (( x . Zar ) > 1000 )) . x
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd 18
2011