Stare slajdy o PySBQLu

advertisement
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
Download