Języki i środowiska przetwarzania danych rozproszonych

Podobne dokumenty
Temat : SBQL 1 obiektowy język zapytań.

Temat : SBQL 1 obiektowy język zapytań.

JPS. cwiczenia 3. Stosy, proste zapytania. Michał Lentner Polsko-Japońska Wyższa Szkoła Technik Komputerowych

Języki i środowiska przetwarzania danych rozproszonych

Przestrzenne bazy danych Podstawy języka SQL

Teoretyczne podstawy informatyki

Języki i Środowiska Programowania Baz Danych 2010/2011 PJWSTK, 2010

SBQL. język zapytań dla obiektowych baz danych. Kamil Adamczyk. Uniwersytet Warszawski 20.IV.2009

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

Systemy GIS Tworzenie zapytań w bazach danych

Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

SQL (ang. Structured Query Language)

Autor: Joanna Karwowska

Wprowadzenie do języka SQL

Autor: Joanna Karwowska

Interpreter Języka Zapytań SBQL dla Office Object Portal

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Metody Kompilacji Wykład 3

Język SQL. Rozdział 2. Proste zapytania

Języki programowania zasady ich tworzenia

BAZY DANYCH algebra relacyjna. Opracował: dr inż. Piotr Suchomski

Relacyjne bazy danych. Podstawy SQL

Bazy danych. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Bazy danych wykład trzeci. Konrad Zdanowski

Relacyjne bazy danych. Podstawy SQL

Technologie baz danych

3. Podzapytania, łączenie tabel i zapytań

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Bazy danych wykład dwunasty. dwunasty Wykonywanie i optymalizacja zapytań SQL 1 / 36

SQL - Structured Query Language. strukturalny język zapytań

RBD Relacyjne Bazy Danych

Metody Kompilacji Wykład 1 Wstęp

Podstawy Programowania Obiektowego

Wprowadzenie do baz danych

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Microsoft SQL Server Podstawy T-SQL

Ćwiczenie zapytań języka bazy danych PostgreSQL

Bazy danych. Plan wykładu. Przetwarzanie zapytań. Etapy przetwarzania zapytania. Translacja zapytań języka SQL do postaci wyrażeń algebry relacji

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

XQuery. sobota, 17 grudnia 11

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Model relacyjny. Wykład II

Wykład 6. SQL praca z tabelami 3

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Wykład XII. optymalizacja w relacyjnych bazach danych

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Aproksymacja funkcji a regresja symboliczna

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Zadania z SQLa (MS SQL Server)

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Fazy przetwarzania zapytania zapytanie SQL. Optymalizacja zapytań. Klasyfikacja technik optymalizacji zapytań. Proces optymalizacji zapytań.

Paradygmaty programowania

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Bazy danych 2. Wykład 4 Structured Query Language (SQL)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Wykład 3 Składnia języka C# (cz. 2)

Oracle11g: Wprowadzenie do SQL

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Sylabus do programu kształcenia obowiązującego od roku akademickiego 2014/15

1 Wstęp do modelu relacyjnego

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Semantyka i Weryfikacja Programów - Laboratorium 3

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

JAVAScript w dokumentach HTML (1)

Wstęp do informatyki- wykład 2

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Plan wykładu: Operacje relacji: suma, przekrój, różnica, złączenia proste, iloczyn kartezjański, złączenia teta.

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Programowanie Delphi obliczenia, schematy blokowe

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Rekurencja (rekursja)

Wykład 5. SQL praca z tabelami 2

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Liczby zespolone. x + 2 = 0.

Podstawy programowania skrót z wykładów:

Optymalizacja zapytań. Proces przetwarzania i obliczania wyniku zapytania (wyrażenia algebry relacji) w SZBD

Oracle PL/SQL. Paweł Rajba.

Wstęp do programowania

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Internet Semantyczny i Logika II

Cw.12 JAVAScript w dokumentach HTML

Programowanie obiektowe - zadania

Transkrypt:

