• Nie Znaleziono Wyników

cwiczenia 3. Stosy, proste zapytania JPS

N/A
N/A
Protected

Academic year: 2021

Share "cwiczenia 3. Stosy, proste zapytania JPS"

Copied!
94
0
0

Pełen tekst

(1)
(2)

JPS

Stosy, proste zapytania cwiczenia 3.

© Michał Lentner

Polsko-Japońska Wyższa Szkoła Technik Komputerowych

(3)

Baza danych używana w przykładach

(4)

Baza danych używana w przykładach

<i0, entry, {i1, i2, i3, i4, i5, i26}>

<i1, emp, {i15, i16, i17, i29}>

<i16, ename, "Dudek">

<i17, works_in, i5>

<i15, job, "Clerk">

<i2, emp, {i18, i19, i20, i21}>

<i21, ename, "Nowak">

<i18, salary, 3500>

<i19, works_in, i4>

<i20, job, "Programmer">

<i3, emp, {i10, i11, i12, i13}>

<i12, ename, "Kowal">

<i10, salary, 3500>

<i13, works_in, i4>

<i11, job, "Programmer">

<i4, dept, {i6, i7, i8, i9}>

<i7, dname, "R&D">

<i9, employs, i2>

<i8, employs, i3>

<i6, loc, "Warsaw">

<i5, dept, {i22, i23, i24}>

<i24, dname, "Sales">

<i23, loc, "Kraków">

<i22, employs, i1>

<i26, dept, {i27, i28}>

<i27, loc, "Pozna!">

<i28, dname, "Accounting">

<i29, works_in, i26>

(5)

Co to jest zapytanie?

(6)

Co to jest zapytanie?

dowolny literał, np. 5, 3.5, “Ala ma kota”

(7)

Co to jest zapytanie?

dowolny literał, np. 5, 3.5, “Ala ma kota”

dowolna nazwa, np. emp, sal

(8)

Co to jest zapytanie?

dowolny literał, np. 5, 3.5, “Ala ma kota”

dowolna nazwa, np. emp, sal

jedno lub dwa zapytania połączone z jakimś operatorem

(9)

Ważniejsze operatory w SBQL

(10)

Ważniejsze operatory w SBQL

operatory algebraiczne (makroskopowe i nie makroskopowe)

+, -, /, *, %, etc.

>, <, >=, <=, !=, etc.

or, and

union, intersect, minus, in

min(), max(), avg(), count(), bag(), sequence()

as, group as

,

(11)

Ważniejsze operatory w SBQL

operatory algebraiczne (makroskopowe i nie makroskopowe)

+, -, /, *, %, etc.

>, <, >=, <=, !=, etc.

or, and

union, intersect, minus, in

min(), max(), avg(), count(), bag(), sequence()

as, group as

,

operatory niealgebraiczne (makroskopowe)

where

.

join

order by

for all

(12)

Rodzaje rezultatów w SBQL

(13)

Rodzaje rezultatów w SBQL

wartość atomowa

np. 5, 3.5, “Ala ma kota”, true

referencja

np. i0

struktura

np. struct(1, 2, 3, 4)

bag

np. bag(1, 2, i0, “blabla”)

sekwencja

np. sequence(1, 2, 3, 4, 5)

binder

np. imie(i0), x(bag(1, 2, 3))

(14)

Stos rezultatów (QRES)

(15)

Służy do tymczasowego przechowywania rezultatów zapytań

Stos rezultatów (QRES)

(16)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Stos rezultatów (QRES)

(17)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Stos rezultatów (QRES)

(18)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Operacja pop usuwa element ze szczytu stosu

Stos rezultatów (QRES)

(19)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Operacja pop usuwa element ze szczytu stosu

Stos rezultatów (QRES)

Przykład stosu QRES 5

(20)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Operacja pop usuwa element ze szczytu stosu

7.5

Stos rezultatów (QRES)

Przykład stosu QRES 5

(21)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Operacja pop usuwa element ze szczytu stosu

“Ala ma kota”

7.5

Stos rezultatów (QRES)

Przykład stosu QRES 5

(22)

Służy do tymczasowego przechowywania rezultatów zapytań

Składa się z elementów będących rezultatami zapytań

