Laboratorium Języki i środowiska przetwarzania danych rozproszonych Temat : SBQL 1 obiektowy język zapytań. Historia zmian Data Wersja Autor Opis zmian 23.4.2012 1.0 Tomasz Kowalski Utworzenie dokumentu na podstawie materiałów z 2011. 11.5.2012 1.1 Tomasz Kowalski Wskazówki do zadań. 14.11.2013 1.2 Tomasz Kowalski Aktualizacja formy 1 Stack-Based Query Language
1. Cel laboratorium Głównym celem laboratoriów jest zapoznanie się podstawami obiektowego języka zapytań SBQL (Stack-based Query Language) wywodzącego się z podejścia stosowego (SBA 2 ) do języków zapytań i baz danych autorstwa prof. Kazimierza Subiety z PJWSTK 3. Ze względu na kompozycyjność języka SBQL, pojęcie zapytania w systemie ODRA odnosi się praktycznie do wszystkich wyrażeń spotykanych w językach programowania. Zapytaniem jest proste wyrażenie składające się z np. z liczby ciągu znaków czy nazwy. Bardziej skomplikowane zapytania budowane są poprzez łączenie pod-zapytań za pomocą operatorów. Ważną cechą języka SBQL jest iż, poza znanymi z języków programowania operatorami, wprowadza on również zestaw tzw. operatorów nie-algebraicznych, które umożliwiają wykonywanie operacji na kolekcjach. To właśnie ta grupa operatorów wprowadza na poziom języka programowania, znane z języków zapytań, konstrukcje takie jak selekcja projekcja, złączenie czy kwantyfikatory. Co bardzo istotne, semantyka tych operatorów została zdefiniowana za pomocą tych samych elementów co pozostałe elementy języka (z technicznego punktu widzenia, podstawowym wyróżnikiem operatorów niealgebraicznych jest wpływ na środowisko przetwarzania reprezentowane przez stos środowisk). Umożliwia to wykorzystanie pełnej mocy języka programowania oraz języka zapytań (włącznie z operacjami aktualizacji) w jednym, homogenicznym środowisku przetwarzania. Cecha ta jest inherentna dla semantyki architektury stosej i opartego na nim języka SBQL. 2. Zasoby 2.1. Wymagane oprogramowanie Polecenia laboratorium będą dotyczyły podstaw programowania przy użyciu platformy ODRA. Wersję ODRA przygotowana na potrzeby laboratoriów należy wyeksportować z repozytorium svn: http://team.kis.p.lodz.pl:8080/svn/samples/trunk/odra2 Do uruchomienia systemu ODRA potrzebne będzie środowisko uruchomieniowe JRE (Java Runtime Environment). 2.1. Materiały pomocnicze Materiały dostępne w Internecie: http://www.sbql.pl/ http://www.sbql.pl/sba_sbql_description.html http://www.sbql.pl/various/odra/odra_manual_sbql_queries.html 3. Laboratorium: 1. Do nowego folderu wyeksportuj z repozytorium svn platformę ODRA. 2. Zapoznaj się ze strukturą plików pobranej wersji ODRA. 3. Uruchom edytor notepad++. Zaimportuj styl języka platformy ODRA z pliku notepadsbqlcli.xml. (Widok->Definiowanie własnego stylu->import). Zrestartuj edytor. 4. Użyj skryptu easystart.bat w celu utworzenia bazy, uruchomienia serwera ODRA oraz interfejsu poleceń CLI (Command Line Interface). 2 Stack-based Architecture 3 Polsko-Japońska Wyższa Szkoła Technik Komputerowych
Schemat relacyjny Adres NrP Miasto Ulica NrDomu Ilustracja 1: Przykładowy schemat relacyjnej bazy danych Na ilustracji 1 przedstawiony jest przykładowy schemat relacyjnej bazy danych. Jego obiektowy odpowiednik znajduje się na ilustracji 2. Oba schematy są zgodne z modelem AS0, więc można je odpytywać za pomocą języka SBQL, natomiast języka SQL można używać tylko odnośnie schematu relacyjnego. Schemat obiektowy (diagram klas) Prac[0..*] Nazwisko Stan Zar Adres [0..1] Miasto Ulica NrDomu Prac NrP Nazwisko Stan Zar PracujeW PracujeW[0..1] Kieruje[0..1] Dział NrD Nazwa Szef Zatrudnia[0..*] Szef Ilustracja 2: Przykładowy schemat obiektowej bazy danych Lokacje NrD Lokacja Strzałki modelują asocjacje; prowadzą od klucza obcego do głównego Dział [0..*] Nazwa Lokacja[1..*] Asocjacje są zrealizowane jako (bliźniacze) obiekty pointerowe Uruchom skrypt ODRA znajdujący się w pliku res/lab1/batch/my1stdb.cli tak, aby utworzył on bazę danych o schemacie przedstawionym na ilustracji 2. Twoim zadaniem jest ułożenie zapytań do załączonych schematów oraz analiza zapytań. Zadania domyślnie dotyczą schematu obiektowego. Zakładamy, że platforma ODRA wykonuję automatycznie operację dereferencji na finalnym rezultacie. Potencjalnemu użytkownikowi domyślnie zależy na sprawdzeniu wartości obiektów, a nie ich referencji. 3.1. Proste zapytania 1. Podaj pełną informację o pracownikach. (analogicznie do zapytania SQL: select * from Prac) Co zwraca zapytanie SQL? Co zwraca zapytanie SBQL? (bez dereferencji i z dereferencją) 2. Podaj nazwiska wszystkich pracowników. Jaki jest odpowiednik SQL? Wskaż lukier syntaktyczny zapytania SQL. Co zwraca zapytanie SBQL? 3. Podaj pełną informację o Kowalskim.
4. Podaj zarobek Kowalskiego. Jaki jest odpowiednik SQL? Użyj rezultat zapytania (bez dereferencji) do aktualizacji zarobku Kowalskiego. Jaki jest odpowiednik aktualizacji w SQL? 5. Podaj nazwiska i stanowiska pracowników zarabiających więcej niż 3000. 6. Podaj referencje do obiektu PracujeW dla pracownika Kowalskiego. Dokanaj jawnej dereferencji rezultatu tego zapytania. Wyjaśnij sens rezultatu. 3.2. Wyrażenia ścieżkowe 1. Podaj pełne dane o dziale, w którym pracuje Kowalski, bez jawnego użycia operatora dereferencji. 2. Podaj nazwę działu, w którym pracuje Kowalski. Napisz wersje zapytania z prawostronnym i lewostronnym nawiasowaniem operatora kropki. Jaki wpływ ma nawiasowanie na rezultat, a jaki wpływ na stos ENVS w trakcie przetwarzania zapytania. 3. Podaj nazwisko szefa pracownika Bleja. 4. Podaj nazwisko i miasto zamieszkania pracowników pracujących w Radomiu. Czy wyświetlono wszystkich pracowników pracujących w Radomiu? Jeżeli nie, to wyjaśnij dlaczego? 5. *Czy wyrażenia ścieżkowe są specjalną konstrukcją SBQL? Odpowiedź uzasadnij. 3.3. Zapytania złożone 1. Podaj wszystkie informacje o pracownikach zarabiających więcej od Kowalskiego. Wskazówka I: Wykorzystaj zapytanie 3.1.4 jako podzapytanie. wskazówka II: Napisz zapytanie podające informacje o pracownikach zarabiających więcej niż 2000 (możesz skorzystać z 3.1.5). 2. Przeanalizuj zapytanie Prac join (PracujeW.Dzial). Co ono zwraca? Co zwraca zapytanie SBQL bez dereferencji? Ułóż to samo zapytanie do schematu relacyjnego w SBQL i SQL. 3. Podaj informację o działach i średnich zarobkach pracowników w działach. Wskazówka I: Napisz zapytanie zwracające zarobek pracowników w dziale Magazyn. Wskazówka II: Napisz zapytanie zwracające średni zarobek pracowników w dziale Magazyn. Użyj funkcji agregującej avg tak aby jej argumentem było możliwie najmniejsze zapytanie. 4. Podaj średnią liczbę pracowników w działach (dla schematu obiektowego i relacyjnego). Wskazówka I: Napisz zapytanie zwracające wszystkich pracowników w dziale Magazyn. Wskazówka II: Napisz zapytanie zwracające liczbę wszystkich pracowników w dziale Magazyn. Użyj operatora count tak aby jego argumentem było możliwie najmniejsze
zapytanie. Wskazówka III: Zmodyfikuj poprzednie zapytanie, żeby zwracało kolekcję złożoną z liczb pracowników dla wszystkich działów. 5. Co oznaczają następujące zapytania i jaka jest między nimi różnica: Prac where forsome(adres)(miasto = Warszawa ) Prac where forall(adres)(miasto = Warszawa ) 6. Sprawdź czy wszyscy szefowie są zatrudnieni w działach, którymi kierują. Uwaga: zapytanie powinno zwrócić odpowiedź typu boolean (true lub false). Wskazówka I: Napisz zapytanie zwracające wszystkich szefów. Wskazówka II: Napisz zapytanie zwracające szefa oraz dział, którym kieruje. (Dopisz do poprzedniego zapytania operator join oraz opowiednie zapytanie po prawej stronie.) Wskazówka III: Napisz zapytanie zwracające szefa oraz dział, w którym pracuje. Wskazówka IV: Zbuduj zapytanie przy użyciu operatora forall. 7. Sprawdź poprawność bliźniaczych asocjacji, tzn.: czy szef działu nim kieruje, czy pracownik jest zatrudniony w dziale, w którym pracuje. Uwaga: zapytania powinny zwrócić odpowiedź typu boolean (true lub false). połącz oba zapytania w jedno. 8. Za pomocą konstrukcji imperatywnych dokonaj zmian w referencjach tak, aby dwa poprzednie zapytania zwróciły odpowiedź fałsz. 9. Podaj nazwiska i zarobki techników zarabiających więcej od swoich szefów. Wskazówka I: Napisz zapytanie zwracające techników. Wskazówka II: Napisz zapytanie zwracające szefów techników. Wskazówka III: Napisz zapytanie zwracające pracowników zarabiających więcej od swoich szefów.