Języki i środowiska przetwarzania danych rozproszonych Wykładowca: Tomasz Kowalski Język SBQL (Stack- Based Query Language) Operatory nie-algebraiczne Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 1 2013

Składnia SBQL (1) 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. 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. 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 niealgebraiczne. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 2 2013

Składnia SBQL (2) 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. Jeżeli jest oznaczeniem operatora algebraicznego binarnego, zaś q 1 i q 2 są zapytaniami, wówczas q 1 q 2 jest zapytaniem. Przykładami operatorów algebraicznych binarnych są: =, +, -, *, /, <, >, and, or, union, itd. Jeżeli jest oznaczeniem operatora nie-algebraicznego, zaś q 1 i q 2 są zapytaniami, wówczas q 1 q 2 jest zapytaniem. Przykładami operatorów nie-algebraicznych są: selekcja (where), projekcja lub nawigacja (.), zależne złączenie (join), kwantyfikatory, itd. Jeżeli q jest zapytaniem, zaś n N, wówczas q as n oraz q group as n są zapytaniami. Operatory te będziemy wykorzystywać w sytuacjach wymagających zdefiniowania pomocniczej nazwy. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 3 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 4 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 5 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 6 2013

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 rezultatów jest strukturą danych przechowywaną w pamięci operacyjnej. Zmienia się w trakcie obliczeń. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 7 2013

Przykład działania stosu rezultatów Wyrażenie Odwrotna notacja polska (2 *((5 + 3 ) / 4)) - 1 2 5 3 + 4 / * 1-3 4 + / 5 5 8 8 pusty 2 2 2 2 2 2 2 * 1-4 4 3 Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 8 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 9 2013

Przykład zawartości stosu QRES 15 wierzchołek stosu - jedyny widoczny element 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 )}} niewidoczne elementy stosu dół stosu Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 10 2013

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 Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 11 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 12 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 13 2013

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 ) ); end; case...... Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 14 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 15 2013

Operatory algebraiczne Cechą dowolnej algebry jest m.in. to, że w wyrażeniu x 1 x 2 (gdzie jest operatorem algebry) kolejność ewaluacji argumentów x 1 oraz x 2 tego operatora nie ma znaczenia. Jest to zasadnicza różnica w stosunku do operatorów nie-algebraicznych. W matematycznym (denotacyjnym) sformułowaniu wynik zapytań ( q 1 ) oraz q 1 q 2 można zapisać jako: wynik( ( q 1 ) ) = ( wynik( q 1 ) ) jest implementacją wynik( q 1 q 2 ) = wynik( q 1 ) wynik( q 2 ) Funkcja wynik jest parametryzowana stanem, ale jej definicja nie odwołuje się do tego stanu bezpośrednio. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 16 2013

Funkcja eval dla operatorów algebraicznych procedure eval( q : zapytanie ) begin... case q jest rozpoznane jako ( q 1 ) lub q 1 : begin 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 q 2 : begin 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 ); wynik_q1 := top( QRES ); pop( QRES ); push( QRES, wynik_q1 wynik_q2 ); end; case...... end; Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 17 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 18 2013

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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 19 2013

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. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 20 2013

Składnia: ( q 1, q 2, q 3,...) Konstruktor struktur 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ł zwraca bag{i 17, i 22 }, to (Prac, Dział, 3) zwraca: 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} }. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 21 2013

Składnia: bag( q 1, q 2, q 3,...) Konstruktor wielozbiorów 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 }. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 22 2013

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. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 23 2013

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{x 1, x 2, x 3,...}. Wówczas zapytanie q as n zwróci kolekcję binderów bag{ n(x 1 ), n(x 2 ), n(x 3 ),...}. 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{x 1, x 2,...}, to q as n zwraca sequence{ n(x 1 ), n(x 2 ),...}. Operator as może być zagnieżdżany: np. jeżeli q zwraca bag{x 1, x 2, x 3,...}, to (q as n 1 ) as n 2 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ń. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 24 2013

