Języki i Środowiska Programowania Baz Danych | |||
|
4. Procedura ewaluacji zapytań eval Będziemy definiować semantykę operacyjną naszego języka zapytań poprzez procedurę rekurencyjną, którą nazwaliśmy eval. Argumentem procedury eval jest dowolne zapytanie, zaś wynikiem procedury jest rezultat tego zapytania włożony na wierzchołek stosu rezultatów QRES. Procedura eval będzie korzystać ze składu obiektów, ENVS oraz QRES. Dla zapytań bez efektów ubocznych (nie wywołujących metod lub funkcji, które mogą zmienić stan), zachowane będą następujące założenia:
Rezultaty zapytań zapisane na stosie rezultatów są "konsumowane" przez operatory danego języka lub interfejsu, dla których zapytania były parametrami. Takim operatorem może być znany z SQL operator delete oznaczający usunięcie danych, np.:
Wykonanie tego polecenia oznacza ewaluację przez procedurę eval zapytania Osoba where Nazwisko = "Nowak", w wyniku czego na wierzchołku stosu rezultatów pojawi się wynik tej ewaluacji w postaci referencji do obiektu Nowaka (tj. jego identyfikatora). Następnie ten rezultat zostanie "skonsumowany" przez operator delete, który później usunie go ze stosu. Zakładamy, że w poprawnie zbudowanym języku i jego mechanizmie nie może wystąpić zapytanie, którego wynik nie będzie "skonsumowany" przez pewien operator. Dzięki temu wzrost stosu QRES będzie kontrolowany i na zakończenie pewnej spójnej porcji czynności jego wysokość i zawartość będzie taka sama, jak przed rozpoczęciem tych czynności. Elementarnym zapytaniem w definiowanym przez nas języku SBQL może być leksykalny reprezentant wartości l Î L lub zewnętrzna nazwa n Î N. Definicja procedury eval (w pseudokodzie) dla takich zapytań jest bardzo prosta: procedure eval( q : zapytanie ) case q jest rozpoznane jako n Î N : case .....
Dla innych przypadków procedura eval dokonuje rozbioru gramatycznego w celu wyodrębnienia z każdego zapytania jednego lub dwóch podzapytań oraz operatora, który jest zastosowany do tych podzapytań. Następnie wyznacza rezultaty tych podzapytań (w kolejności określonej operatorem, dla niektórych operatorów - wielokrotnie) i łączy je w rezultat całego zapytania zgodnie z łączącym je operatorem. Ten proces jest rekurencyjny, tj. podzapytania są rozkładane na podpodzapytania itd. aż do podanych wyżej przypadków zapytań elementarnych. Rys.46 przedstawia rozbiór prostego zapytania w postaci tzw. drzewa syntaktycznego. Operatory łączące zapytania będziemy dzielić na algebraiczne i niealgebraiczne, przy czym istotą podejścia stosowego są operatory niealgebraiczne. Fundamentalna różnica pomiędzy operatorami niealgebraicznymi i algebraicznymi polega na ich stosunku do stosu środowisk. Operatory algebraiczne nie używają ENVS: działanie takiego operatora dotyczy wyłącznie stosu QRES (zwykle jego jednego lub dwóch wierzchołkowych elementów). Natomiast operatory niealgebraiczne, oprócz działań na QRES, bezpośrednio odwołują się do konstrukcji i operacji zachodzących na ENVS.
|
||
Copyrights © 2006 PJWSTK Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS. |