pysbql
DESCRIPTION
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(); ... - PowerPoint PPT PresentationTRANSCRIPT
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
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
ENVS
var1(„string”) ...
currentDate(...) ...
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
i2 fname ”John”
i5 salary 2000
i4 dept
i20 dept
i21 name ”IT”
i22 employee
i3 sname ”Smith”
i6 empl
i7 fname ”Bob”
i9 salary 2300
i10 dept
i8 sname ”Gordon”
i11 empl
i13 dept
i12 sname ”Smith”
i23 employee
i24 boss
i25 dept
i26 name ”Marketing”
i27 employee
i28 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:
<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>
}>
Imię Nazwisko DataUr
Jan Nowak 9-10-1971
Adam Kowalski 22-01-1968
Model danych M1
Relacja CC Nie zawiera cykli
Relacja OC Zbiór C
i40 PersonClass
i41 age (...code...)
...
i51 changeSal (...code...)
...
i50 EmplClass
i52 netSal (...code...)
Dziedziczy po
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); }}
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
Przykładowa baza
i1 empl
i2 fname ”John”
i5 salary 2000
i4 dept
i20 dept
i21 name ”IT”
i22 employee
i3 sname ”Smith”
i6 empl
i7 fname ”Bob”
i9 salary 2300
i10 dept
i8 sname ”Gordon”
i11 empl
i13 dept
i12 sname ”Smith”
i23 employee
i24 boss
i25 dept
i26 name ”Marketing”
i27 employee
i28 boss
Ewaluacja
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
Ewaluacja
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
ENVS QRES
i1, i6, i11
fname(i2) sname(i3) dept(i4) salary(i5)
empl where sname == „Smith”
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
i3empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
i3
„Smith”
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
Trueempl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
Wynik pomocniczy: i1
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
i8
Wynik pomocniczy: i1
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
i8
„Smith”
Wynik pomocniczy: i1
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
ENVS QRES
i1, i6, i11
empl where sname == „Smith”
False
Wynik pomocniczy: i1
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
fname(i2) sname(i3) dept(i4) salary(i5)
Ewaluacja
empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)
ENVS QRES
i1, i6, i11
fname(i12) dept(i13)
empl where sname == „Smith”
Wynik pomocniczy: i1
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.0for w in wages:
i+=1sum+=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 – 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
nowak = first( osoba where nazwisko == „Nowak” )
if nowak.pensja as p < 2000:
p*=1.30
print nowak
else:
p+= 600.00