Przykład działania operatora as Zapytanie Prac Prac as p Wynik i 1 i 6 i 11 p( i 1 ) p( i 6 ) p( i 11 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 25 2013

Podobny do operatora as. Operator group 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. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 26 2013

Dlaczego operatory "niealgebraiczne"? 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. selekcja w wyrażeniu algebry relacyjnej: Zar>1000 ( Prac ) Koncepcja operatorów niealgebraicznych jest bardzo prosta oraz ma dobrze ugruntowane korzenie w semantyce języków programowania. Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 27 2013

Opis procedury eval dla operatora nie-algebr. Aby dokonać ewaluacji zapytania q 1 q 2 wykonaj następujące czynności: Dokonaj ewaluacji zapytania q 1. Zapytanie to zwraca wielozbiór elementów. Dla każdego elementu e należącego do wyniku q 1 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 q 2 w tym nowym środowisku. Oblicz wynik cząstkowy dla danego elementu e poprzez połączenie e z wynikiem zwróconym przez q 2. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 28 2013

Formalny zapis procedury eval dla oper. niealgebr. procedure eval( q : zapytanie ) begin... case q jest rozpoznane jako q 1 q 2 : (* q 1, q 2 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 q 1 *) wyniki_pośr := ; (* zerowanie kolekcji wyników pośrednich *) eval( q 1 ); (*q 1 zwraca kolekcję elementów; wynik q 1 na czubku stosu QRES *) for each e in top( QRES ) do (* iteracja po wszystkich elementach wyniku q 1 *) begin push( ENVS, nested( e ) ); (* nowa sekcja na stosie środowisk *) eval( q 2 ); (* wynik q 2 na czubku stosu QRES *) wynik_pośredni := połącz ( e, top( QRES ) ); (* połączenie e z wynikiem q 2 ; zależne od *) wyniki_pośr := wyniki_pośr U { wynik_pośredni }; (* akumulacja wyniku pośredniego *) pop( QRES ); (* usuniecie z QRES wyniku q 2 *) 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 q 1 *) push( QRES, wynik_końcowy ); (* włożenie na QRES końcowego wyniku *) end;... end; Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 29 2013

Poglądowy obraz małej bazy danych i 1 Prac i 2 Nazwisko Nowak i 3 Zar 2500 i 4 PracujeW i 5 Prac i 6 Nazwisko Kowalski i 7 Zar 2000 i 8 PracujeW i 9 Prac i 10 Nazwisko Barski i 11 Zar 900 i 12 Adres i 13 Miasto Radom i 14 Ulica Wolska i 15 NrDomu 12 i 16 PracujeW i 17 Dział i 18 Nazwa Produkcja i 19 Lokacja Kielce i 20 Lokacja Kraków i 21 Zatrudnia i 22 Dział i 23 Nazwa Sprzedaż i 24 Lokacja Radom i 25 Zatrudnia i 26 Zatrudnia Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 30 2013

