470 likes | 563 Views
PySBQL. Język zapytań dla obiektowych baz danych. Aplikacje bazodanowe. Główny nurt budowania aplikacji opiera się na połączeniu: SQL JDBC Java Jak wyświetlić pensję Kowalskiego?. SQL+JDBC+Java. Connection conn; ResultSet R; Statement s; ... s=conn.createQuery(); ...
E N D
PySBQL Język zapytań dla obiektowych baz danych
Aplikacje bazodanowe • Główny nurt budowania aplikacji opiera się na połączeniu: • SQL • JDBC • Java • Jak wyświetlić pensję Kowalskiego?
SQL+JDBC+Java Connection conn; ResultSet R; Statement s; ... s=conn.createQuery(); ... R=s.executeQuery( "SELECT salary FROM empl WHERE sname = 'SMITH'"); while (R.next()){ System.out.println (R.getString(1)); }
Obiektowe bazy danych • Grupa OMG w roku 1991 powołuje ODMG • ODMG tworzy specyfikacje kolejnych wersji języka OQL • Oparty o „algebrę obiektową” • Brak konstrukcji imperatywnych • Brak abstrakcji proceduralnych • Niespójna semantyka • W roku 2001 grupa ODMG zostaje rozwiązana
Obiektowe bazy danych • 1990 r. System LOQIS z prototypowym językiem opartym o podejście stosowe (SBA) • Początek 2006 r.– reaktywacja ODMG w celu ustanowienia standardu języków zapytań. • Rozważany jest standard oparty o podejście stosowe
SBA i SBQL • Lata 90-te, Kazimierz Subieta z IPIPAN • Stos środowisk ENVS • Bindery • Struktura dynamiczna • Uczestniczy w przetwarzaniu operatorów niealgebraicznych • Jedno środowisko może zawierać wiele binderów o danej nazwie var1(„string”) ... empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) currentDate(...) ... ENVS
Główne zalety SBA • Ujednolicona architektura • Uwolnienie od „algebr” • Algorytmiczne definiowanie języka • Precyzja w definiowaniu semantyki • Możliwość bezpośredniej implementacji definicji • Język zapytań traktowany jak język programowania
Modele danych • SBA i koncepcja SBQL są niezależne od modelu danych • Możliwość zaadoptowania do modelu relacyjnego, XML, abstrakcyjnych modelów obiektowych, itp. • Implementacja oparta na konkretnym modelu
Model danych M0 i1empl i6empl i11empl i2 fname ”John” i7 fname ”Bob” i12 sname ”Smith” i3 sname ”Smith” i8 sname ”Gordon” i13 dept i5 salary 2000 i9 salary 2300 i4 dept i10 dept i20dept i25dept i21 name ”IT” i26 name ”Marketing” i22 employee i27 employee i23 employee i28 boss i24 boss R = { i1, i6, i11, i20, i25 }
<Osoba> <Imię value=„Jan”/> <Nazwisko value=„Nowak”/> <Zarobki value=1500/> <Adres> <Ulica value=„Polna”/> <Numer value=„13A”/> <Kod value=„10-168”/> <Miasto value=„Olsztyn”/> </Adres> </Osoba> XML a M0 <i1,Osoba, { <i2, Imię, „Jan”>, <i3, Nazwisko, „Nowak”>, <i4, Zarobki, 1500>, <i5, Adres, { <i6, Ulica, „Polna”>, <i7, Numer, „13A”>, <i8, Kod, „10-168”>, <i9, Miasto, „Olsztyn”>, }> }>
Model relacyjny a M0 Schemat relacyjny: Osoba(Imię, Nazwisko, DataUr) Relacja Osoba: <i1,Osoba, { <i2, Imię, „Jan”>, <i3, Nazwisko, „Nowak”>, <i4, DataUr, 9/10/1971> }> <i5,Osoba, { <i6, Imię, „Adam”>, <i7, Nazwisko, „Kowalski”>, <i8, DataUr, 22/01/1968> }>
Model danych M1 • Relacja CC • Nie zawiera cykli • Relacja OC • Zbiór C i40PersonClass i41 age (...code...) ... Dziedziczy po i50EmplClass i51 changeSal (...code...) i52 netSal (...code...) ...
Rezultaty dla modelu M1 • Rezultatem może być: • Wartość atomowa (liczba, znak, itp.) • Referencja do obiektu • Krotki, słowniki i listy rezultatów • Bindery
Dlaczego Python? - Bruce Eckel • 10. Reduced Clutter • 9. It’s not backward-compatible in exchange for pain • 8. It doesn’t value performance over my productivity • 7. It doesn’t treat me like I’m stupid • 6. I don’t wait forever for a full implementation of the language
Dlaczego Python? - Bruce Eckel • 5. It doesn’t make assumptions about how we discover errors • 4. Marketing people are not involved • 3. I don’t have to type so much • 2. My guesses are usually right • 1. Python lets me focus on concepts
Dynamiczne typy #include <string> #include <iostream> using namespace std; template<class A, class B, class R> R sum(A a, B b) { return a + b; } int main() { string a("one"), b("two") cout << sum<string, string, string>(a, b) << endl; cout << sum<int, int, int>(1, 2) << endl; }
interface addable { Object add(Object b);} class X implements addable { public Object add(Object b) { return new Object(); // Test } } class AddableNotFoundException extends Exception {} public class WeakTyping { public static Object sum(Object a, Object b) throws AddableNotFoundException { Class[] intfs = a.getClass().getInterfaces(); for(int i = 0; i < intfs.length; i++) if(intfs[i] == addable.class) return ((addable)a).add(b); throw new AddableNotFoundException(); } public static void main(String[] args) throws Exception { X a = new X(); X b = new X(); Object c = sum(a, b); } }
Dynamiczne typy def sum(arg1, arg2): return arg1 + arg2 print sum(42, 47) print sum('spam', 'eggs')
Grupy operatorów • Operatory pogrupowane są ze względu na sposób ewaluacji • Brak „grup” jedno-elementowych
Zapytania atomowe • Literały • Np. 2, 3.14, „napis” • Nazwy • Np. osoba, miasto, x • Wynikiem ewaluacji nazwy jest zbindowanie jej na stosie środowisk
Operatory algebraiczne • Nie używają ENVS • Głównie operatory arytmetyczne, porównania, itp. • Jeżeli q1i q2to zapytania, a ∆ to binarny operator algebraiczny to q1 ∆ q2jestzapytaniem • Jeżeli q1to zapytanie, a ∆ to unarny operator algebraiczny to ∆ q1jestzapytaniem
Operatory niealgebraiczne • Ewaluowane na stosie środowisk • Binarne • Np. where, . (kropka), order by itp. • Ewaluacja zapytania q1θq2 : • Ewaluacja zapytania q1 • Dla każdego elementu z rezultatu, ewaluowane jest q2 • Do wyniku tej ewaluacji stosowany jest operator θaby obliczyć wynik częściowy
Drzewo zapytania empl where sname == „Smith” where empl == sname „Smith”
Przykładowa baza i1empl i6empl i11empl i2 fname ”John” i7 fname ”Bob” i12 sname ”Smith” i3 sname ”Smith” i8 sname ”Gordon” i13 dept i5 salary 2000 i9 salary 2300 i4 dept i10 dept i20dept i25dept i21 name ”IT” i26 name ”Marketing” i22 employee i27 employee i23 employee i28 boss i24 boss
Ewaluacja empl where sname == „Smith” empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS QRES
Ewaluacja empl where sname == „Smith” empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl wheresname== „Smith” fname(i2) sname(i3) dept(i4) salary(i5) i3 empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname ==„Smith” fname(i2) sname(i3) dept(i4) salary(i5) „Smith” i3 empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) True empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” Wynik pomocniczy: i1 fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl wheresname== „Smith” Wynik pomocniczy: i1 fname(i2) sname(i3) dept(i4) salary(i5) i8 empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname ==„Smith” Wynik pomocniczy: i1 fname(i2) sname(i3) dept(i4) salary(i5) „Smith” i8 empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” Wynik pomocniczy: i1 fname(i2) sname(i3) dept(i4) salary(i5) False empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” Wynik pomocniczy: i1 fname(i12) dept(i13) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1, i6, i11 ENVS QRES
Ewaluacja empl where sname == „Smith” empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) i1 ENVS QRES
Konstrukcje imperatywne • Mogą modyfikować stan bazy i stan ENVS • Mogą tworzyć nowe sekcje na ENVS • Np. for, while, create, delete, operatory przypisania, wstawiania
Funkcje • Otwierają nowe środowisko • Mogą być deklarowane z konkretną, bądź zmienną ilością parametrów • Parametry mogą mieć wartości domyślne • Wynikiem funkcji może być referencja do innej funkcji
Funkcje def averegeWage(*wages): i,sum=0,0.0 for w in wages: i+=1 sum+=w else: print „No wages given” print sum/i averegeWage((employee where dept.name==”Sales”).salary)
SQL+JDBC+Java Connection conn; ResultSet R; Statement s; ... s=conn.createQuery(); ... R=s.executeQuery( "SELECT salary FROM empl WHERE sname = 'SMITH'"); while (R.next()){ System.out.println (R.getString(1)); }
PySBQL print (empl where sname == "Smith").salary
PySBQL – przykłady for n, surn in empl.(fname,sname): print n, surn
PySBQL – przykłady for p in (dept where name==„IT”).employee: p.salary *=1.15 if (p.salary as ps> p.dept.boss.salary as bs): ps, bs = bs, ps print p.(fname, sname, salary)
PySBQL – przykłady print empl.(“Mr”, fname, sname, “earns”, salary)
PySBQL – przykłady nowak = first( osoba where nazwisko == „Nowak” ) if nowak.pensja as p < 2000: p*=1.30 print nowak else: p+= 600.00
PySBQL – przykłady def fib(n): #Lista liczb Fibonacciego mniejszych od n wynik = [] a, b = 0, 1 while b < n: wynik+=[b] a, b = b, a+b return wynik