ODE Zapytania
Pętla for (1) Do obiektów będących instancjami klas możemy uzyskać dostęp za pomocą pętli for Zakres tej pętli to wszystkie obiekty klasy student znajdujące się w klastrze domyślnym, w domyślnej bazie danych. Powyższe zapytanie jest tożsame z: Baza danych może być jawnie wyspecyfikowana gdzie att jest wskaźnikiem na bazę danych for (ps in student) cout nazwisko wiek << endl; for (ps in student in database::default_db() ) {...} for (ps in student in att ) {...}
n Analogicznie możemy określić klaster, który ma być zakresem zapytania. Dotychczasowe przykłady odwoływały się do obiektów należących do jednej klasy (student). Pamiętamy jednak, że w klastrach możemy przechowywać obiekty różnych klas. Poniższe zapytanie wydobywa wszystkie obiekty znajdujące się w klastrze. W przypadku tego typu zapytań zmienna pętli musi być typu persistent void; n Po wykonaniu pętli zmienna pętli przyjmuje wartość null. Pętla for (2) persistent student *ps;... cluster Infor ("Informatyka", db) for (ps in student in Infor) {...} persistent void *pv;... cluster Infor ("Informatyka", db) for (pv in Infor) {...}
Klauzula suchthat Klauzula suchthat jest odpowiednikiem klauzuli where w systemach relacyjnych i służy do selekcji obiektów spełniających określone wyrażenie boolowskie. persistent student *ps;... for (ps in student) suchthat (ps->wiek > 26) {...}
Połączenia n Połączenia obiektów dwóch klas na podstawie wartości odpowiedniego atrybutu można wykonywać na dwa sposoby 1. lub (bardziej efektywnie) - za pomocą wykorzystania mechanizmu wielu zmiennych pętli 2. for (ps in student) for (pk in kierunek_studiow) {...} for (ps in student; pk in kierunek_studiow) {...}
Klauzula in all Użycie klauzuli in all zamiast in w pętli for powoduje, że pętla zwraca wskaźniki do obiektów klasy wyspecyfikowanej w zapytani, oraz dodatkowo do obiektów klas wywiedzionych z wyspecyfikowanej klasy poprzez dziedziczenie publiczne. wtedy pętla jest tożsama ze zbiorem pętli class student {...}; class starosta : public student {...}; class skarbnik : public student {...}; class przewodniczacy : public starosta {...}; persistent student *ps;... for (ps in all student) suchthat (ps->wiek > 26) {...} for (ps in student) suchthat (ps->wiek > 26) {...} for (ps in starosta) suchthat (ps->wiek > 26) {...} for (ps in skarbnik) suchthat (ps->wiek > 26) {...} for (ps in przewodniczacy) suchthat (ps->wiek > 26) {...}
Indeksy (1) n Używane tylko w przypadku klauzuli suchthat n Typy u hash u B-tree n Tylko specyficzne (proste) warunki n W przypadku warunków złożonych z kilku atrybutów, na których założone są indeksy wykorzystany będzie tylko jeden z nich n Ograniczenia u zakres indeksu zawsze jest ograniczony do obiektów klasy znajdujących się w jednym klastrze u tylko jeden index na danym atrybucie klasy w klastrze u BuiltIndex ostatnią operacją w transakcji u Przed założeniem należy sprawdzić czy już nie istnieje
Indeksy (2) n Tworzenie indeksów u BuiltIndex(const char *typeName, const char *memberName, database *db, int unique, Index_type) u BuiltIndex(const char *clusterName, const char *typeName, const char *memberName, database *db, int unique, Index_type) n Usuwanie indeksów u IndexDelete(const char *typeName, const char *memberName, database *db, int unique) u IndexDelete(const char *clusterName, const char *typeName, const char *memberName, database *db, int unique) n Istnienie indeksów u IndexType IndexExists(const char *typeName, const char *memberName, database *db, int unique) u IndexType IndexExists(const char *clusterName, const char *typeName, const char *memberName, database *db, int unique)