Operator where (selekcja) Składnia: q 1 where q 2 Ograniczenie: podzapytanie q 2 zwraca wartość prawda lub fałsz. Semantyka Dla każdego elementu e zwróconego przez q 1, ENVS jest podwyższany o nested(e) Następnie ewaluowane jest q 2 Po ewaluacji q 2 stos ENVS wraca do poprzedniego stanu e należy do ostatecznego wyniku wyłącznie wtedy, gdy q 2 zwróciło prawda. Objaśnienie funkcji eval Funkcja połącz: dla danego e należącego do wyniku q 1 zwraca jednoelementowy wielozbiór { e } w przypadku, gdy dla tego e podzapytanie q 2 zwróciło prawda, lub pusty wielozbiór { }, jeżeli podzapytanie q 2 zwróciło fałsz. Funkcja sumuj: sumuje (mnogościowo) wszystkie wyniki pośrednie. Przykład: Prac where ( Zar > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 31 2013

Operator where - ilustracja działania Rezultat zwracany przez zapytanie Prac (wiązanie Prac) Iteracja po elementach e poprzedniego rezultatu: na ENVS wkłada się nested(e) Rezultat zwracany przez zapytanie Zar (wiązanie Zar) Rezultat dereferencji wymuszanej przez operator > Rezultat zwracany przez zapytanie 1000 Rezultat zwracany przez zapytanie Zar>1000 Końcowy rezultat zapytania i 1 Nazwisko(i 2 ) Zar(i 3 ) PracujeW(i 4 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 3 2500 1000 prawda i 1 Stan stosu ENVS przed ewaluacją i 5 Nazwisko(i 6 ) Zar(i 7 ) PracujeW(i 8 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 7 2000 1000 prawda i 5 Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 9 Nazwisko(i 10 ) Zar(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 11 900 1000 fałsz Prac where ( Zar > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 32 2013

Operator kropki (projekcja, nawigacja) Składnia: q 1. q 2 Semantyka Dla każdego elementu e zwróconego przez q 1, ENVS jest podwyższany o nested(e) Następnie ewaluowane jest q 2 Po ewaluacji q 2 stos ENVS wraca do poprzedniego stanu Ostateczny wynik jest sumą mnogościową wyników q 2 Objaśnienie funkcji eval Funkcja połącz: ignoruje e; zwraca wynik podzapytania q 2. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 33 2013

Operator kropki - ilustracja działania Rezultat zwracany przez zapytanie Prac (wiązanie Prac) Iteracja po elementach e poprzedniego rezultatu: na ENVS wkłada się nested(e) Rezultat zwracany przez zapytanie Zar (wiązanie Zar) Końcowy rezultat zapytania i 1 Nazwisko(i 2 ) Zar(i 3 ) PracujeW(i 4 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 3 i 3 Stan stosu ENVS przed ewaluacją i 5 Nazwisko(i 6 ) Zar(i 7 ) PracujeW(i 8 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 7 i 7 Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 9 Nazwisko(i 10 ) Zar(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 11 i 11 Prac. Zar Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 34 2013

Operator zależnego złączenia Składnia: q 1 join q 2 Semantyka Dla każdego e zwróconego przez q 1, ENVS jest podwyższany o nested(e) Następnie ewaluowane jest q 2 Po ewaluacji q 2 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 q 2 zwrócony dla tego e. Objaśnienie funkcji eval Funkcja połącz: zarówno e jak i każdy element e 2 zwracany przez q 2 traktuje jako struktury (jednoelementowe lub wieloelementowe). Dla każdego e 2 zwracanego przez q 2 tworzy strukturę poprzez połączenie e oraz e 2. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 35 2013

Operator zależnego złączenia - ilustracja działania Rezultat zwracany przez zapytanie Prac (wiązanie Prac) Iteracja po elementach e poprzedniego rezultatu: na ENVS wkłada się nested(e) Rezultat zwracany przez zapytanie Zar (wiązanie Zar) Końcowy rezultat zapytania i 1 Nazwisko(i 2 ) Zar(i 3 ) PracujeW(i 4 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 3 struct(i 1, i 3 ) Stan stosu ENVS przed ewaluacją i 5 Nazwisko(i 6 ) Zar(i 7 ) PracujeW(i 8 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 7 struct(i 5, i 7 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 9 Nazwisko(i 10 ) Zar(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 11 struct(i 9, i 11 ) Prac join Zar Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 36 2013

Operator sortowania Składnia: q 1 order by q 2 Semantyka Wykonywane jest zapytanie: q 1 join dereferencja( q 2 ) Wynik (bag) jest sortowany według części struktur zwróconej przez q 2. 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 q 1. 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 q 2. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 37 2013

Składnia: q 1 ( q 2 ) lub q 1 q 2 (lub w ODRA: forsome(q 1 ( q 2 )) ) Ograniczenie: podzapytanie q 2 zwraca wartość prawda lub fałsz. Semantyka Dla każdego e zwróconego przez q 1, ENVS jest podwyższany o nested(e) Następnie ewaluowane jest q 2 Po ewaluacji q 2 stos ENVS wraca do poprzedniego stanu Ostateczny wynik jest prawda wtedy i tylko wtedy, jeżeli dla co najmniej jednego e podzapytanie q 2 zwróciło prawda. Objaśnienie funkcji eval Kwantyfikator egzystencjalny Funkcja połącz: ignoruje e; zwraca wynik podzapytania q 2. Funkcja sumuj: Zwraca prawda jeżeli co najmniej jeden wynik pośredni zwrócony przez q 2 jest prawda; w przeciwnym wypadku zwraca fałsz. Przykład: foresome Prac ( Zar > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 38 2013

Składnia: q 1 ( q 2 ) lub q 1 q 2 (lub w ODRA: forall(q 1 ( q 2 )) ) Ograniczenie: podzapytanie q 2 zwraca wartość prawda lub fałsz. Semantyka Dla każdego e zwróconego przez q 1, ENVS jest podwyższany o nested(e) Następnie ewaluowane jest q 2 Po ewaluacji q 2 stos ENVS wraca do poprzedniego stanu Ostateczny wynik jest prawda wtedy i tylko wtedy, jeżeli dla wszystkich e podzapytanie q 2 zwróciło prawda. Jeżeli q 1 zwróciło pusty wielozbiór, to wynik także jest prawda. Objaśnienie funkcji eval Kwantyfikator uniwersalny Funkcja połącz: ignoruje e; zwraca wynik podzapytania q 2. Funkcja sumuj: Zwraca fałsz jeżeli co najmniej jeden wynik pośredni zwrócony przez q 2 jest fałsz ; w przeciwnym wypadku zwraca prawda. Przykład: forall Prac ( Zar > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 39 2013

Kwantyfikator uniwersalny - ilustracja działania Rezultat zwracany przez zapytanie Prac (wiązanie Prac) Iteracja po elementach e poprzedniego rezultatu: na ENVS wkłada się nested(e) Rezultat zwracany przez zapytanie Zar (wiązanie Zar) Rezultat dereferencji wymuszanej przez operator > Rezultat zwracany przez zapytanie 1000 Rezultat zwracany przez zapytanie Zar>1000 Końcowy rezultat zapytania i 1 Nazwisko(i 2 ) Zar(i 3 ) PracujeW(i 4 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 3 2500 1000 prawda Stan stosu ENVS przed ewaluacją i 5 Nazwisko(i 6 ) Zar(i 7 ) PracujeW(i 8 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 7 2000 1000 prawda fałsz Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 9 Nazwisko(i 10 ) Zar(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 11 900 1000 fałsz Prac ( Zar > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 40 2013

Kroki ewaluacji zapytania z pomocniczą nazwą Rezultat zwracany przez zapytanie Prac Rezultat zwracany przez zapytanie Prac 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 i 1 x(i 1 ) x(i 1 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 1 Nazwisko(i 2 ) Zar(i 3 ) PracujeW(i 4 ) x(i 1 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 3 2500 1000 prawda x(i 1 ) i 5 x(i 5 ) x(i 5 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 5 Nazwisko(i 6 ) Zar(i 7 ) PracujeW(i 8 ) x(i 5 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 7 2000 1000 prawda x(i 5 ) i 9 x(i 9 ) x(i 9 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 9 Nazwisko(i 10 ) Zar(i 11 ) Adres(i 12 ) PracujeW(i 16 ) x(i 9 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) i 11 900 1000 fałsz (Prac as x) where ( ( x. Zar ) > 1000 ) Języki i środowiska przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 41 2013

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 oraz np. LINQ są "tajemnicze" miejsca, w których zmienna dziedzinowa zmienia się w etykietę struktury. Dopiero na gruncie SBA widać jasno, dlaczego tak się dzieje. Wymagało to jednak bardzo istotnych założeń odnośnie semantyki. 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 przetwarzania danych rozproszonych, Wykład Stack-Based Query Language, Slajd 42 2013