I.
Wprowadzenie do  języków zapytań (1)
II.
Wprowadzenie do  języków zapytań (2)
III.
Pojęcia obiektowości w bazach danych (1)
IV.
Pojęcia obiektowości w bazach danych (2)
V.
Podstawy semantyczne języków zapytań
VI.
Modele składu obiektów
VII.
Stos środowisk, rezultaty zapytań, funkcja nested
VIII.
Język SBQL (Stack-Based Query Language) (1)
IX.
X.
Dalsze własności SBQL
XI.
Operatory order by i group by
XII.
Przetwarzanie struktur nieregularnych
XIII.
Rozszerzenie języków zapytań o konstrukcje imperatywne
XIV.
Procedury, procedury funkcyjne, metody, reguły zakresu
  Wstęp
  1. Parametry procedur
  2. Procedury w SBQL
  3. Rozszerzenie SBQL w modelu M3
  4. Reguły zakresu
  Podsumowanie
  Zadania
XV.
Parametry procedur i metod, procedury rekurencyjne, optymalizacja poprzez modyfikację zapytań

 

3. Rozszerzenie SBQL w modelu M3

Model M3 rozszerza M1 lub M2 o listę eksportową, która dzieli własności klasy oraz własności obiektów tej klasy na publiczneprywatne. Własności prywatne zarówno klasy K, jak i obiektów klasy K są dostępne wyłącznie z wnętrza ciała metod (publicznych i prywatnych) klasy tej samej K. Można to prosto zrealizować poprzez odpowiednie ustawienie sekcji stosu oraz poprawkę do funkcji nested. Niech iK będzie identyfikatorem obiektu klasy K posiadającej listę eksportową exportK. Lista ta zawiera nazwy własności klasy i obiektów tej klasy dostępnych publicznie. Funkcje nested_private oraz nested_public zmieniają definicję funkcji nested uwzględniając listę eksportową:

74
Rys.74. Stany stosu ENVS przy przetwarzaniu referencji ri przez operator niealgebraiczny w modelu M3

Dla argumentów nie będących identyfikatorami obiektów funkcje te są identyczne z funkcją nested. Funkcje te podobnie jak poprzednio rozszerzamy na dowolne struktury:

nested_private(struct{ i1, i2,...}) = nested_private(i1) È nested_private(i2) È ...

nested_public(struct{ i1, i2,...}) = nested_public(i1) È nested_public(i2) È ...

Rozpatrzmy zapytanie q1 q q2, gdzie q jest operatorem niealgebraicznym. Niech eval(q1) zwróci  bag{ r1, r2,...}, gdzie r1, r2,... są referencjami do obiektów będących członkami klasy K1, która jest podklasą K2, która jest podklasą K3. Niech wiązana będzie pewna nazwa m występująca w q2, przy czym m nie jest nazwą metody. W takim przypadku sytuacja przypomina model M1, gdzie operator  wkładał na stos sekcje własności obiektów i klas w odpowiedniej kolejności. W M3 wykorzystana jest w tej sytuacji funkcja nested_public, zaś kolejne stany stosu ENVS przy przetwarzaniu ri są takie, jak przedstawiono na Rys.74.

Sytuacja jest nieco bardziej złożona, gdy wiązana jest nazwa m występująca w q2 i m jest nazwą metody.

75
Rys.75. Sytuacja na stosie ENVS w przypadku wywołania metody w modelu M3

W tym przypadku, na stos ENVS muszą być również włożone prywatne własności klasy, do której należy metoda m oraz prywatne własności obiektu przetwarzanego przez tę metodę (którego referencja jest zwrócona przez q1). Rys.75 przedstawia tę sytuację dla przypadku, gdy metoda m jest własnością klasy K2. Rys.76 przedstawia schemat bazy danych, gdzie własności publiczne są zaznaczone znakiem +, zaś prywatne znakiem -. Dla tego schematu podamy przykłady kilku poprawnych i niepoprawnych zapytań.

Zwrócimy uwagę, że w ostatnim przypadku metoda ZarNetto jest błędna,  mimo że jej wywołanie w znajdującym się dalej zapytaniu mogłoby być poprawne: binder z nazwą Nazwa znajduje się na stosie. Binder ten wstawił kwantyfikator $ działający na obiektach Dział. Stanęliśmy jednak na stanowisku, że programista programujący metodę ZarNetto nie może żądać ani liczyć na to, że ta metoda będzie wywołana w kontekście określonych operatorów działających na określonych obiektach. Stanowisko to jest podyktowane pewnym spekulacyjnym rozsądkiem, który jest często zawodny. Niewykluczone, że dla pewnej klasy języków i pewnych sytuacji taka semantyka może mieć sens.

76
Rys.76. Schemat bazy danych w modelu M3

P14.6.

Patrz Rys.76.

 

 

Prac where Nazwisko = "Nowak"

Poprawny

 

Osoba where RokUr < 1975

Błędny

 

(Prac where Nazwisko = "Nowak").Zar

Błędny

 

(Prac where Nazwisko = "Nowak").Wiek

Poprawny

 

procedure Wiek { return BieżącyRok - RokUr }

Poprawny

 

procedure ZmieńZar( nowy ) { self.Zar := nowy }

Poprawny

 

procedure ZarNetto( ) {
    return if RokUr > 1955 then 0.9 * Zar else 0.8 * Zar }

Błędny

 

procedure ZarNetto( )
    return if Nazwa = "Marketing" then 0.9 * self.Zar
        else 0.8 * self.Zar }
    ...
    Prac where $Dział (Budżet > 100 * ZarNetto)

Błędny

 

 


Copyrights © 2006 PJWSTK
Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS.