Języki i środowiska programowania systemów rozproszonych

31
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 1 2011 Języki i środowiska programowania systemów rozproszonych Wykładowca: Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety Wykład 6 Język SBQL (Stack- Based Query Language) (1)

description

Języki i środowiska programowania systemów rozproszonych. Wykład 6 Język SBQL (Stack-Based Query Language) (1). Wykładowca : Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety. Składnia SBQL (1). - PowerPoint PPT Presentation

Transcript of Języki i środowiska programowania systemów rozproszonych

Page 1: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 1 2011

Języki i środowiska programowania systemów rozproszonych

Wykładowca: Tomasz Kowalski

Wykłady przygotowane na podstawie materiałówprof. Kazimierza Subiety

Wykład 6Język SBQL (Stack-Based Query Language) (1)

Page 2: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 2 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.

Page 3: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 3 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.

Page 4: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 4 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 q1q2 i q1q2

Page 5: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 5 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.

Page 6: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 6 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)

Page 7: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 7 2011

Podsumowanie składni SBQL

zapytanie ::= L zapytanie ::= Nzapytanie ::= operUna zapytaniezapytanie ::= operUna ( zapytanie )zapytanie ::= zapytanie operBin zapytaniezapytanie ::= zapytanie operNieAlg zapytanieoperNieAlg ::= where | .| join | | zapytanie ::= zapytanie ( zapytanie )zapytanie ::= zapytanie ( zapytanie )zapytanie ::= zapytanie as N zapytanie ::= zapytanie group as Nzapytanie ::= ( zapytanie )zapytanie ::= N ( )zapytanie ::= N ( parametr {; parametr} )parametr ::= zapytanie

L V jest zbiorem literaliN jest zbiorem nazwoperUna jest operatorem algebraicznym unarnymoperBin jest operatorem algebraicznym binarnymoperNieAlg jest operatorem nie-algebraicznymMoż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.

Page 8: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 8 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

Lewe podzapytanie Prawe podzapytanie

Operator niealgebraiczny where

Lewe podzapytanie Prawe podzapytanie

Nazwa Nazwisko

Operator algebraiczny = Nazwa Osoba

Operator deref Literał ”Nowak”

Page 9: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 9 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ń.

Page 10: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 10 2011

Przykład działania stosu rezultatów

(2 *((5 + 3 ) / 4)) - 1 2 5 3 + 4 / * 1 -

Wyrażenie Odwrotna notacja polska

2 25

253

284

22

41

4 3pusty 28+ /

* -

Page 11: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 11 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ń.

Page 12: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 12 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.

Page 13: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 13 2011

15

i17

struct{ x(i61), y(i93) }

bag{ struct{ n("Nowak"), s(i9)}, struct{ n("Stec"), s(i14)},

struct{ n("Mikuła" ), s(i18)}}

Przykład zawartości stosu QRES

dół stosu

wierzchołek stosu - jedyny widoczny element

niewidoczne elementy stosu

Page 14: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 14 2011

Ogólna architektura elementów semantyki

Skład obiektów Obiekty trwałe

Obiekty ulotne

Stos środowiskENVS Stos rezultatów

QRESEwaluacjazapytań

Operatoryniealgebraiczne

referencjedo obiektów

referencjedo obiektów

Page 15: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 15 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).

Page 16: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 16 2011

poprzedni stan QRES

eval( q )

rezultat zapytania q

poprzedni stan QRES

Działanie procedury eval

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.

Page 17: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 17 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;

Page 18: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 18 2011

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.

Page 19: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 19 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.

Page 20: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 20 2011

Funkcja eval dla operatorów algebraicznychprocedure 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;

Page 21: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 21 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.

Page 22: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 22 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( x2 + y2) , 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.

Page 23: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 23 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.

Page 24: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 24 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 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.

Page 25: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 25 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,...) .

Page 26: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 26 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}.

Page 27: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 27 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ń.

Page 28: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 28 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ń.

Page 29: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 29 2011

Przykład działania operatora as

i1

i6

i11

Prac

p( i1 )p( i6 )p( i11 )

Prac as pZapytanie

Wynik

Page 30: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 30 2011

Zastosowania operatora as

create view BogatyProjektant{ return (Prac where Stan = ”projektant” and Zar > 10000). (Nazwisko as N, PracujeW as NrD) };

„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:

Page 31: Języki i środowiska programowania systemów rozproszonych

Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd 31 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.

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.

bag{ i1, i6, i11 }

PracZapytanie

Wynik

Prac group as p

p( bag{ i1, i6, i11 } )