Operacja push umieszcza nowy element na szczycie stosu

Operacja pop usuwa element ze szczytu stosu

7.5

Stos rezultatów (QRES)

Przykład stosu QRES 5

(23)

Proste zapytanie bez nazwy

(24)

Proste zapytanie bez nazwy

1 + 2 * 3 - 4

(25)

Proste zapytanie bez nazwy

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(26)

Proste zapytanie bez nazwy

2

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(27)

Proste zapytanie bez nazwy

2 3

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(28)

Proste zapytanie bez nazwy

2 3

*

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(29)

Proste zapytanie bez nazwy

1

2 3

*

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(30)

Proste zapytanie bez nazwy

1

2 3

* +

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(31)

Proste zapytanie bez nazwy

1

2 3

4

* +

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(32)

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(33)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(34)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(35)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(36)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

3 2 1

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(37)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

3 2 1

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

6 1

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(38)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

3 2 1

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

6

1 7

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(39)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

3 2 1

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

6

1 7

4 7

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(40)

tree_walk(node) { if (node is leaf)

// wstaw wartość na QRES else if (node is operator) { tree_walk(node.left);

tree_walk(node.right);

// pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem

// odłóż wynik na QRES }

3 2 1

Proste zapytanie bez nazwy

1

2 3

4

* +

-

1

2 1

6

1 7

4

7 3

1 + 2 * 3 - 4

Jeśli w zapytaniu nie ma nazw,

to do ewaluacji wystarczy stos QRES

(41)

Stos środowiskowy (ENVS)

(42)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Stos środowiskowy (ENVS)

(43)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Stos środowiskowy (ENVS)

(44)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Stos środowiskowy (ENVS)

(45)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Stos środowiskowy (ENVS)

(46)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Stos środowiskowy (ENVS)

(47)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Stos środowiskowy (ENVS)

(48)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Operacja push zazwyczaj wywoływana jest razem z operacją nested

Stos środowiskowy (ENVS)

(49)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Operacja push zazwyczaj wywoływana jest razem z operacją nested

Stos środowiskowy (ENVS)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Przykład stosu ENVS

(50)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Operacja push zazwyczaj wywoływana jest razem z operacją nested

ename(i16), works_in(i17), job(i15), works_in(i29)

Stos środowiskowy (ENVS)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Przykład stosu ENVS

(51)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Operacja push zazwyczaj wywoływana jest razem z operacją nested

dept(i5)

ename(i16), works_in(i17), job(i15), works_in(i29)

Stos środowiskowy (ENVS)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Przykład stosu ENVS

(52)

Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Składa się z sekcji, a każda sekcja składa się z binderów

Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych).

Trafiają do niej bindery do obiektów korzeniowych bazy danych

Operacja push umieszcza nową sekcję na szczycie stosu

Operacje pop usuwa sekcję ze szczytu stosu

Operacja bind dokonuje wiązania nazw

Operacja push zazwyczaj wywoływana jest razem z operacją nested

employs(i22), loc(i23), dname(i24)

dept(i5)

ename(i16), works_in(i17), job(i15), works_in(i29)

Stos środowiskowy (ENVS)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Przykład stosu ENVS

(53)

Wiązanie nazw

(54)

Wiązanie nazw

Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona.

(55)

Wiązanie nazw

Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona.

employs(i22), loc(i23), dname(i24)

dept(i5)

ename(i16), works_in(i17), job(i15), works_in(i29)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Kolejność przeszukiwania

(56)

Wiązanie nazw

Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona.

Przykłady:

bind(”emp”) = bag(i1, i2, i3) bind(”dept”) = bag(i5)

bind(”works_in”) = bag(i17, i29) bind(”loc”) = bag(i23)

employs(i22), loc(i23), dname(i24)

dept(i5)

ename(i16), works_in(i17), job(i15), works_in(i29)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Kolejność przeszukiwania

(57)

Proste zapytanie z nazwą

(58)

Proste zapytanie z nazwą

emp

(59)

Proste zapytanie z nazwą

emp

Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

(60)

Proste zapytanie z nazwą

emp

Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS

Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

(61)

emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Proste zapytanie z nazwą

emp

Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS

Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

(62)

emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Proste zapytanie z nazwą

emp

Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS

