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 i1 empl i6 empl i11 empl 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 i20 dept i25 dept i21 name ”IT” i26 name ”Marketing” i22 employee i27 employee i23 employee i28 boss i24 boss R = { i1, i6, i11, i20, i25 } XML a M0 <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> <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: Imię Nazwisko DataUr Jan Nowak 9-10-1971 Adam Kowalski 22-01-1968 <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 i40 PersonClass i41 age (...code...) ... Zbiór C Dziedziczy po i50 EmplClass 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 q1 i q2 to zapytania, a ∆ to binarny operator algebraiczny to q1 ∆ q2 jest zapytaniem Jeżeli q1 to zapytanie, a ∆ to unarny operator algebraiczny to ∆ q1 jest zapytaniem 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 i1 empl i6 empl i11 empl 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 i20 dept i25 dept 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) ENVS i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS i3 i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS „Smith” i3 i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” fname(i2) sname(i3) dept(i4) salary(i5) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS True i1, i6, i11 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) ENVS i1, i6, i11 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) ENVS i8 i1, i6, i11 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) ENVS „Smith” i8 i1, i6, i11 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) ENVS False i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” Wynik pomocniczy: i1 fname(i12) dept(i13) empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS i1, i6, i11 QRES Ewaluacja empl where sname == „Smith” empl(i1) empl(i6) empl(i11) dept(i17) dept(i22) ENVS i1 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