SBQL - laboratorium - Dydaktyka

Transkrypt

SBQL - laboratorium - Dydaktyka
Laboratorium
Języki i środowiska programowania systemów 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ń.
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 podejścia stosowego 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:
https://dev.kis.p.lodz.pl:8443/svn/samples/trunk/jispsr/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 na dysku 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).
5. Na 10 minut przed końcem zajęć utwórz nowy folder zawierający standardową strukturę
projektu, tj. podkatalogi:
2 Stack-based Architecture
3 Polsko-Japońska Wyższa Szkoła Technik Komputerowych
•
branches – folder pomocniczy na potrzeby testowania eksperymentalnej
funkcjonalności (nie musi być używany w ciągu zajęć).
•
tags – folder zawierający tzw. snapshot-y postępów prac wykonywane pod koniec
każdych zajęć w kolejnych pod-folderach (lab1, lab2,... ). Snapshot należy wykonać
używając polecenia svn copy (w tortoiseSVN opcja Branch/tag...) z źródłem
ustawionym na folder trunk w zdalnym repozytorium i docelowym folderem labX.
Zmiany w folderze trunk powinny zostać uprzednio zacommitowane.
•
trunk – zawierający biężącą wersje rezultatów Twoich prac. Wyłącznie ten folder
powinien być checkout-owany w celu pracy na lokalnej wersji repozytorium.
6. Do katalogu trunk skopiuj pliki, które utworzyłeś bądź zmodyfikowałeś w trakcie zajęć.
7. Następnie zaimportuj zawartość swojego folderu do repozytorium svn o adresie podanym
przez prowadzącego (w tortoiseSVN opcja Import) do podfolderu o nazwie imię_nazwisko.
W tym folderze na repozytorium mają być przechowywane wyniki Twoich prac na
laboratoriach (t.j. pliki utworzone bądź zmodyfikowane w trakcie zajęć).
8. W celu otagowania pracy na laboratorium najpierw do PUSTEGO nowo utworzonego
folderu na dysku wykonaj checkout Twojego folderu trunk na repozytorium zdalnym (w
tortoiseSVN opcja SVN checkout...). Następnie wykonaj polecenie svn copy (tortoiseSVN
opcja Branch/tag...) ze źródłem ustawionym na zcheckout-owany folder (operacja svn copy
zostanie wykonana na folderze trunk w zdalnym repozytorium) i docelowym folderem lab1.
9. UWAGA: wyniki prac na laboratorium muszą być każdorazowo umieszczane w
repozytorium SVN w odpowiednim pod-folderze folderu tags. Braki w tym zakresie są
równoważne z brakiem obecności na zajęciach.
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.