Wyliczamy bind(”Emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

(63)

emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Proste zapytanie z nazwą

emp

Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS

Wyliczamy bind(”Emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

Inne zapytania nie są już takie proste ...

Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

(64)

Wyznaczanie wnętrza obiektów

(65)

Wyznaczanie wnętrza obiektów

Operacja nested pobiera jako argument rezultat zapytania.

W zależności od rodzaju argumentu wynikiem jest:

(66)

Wyznaczanie wnętrza obiektów

Dla wartości atomowej: pusty zbiór

Dla referencji do obiektu prostego: pusty zbiór

Dla referencji do obiektu złożonego:

zbiór zawierający bindery z nazwami

identyfikatorami podobiektów tego obiektu

Dla referencji do obiektu referencyjnego:

zbiór zawierający binder z nazwą

i identyfikatorem obiektu wskazywanego

Dla bindera: ten sam binder

Dla struktury: suma operacji nested wszystkich elementów struktury

Dla pozostałych rezultatów: pusty zbiór

Operacja nested pobiera jako argument rezultat zapytania.

W zależności od rodzaju argumentu wynikiem jest:

(67)

Wyznaczanie wnętrza obiektów

Dla wartości atomowej: pusty zbiór

Dla referencji do obiektu prostego: pusty zbiór

Dla referencji do obiektu złożonego:

zbiór zawierający bindery z nazwami

identyfikatorami podobiektów tego obiektu

Dla referencji do obiektu referencyjnego:

zbiór zawierający binder z nazwą

i identyfikatorem obiektu wskazywanego

Dla bindera: ten sam binder

Dla struktury: suma operacji nested wszystkich elementów struktury

Dla pozostałych rezultatów: pusty zbiór

Operacja nested pobiera jako argument rezultat zapytania.

W zależności od rodzaju argumentu wynikiem jest:

nested(5) = { }

nested(i4) = { loc(i6), dname(i7), employs(i8), employs(i9) } nested(i8) = { emp(i3) }

nested(struct(i26, i29)) = { loc(i27), dname(i28), dept(i26) }

(68)

Operator .

(69)

Operator .

q1.q2

q1 q2 .

(70)

Operator .

Zainicjalizować dotres = bag()

Wykonać eval(q1) i zrobić q1res = QRES.POP()

Dla każdego elementu x q1res wykonać:

Utworzyć nową sekcję na ENVS

Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku

Wykonać eval(q2) i zrobić q2res = QRES.POP()

Dodać q2res do dotres (dotres q2res)

Zamknąć sekcję ENVS

Zrobić QRES.PUSH(dotres)

q1.q2

q1 q2 .

(71)

Przykład

(72)

Przykład

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

(73)

Przykład

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

(74)

Przykład

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Wyliczamy bind(”emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

(75)

Przykład

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Wyliczamy bind(”emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

Robimy QRES.POP().

ENVS pozostaje bez zmian. QRES pusty. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(76)

Przykład

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Wyliczamy bind(”emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

Robimy QRES.POP().

ENVS pozostaje bez zmian. QRES pusty. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

ename(i16), works_in(i17), job(i15), works_in(i29)

Robimy nested(i1).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(77)

Przykład

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Inicjalizujemy ENVS i QRES.

ENVS z binderami obiektów korzeniowych. QRES pusty.

Wyliczamy bind(”emp”).

Wynik na QRES. ENVS pozostaje bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i1, i2, i3)

emp.ename

Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename .

Robimy QRES.POP().

ENVS pozostaje bez zmian. QRES pusty. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

ename(i16), works_in(i17), job(i15), works_in(i29)

Robimy nested(i1).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

ename(i16), works_in(i17), job(i15), works_in(i29)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES.

emp(i1), emp(i2), emp(i3), dept(i4),

dept(i5), dept(i26) bag(i16)

(78)
(79)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(80)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i18), works_in(i19), job(i20), ename(i21)

Robimy nested(i2).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(81)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i18), works_in(i19), job(i20), ename(i21)

Robimy nested(i2).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES. bag(i21)

salary(i18), works_in(i19), job(i20), ename(i21)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(82)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i18), works_in(i19), job(i20), ename(i21)

Robimy nested(i2).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES. bag(i21)

salary(i18), works_in(i19), job(i20), ename(i21)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, więc resdot = bag{i16, i21}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(83)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i18), works_in(i19), job(i20), ename(i21)

