pysbql

47
PySBQL PySBQL Język zapytań dla obiektowych baz danych

Upload: wesley-pittman

Post on 30-Dec-2015

20 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

PySBQLPySBQL

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

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); }}

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

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

empl where sname == „Smith”

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

Ewaluacja

empl(i1) empl(i6) empl(i11) dept(i17) dept(i22)

ENVS QRES

i1

empl where sname == „Smith”

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

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 nwynik = []a, b = 0, 1 while b < n:

wynik+=[b]a, b = b, a+b

return wynik