Temat : SBQL1 obiektowy język zapytań. - Dydaktyka

Transkrypt

Temat : SBQL1 obiektowy język zapytań. - Dydaktyka
Laboratorium
Języki i środowiska przetwarzania danych rozproszonych
Temat : SBQL1
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 (SBA2) do języków
zapytań i baz danych autorstwa prof. Kazimierza Subiety z PJWSTK3.
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
Prac
NrP
Nazwisko
Stan
Zar
PracujeW
Dział
NrD
Nazwa
Szef
Lokacje
NrD
Lokacja
Strzałki modelują asocjacje;
prowadzą od klucza obcego
do głównego
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
Zatrudnia[0..*]
PracujeW[0..1]
Kieruje[0..1]
Dział [0..*]
Nazwa
Lokacja[1..*]
Szef
Asocjacje są zrealizowane jako
(bliźniacze) obiekty pointerowe
Ilustracja 2: Przykładowy schemat obiektowej bazy danych
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.