Robimy nested(i2).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES. bag(i21)

salary(i18), works_in(i19), job(i20), ename(i21)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, więc resdot = bag{i16, i21}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i10), job(i11), ename(i12), works_in(i13)

Robimy nested(i3).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(84)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES trafia do resdot, więc resdot = bag{i16}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i18), works_in(i19), job(i20), ename(i21)

Robimy nested(i2).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES. bag(i21)

salary(i18), works_in(i19), job(i20), ename(i21)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, więc resdot = bag{i16, i21}.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

salary(i10), job(i11), ename(i12), works_in(i13)

Robimy nested(i3).

ENVS dostaje nową sekcję. QRES bez zmian.

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wyliczamy bind(”ename”).

Wynik wrzucamy na QRES. bag(i12)

salary(i10), job(i11), ename(i12), works_in(i13)

emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

(85)
(86)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, resdot = bag{i16, i21, i12}.

emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

(87)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, resdot = bag{i16, i21, i12}.

emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

Wrzucamy resdot na QRES.

Koniec wykonywania zapytania.

emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

bag(i16, i21, i12)

(88)

Usuwamy sekcję z ENVS i wartość z QRES.

Wartość z QRES do resdot, resdot = bag{i16, i21, i12}.

emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

Wrzucamy resdot na QRES.

Koniec wykonywania zapytania.

emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

bag(i16, i21, i12)

W ten sposób mamy nazwiska wszystkich pracowników

(89)

Operator where

(90)

Operator where

q1 where q2

q1 q2 where

(91)

Operator where

Zainicjalizować whereres = bag()

Wykonać eval(q1) i zrobić q1res = QRES.POP()

Dla każdego elementu x q1res wykonać:

Utworzyć nową sekcję na ENVS

Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku

Wykonać eval(q2) i zrobić q2res = QRES.POP()

Jeśli q2res == true, wtedy dodać x do whereres

Zamknąć sekcję ENVS

Zrobić QRES.PUSH(whereres)

q1 where q2

q1 q2 where

(92)

Operator where

Zainicjalizować whereres = bag()

Wykonać eval(q1) i zrobić q1res = QRES.POP()

Dla każdego elementu x q1res wykonać:

Utworzyć nową sekcję na ENVS

Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku

Wykonać eval(q2) i zrobić q2res = QRES.POP()

Jeśli q2res == true, wtedy dodać x do whereres

Zamknąć sekcję ENVS

Zrobić QRES.PUSH(whereres)

q1 where q2

q1 q2 where

Reszta podobnie jak w przypadku operatora . ...

(93)
(94)

Ć w i c z e n i a

Cytaty

Powiązane dokumenty

Skªadowe kategorii private i protected nie s¡ widoczne na zewn¡trz, i tylko metody danej klasy mog¡ na nich operowa¢ (zapisa¢, odczyta¢, czy wywoªa¢, je»eli jest to

Podstawowym celem takiego post?powania badawczego bylo ustalenie, jak wyodr?bnione feminatywa postrzegane s^ przez Polki i Polakow, ktore z form wskazywanych przez ekspertow

Po rozszerzeniu o konstrukcje proceduralne powstał pełny język programowania a’la PL/SQL, w którym wyrażenia są zapytaniami... • nazwiska i wiek pracowników

Aktualizacja obiektu nadrzędnego, usunięcie podobiektów, usunięcie referencji wskazujących na dany obiekt, zwolnienie

Aktualizacja obiektu nadrzędnego, usunięcie podobiektów, usunięcie referencji wskazujących na dany obiekt, zwolnienie

The state-of-the-art of the fabrication techniques for the generation of optical surfaces of revolution is feed-controlled precision machining (single-point diamond turning or

W tem miejscu redaktor zrobił ciekawy przypisek o kopcach i urnach w Krzczonowie, o 3 mile od Lublina; najniesłuszniej tylko nazywa odkryte urny aryańskiemi: „O 3 mile od Lublina,

196 Indeka nazw osobowych.. Jakowska Krystyna