Object Query Language. Daniel Fromek Miroslav Novotný



Podobné dokumenty
OQL. (Object Query Language) Michal Bartoš Filip Bureš

Analýza a modelování dat. Přednáška 5

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

OQL. Jakub Kýpeť, Ondřej Heřmánek

ODMG OQL. Jan Forch. Dotazovací jazyky, MFF UK

KIV/ZIS cvičení 5. Tomáš Potužák

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Úvod do databázových systémů

8.2 Používání a tvorba databází

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Informační systémy ve zdravotnictví. 6. cvičení

Dolování v objektových datech. Ivana Rudolfová

Úvod do databázových systémů

Ukládání a vyhledávání XML dat

7.3 Diagramy tříd - základy

Databázové systémy. Cvičení 6: SQL

Databáze I. Přednáška 6

Databáze SQL SELECT. David Hoksza

7.3 Diagramy tříd - základy

6. blok část C Množinové operátory

Dědění, polymorfismus

Úvod do databázových systémů

Databázové systémy I

Databáze I. Přednáška 7

12. Postrelační databázové systémy

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

12. Postrelační databázové systémy

Informační systémy ve zdravotnictví. 8. cvičení

Informační systémy ve zdravotnictví. 10. cvičení

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Diagramy tříd - základy

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Databázové systémy trocha teorie

7.5 Diagram tříd pokročilé techniky

1. Dědičnost a polymorfismus

Úvod do databázových systémů

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

UML. Unified Modeling Language. Součásti UML

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Úvod do databázových systémů

Kapitola 4: SQL. Základní struktura

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

7.5 Diagram tříd pokročilé techniky

6 Objektově-orientovaný vývoj programového vybavení

PB161 Základy OOP. Tomáš Brukner

Operátory ROLLUP a CUBE

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Dotazování v relačním modelu a SQL

Základy objektové orientace I. Únor 2010

10 Balíčky, grafické znázornění tříd, základy zapozdření

Programování v C++ 3, 3. cvičení

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Úvod do databázových systémů 3. cvičení

Algoritmizace prostorových úloh

Tvorba informačních systémů

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

InterSystems Caché Post-Relational Database

Nerelační databázové modely. Helena Palovská

Programování v C++ 2, 4. cvičení

KIV/ZIS - SELECT, opakování

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Common Object Request Broker Architecture

Třída. Atributy. Operace

6. blok část B Vnořené dotazy

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Dynamicky vázané metody. Pozdní vazba, virtuální metody

TÉMATICKÝ OKRUH Softwarové inženýrství

Unifikovaný modelovací jazyk UML

Databázové systémy Cvičení 5

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

PROSTOROVÉ DOTAZOVACÍ JAZYKY. (Maroš Kasinec, Jakub Kúdela)

Marketingová komunikace. 2. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK1aPH/N9KMK1bPH (um1a1ph/um1b1ph)

Databázové systémy Cvičení 5.3

Marketingová komunikace. 2. a 3. soustředění. Mgr. Pavel Vávra 9103@mail.vsfs.cz. Kombinované studium Skupina N9KMK3PH (vm3aph)

Informační systémy 2008/2009. Radim Farana. Obsah. Nástroje business modelování. Business modelling, základní nástroje a metody business modelování.

Objektové programování

typová konverze typová inference

Jazyk SQL 2. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c M.Valenta, 2011 BI-DBS, ZS 2011/12

PŘETĚŽOVÁNÍ OPERÁTORŮ

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Základní přehled SQL příkazů

Objektově orientované databáze. Miroslav Beneš

Abstraktní datové typy: zásobník

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Generické programování

Tvorba informačních systémů

24. listopadu 2013, Brno Připravil: David Procházka

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

8 Třídy, objekty, metody, předávání argumentů metod

Programování v C++ 1, 6. cvičení

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Objektově relační databáze a ORACLE 8

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Databázové systémy Cvičení 5.2

Vyřešené teoretické otázky do OOP ( )

Teoretické minimum z PJV

Transkript:

Object Query Language Daniel Fromek Miroslav Novotný MFF UK 2005

Relace vs. Objekty Z psychologického hlediska nám jsou bližší objekty. Žijeme v objektovém světe milionům let evoluce vděčíme za to, že umíme objekty rozeznávat, přiřazovat jim jejich vlastnosti a chování. Tohoto faktu již dávno využívají různé modelovací prostředky jako nap ř. UML. Když proto budeme používat objekty na úrovni implementace databáze, snadněji se nám bude provádět mapování nějakého schématu databáze navrženého pomocí nap ř. UML na konkrétní implementaci. Při použití objektové databáze zabráníme jevu, který se v anglické literatuře označuje jako Impedance mismatch. Nastává, když chceme spojit dva systémy navzájem velmi konceptuáln ě rozdílné (když přistupujeme k relační databázi pomocí objektového programu)

Objektově-orientované koncepty Objektově-orientované databázové modely přejímají koncept objektově- orientovaných programovacích jazyk ů. Neexistuje však žádná dohoda o přesné definici toho, jak mají objektově- orientované systémy vypadat Následující definice jsou nejtypičtější

Koncepty - pokračování Komplexní objekty Databáze by měla sestávat z jednotlivých objekt ů. Tyto objekty v sob ě mohou obsahovat další objekty. Každý objekt v sob ě obsahuje unikátní interní identifikátor (OID), jež ho jednoznačn ě identifikuje. Dále obsahuje jedno nebo více externích jmen, které používají programátoři pro přístup k objektu. Vztahy, asociace, linky Objekty jsou mezi sebou propojeny konceptuálními linky (nap ř. Zaměstnanec a oddě lení jsou spojeny linkem pracuje_v). Na úrovni datových struktur se konceptuální linky realizují pomocí ukazatelů Zapouzdření, skrývání dat Data objektu jsou rozdělena na privátní a veřejná. Z vnějšku jsou vidět jen data veřejná (viz. C++)

Koncepty pokračování 2 Abstraktní datové typy (ADT) Třídy, typy, rozhraní Vztah mezi třídou a objektem je stejný jako v C++. K objektu se přistupuje pomocí jeho rozhraní. Rozhraní poskytuje úplnou informaci nutnou k používání daného objektu Operace, metody a zprávy S objektem je svázána sada operací (stejn ě jako v OOP se jim říká metody). Objekt danou operace vykoná po přijetí zprávy s jejím jménem a parametry Dědičnost Funguje stejn ě jako v OOP

Koncepty pokračování 3 Polymorfismus, přetěžování Operace, která se má provést se vybírá dynamicky poté, co objekt obdrží zprávu se jménem operace. Stejná zpráva pro různé objekty může vyvolat různé metody (viz. C++) Persistence Databázové objekty jsou persistentní mohou přežít programy, ve kterých byly vytvořeny.

Koncepty dokončení Různé představy vývojá řů o technických detailech, které nejsou pokryty v předchozích konceptech, ale jsou nutné při konkrétní realizaci mohou vyústit v to, že se dané koncepty (třída, typ, ADT ) v jednotlivých produktech velmi liší (jak po technické tak i po praktické stránce) Nedostatek obecn ě akceptovaných definic týkajících se objektového modelu je považována za velký nedostatek objektově-orientovaných databází.

ODMG Standard Object Data Management Group Standard sestává z následujících částí Object Model definuje význam základních element ů (třídy, objekty, rozhraní, vztahy viz. předchozí slajdy). Snaží se být nezávislý na konkrétním programovacím jazyku Object Definition Language (ODL) je v podstat ě rozšířením CORBA IDL. Definuje schéma databáze objekty, vztahy mezi nimi, atributy objekt ů, operace, které se s danými objekty dají provádět, atd. ODL je nezávislé na konkrétním programovacím jazyku. Object Interchange Format definuje reprezentaci objekt ů pro vzájemnou výměnu mezi různými OOSŘBD

ODMG Standard Object Query Language (OQL) analogie SQL pro objektov ě orientované databáze Vazby na programovací jazyky C++, Smalltalk, Java. Definuje, jak naroubovat ODL a OQL na konstrukce výše zmíněných programovacích jazyků

Příklady OOSŘBD + praxe Mezi čist ě objektové SŘBD můžeme zařadit: Jasmine (Fujitsu), GemStone, Odapter (HP), O2 (ODMG), ObjectStore, Poet Na druhé stran ě autoři relačních databází do svých produkt ů přidávají objektové prvky (ADT, ) a vznikají tak produkty označované jako Objektově-relační databáze Obecn ě se očekává, že oba proudy čist ě objektový i objektově-relační v budoucnosti splynou (resp. Objektově-relační proud přejde v objektový). Kdy se tak stane, se ale přesn ě neví.

Object Query Language

OQL principy OQL je nadmnožina té části SQL, která umožňuje pokládat dotazy do databáze. Tedy stejná konstrukce select která v SQL pracuje nad tabulkami může v OQL pracovat nad kolekcemi objekt ů. OQL nezahrnuje žádné modifikační operátory. O modifikaci objekt ů by se měly starat metody definované v přímo objektech. OQL může být voláno přímo z programovacích jazyk ů v kterých je definován objektový model.

OQL schéma class Klient public type jmeno: String, objednavka: list(tuple( nazev: String, cena: Real)) end; class Zamestnanec public type jmeno: String, datum_narozeni: Date, pozice: String, plat: Real, method age: integer end;

OQL schéma class Mnozina_zamestnancu public type unique set (Zamestnanec) end; class Seznam_klientu public type list (Klient) end; class Spolecnost public type jmeno: String, zamestnanci: Mnozina_zamestnancu, klient: Seznam_klientu end;

OQL schéma Každý dotaz do databáze potřebuje vstupní bod. Nad databází může být definováno více vstupních bod ů. Jsou to pojmenované objekty nebo hodnoty. name Globe: Spolecnost; constant name zamestnanci: Mnozina_zamestnancu;

OQL základní dotazy. Vracejí atomické hodnoty, struktury nebo objekty. Cesta k elementu začínajicí nějakým vstupním bodem. Příklad: Jméno prvního klienta společnosti Globe. Globe.klient[0].jmeno;

OQL select OQL přebírá z SQL konstrukci 'select'. Zde slouží k získání element ů splňující podmínky z kolekce dat. Výsledek je opět kolekce. Příklady kolekcí: set neuspořádaná množina bez duplikat ů. bag neuspořádaná množina s duplikáty. list uspořádaný seznam s duplikáty.

OQL select Příklad dotazu na zaměstnance společnosti Globe s platem větším než 20 000. Výsledek dotazu je kolekce zaměstnanc ů typu 'bag'. Při použití klíčového slova distinct získáme kolekci typu 'set'. select e from e in Globe.zamestnanci where e.plat > 20000;

OQL select Spojovaní kolekcí join. Málo používané. Příklad: Zaměstnanci společnosti Globe, kteří mají stejné jméno jako některý z klient ů. select e from e in Globe.zamestnanci, c in Globe.klienti where e.jmeno = c.jmeno;

OQL select Můžeme položit dotaz, který pracuje s více než s jednou kolekcí a spojovat je specifikováním cesty. Příklad: Názvy objednávek klienta 'Novák'. select distinct obj.nazev from k in Globe.klienti, obj in k.objednavka where k.name = 'Novák'; výsledek typu: set(string);

OQL konstrukce výsledk ů. Pomocí konstruktoru struct, bag, set a list můžeme ovlivnit strukturu výsledku dotazu. Příklad: select struct (zamestnanec: struct( jmeno: e.name, vek: e.vek), plat: e.plat) from e in Globe.zamestnanci; zamestnanec jmeno Novák vek 41 plat 21000

OQL agregační operátory Agregační operátory count, sum, max, min, avg. Aplikované na kolekce. <op>(výraz) max ( select e.plat from e in Globe.zamestnanci where e.pozice = 'reportér' ); select count(k.objednavka) from k in Globe.klienti;

OQL operátor define Slouží k pojmenování výsledku dotazu. Jedná se pouze o pojmenování výsledku a ne dotazu samotného. Pojmenovaný výsledek můžeme použít v dalších dotazech. define moji_zamestnanci as select e from e in Globe.zamestnaci where e.jmeno like 'N*'; select e.plat from e in moji_zamestnanci;

OQL operátor element Pokud máme kolekci obsahující pouze jeden element můžeme daný element získat použitím operátoru element. element ( select e from e in Globe.zamestnanci where e.jmeno = 'Svoboda');

OQL existenční kvantifikátor Příklad: Jména všech společností s nějakým zaměstnancem mladším 23 let. name VsechnySpolecnosti: list(spolecnost); select c.jmeno from c in VsechnySpolecnosti where exists e in c.zamestnanci: e.vek < 23;

OQL operátor exists operátor exists(exp), kde exp je kolekce vrací true pokud kolekce exp obsahuje alespo ň jeden prvek. operátor unique(exp) vrací true pokud kolekce obsahuje práv ě jeden prvek. Navrženy tak aby umožňovali vnořené dotazy tak jak jsme na n ě zvyklý z SQL. select c.jmeno from c in VsechnySpolecnosti where exists ( select e from e in c.zamestnanci where e.vek < 23)

OQL univerzální kvantifikátor Podobn ě jako existenční kvantifikátor se použije i univerzální kvantifikátor. Příklad: Test jestli všichni zaměstnanci společnosti mají alespo ň minimální plat. for all e in Globe.zamestnanci: e.plat > 10000; Vrací true pokud všichni zaměstnanci společnosti Globe mají plat větší než 10 000.

OQL operátor group by Seskupuje objekty kolekce se stejnou hodnotou vybraných atribut ů. Ve výsledku jsou atributy podle kterých se seskupovalo a kolekce objekt ů nazvána partition. select * from e in Globe.zamestnaci group by e.plat; Výsledek je typu: bag ( struct ( plat: Real, partition: bag(zamestnanec))));

OQL operátor group by Objekt partition může využít pro další výpočty pro každou skupinu. select e.plat, pocet: count(partition) from e in Globe.zamestnanci group by e.plat; Výsledek je typu: bag ( struct ( plat: Real, pocet: Integer));

OQL operátor group by Lze sjednocovat podle více atributu. Výsledek po sjednocení lze filtrovat operátorem having. select * from e in Globe.zamestnaci group by nizky: e.plat < 10000, stredni: e.plat >= 10000 and e.plat < 50000, vysoky: e.plat >= 50000 výsledek je typu: bag ( struct ( nizky: boolean, stredni: boolean, vysoky: boolean, partition: bag(zamestnanec)));

OQL operátor order by Pokud chceme jako výsledek dotazu setříděný seznam místo množiny použijeme operátor order by. select e from e in Globe.zamestnanci order by e.jmeno, e.vek; Výsledek je typu: list ( zamestnanec );

OQL množinové operátory Množinové operátory jsou definovány na kolekcích 'set' a 'bag'. Operátory: sjednoceni (union nebo +) průnik ( intersect nebo *) rozdíl ( except nebo -) libovolný prvek ( pick ) Příklad: libovolný zaměstnanec, který není v množin ě moji_zamestnanci. pick( select e from e in Globe.zamestnanci - moji_zamestnanci);

OQL množinové operátory Inkluze a < b a leží v b, a se nerovná b. a < = b a leží v b. a > b a > = b Vracejí true/false moji_zamestnanci < Globe.zamestnanci; vrací true.

OQL konverze Konverze seznamu obsahující jeden prvek na jeden prvek. element(exp) Konverze seznamu na množinu. listtoset(list) Konverze množiny na seznam. nutno definovat uspořádaní operátorem order by. select e from e in množina order by e.a1; Odstranění duplikát ů. distinct (exp)

OQL konverze Zploštění kolekce flatten(exp) Přetypování (typ)exp flatten(list(set(1,2,3),set(3,4,5,6),set(7)) vrací: set(1,2,3,4,5,6,7)

OQL práce se seznamy Získaní i-tého prvku seznamu. list(a,b,c,d) [2] vrací c Získaní části seznamu. list(a,b,c,d) [1:2] vrací list (b,c) Získaní prvního/posledního prvku seznamu. last( list(a,b,c,d)) vrací d obdobn ě operátor first.

OQL - dodatky

Schéma class Osoba { d_string jmeno; d_date datum_narozeni; d_set< d_ref< Osoba > > rodice; d_list< d_ref< Osoba > > deti; d_ref< Byt > zije_v; }; Osoba(); int vek(); void svatba(d_ref< Osoba > chot); void porod(d_ref< Osoba > dite); virtual d_set< d_string > aktivity();

Schéma - pokračování class Zamestnanec : Osoba { float plat; virtual d_set< d_string > aktivity(); }; class Student : Osoba { d_string rocnik; virtual d_set< d_string > aktivity(); };

Schéma - pokračování class Adresa { int cislo; d_string ulice; }; class Dum { Adresa adresa; d_list< d_ref< Byt > > byty; d_ref< Byt > nejlevnejsi(); };

Schéma - dokončení class Byt{ int cislo; d_ref<dum> dum; d_ref<osoba> je_obyvan; }; d_set<d_ref<osoba>> Osoby; //Vsechny Osoby, Zamestnanci a studenti d_set<d_ref<byt>> Byty; //Vsechny byty d_set<d_ref<byt>> Volne; //Vsechny volne byty d_list<d_ref<byt>> Adresar; //Byty serazene podle cisel`

Cestování mezi objekty Pro přístup k jednotlivým položkám v objektu OQL používá tečkovou notaci (stejn ě jako C++; lze užít i -> ve stejném smyslu) Osoba.vek = Osoba->vek Vzhledem k tomu, že vztahy jsou realizovány pomocí ukazatel ů, není problém pomocí tečkové notace adresovat i je (alespo ň 1-1 vztahy, komplikovanější vztahy viz. dále) P ř. Mějme objekt p třídy Osoba (viz. schém a) p.zije_v.dum.adresa.ulice Nám dá adresu ulice, kde daná osoba (objekt p ) bydlí

Cestování M-N Vztahy Pokud bychom chtěli jména všech dětí osoby p, nemůžeme jednoduše napsat p.deti.jmeno, protože deti je seznam ukazatel ů (nic nám ovšem nebrání adresovat jedno konkrétní dít ě takto: p.deti[0]. jmeno). Abychom dostali seznam jmen, musíme použít select-from-where klauzuli, podobn ě jako v SQL: select c.jmeno from c in p.deti výsledek je typu Bag<String>. Pokud chceme množinu (Set), použijeme klíčové slovo distinct stejn ě jako v SQL

Cestování - dokončení Nyní máme k dispozici prostředky pro navigaci mezi jakýmikoli objekty přes jakékoli vztahy a umíme adresovat jakékoli členské položky objektu. Malý příklad: Chceme znát adresy všech dětí každé osoby v databázi (pojmenovaná kolekce Osoby obsahuje všechny osoby v databázi) select c.zije_v.dum.adresa from p in Osoby, c in p.deti

Manipulace s daty Jeden z hlavních rozdíl ů mezi OQL a SQL je ten, že OQL musí umět manipulovat s komplexními hodnotami. Díky tomu umí OQL vytvořit jakoukoli komplexní hodnotu jako výsledek dotazu anebo i uvnit ř dotazu jako mezivýsledek Při konstrukci dané komplexní hodnoty OQL využívá těchto konstruktor ů: Struct - struktura Set množina (v matematickém smyslu - prvku se neopakují) Bag uspořádání prvk ů jako u množiny, ale prvky se mohou opakovat Array pole (dynamické) List seznam (uspo ádané pole, u kterého máme metody pro ř manipulaci insert, delete, atd )

příklad select struct (ja: p.jmeno, moje_adresa: p.zije_v.dum.adresa moje_deti: (select struct(jmeno: c.jmeno, adresa:c.zije_v.dum.adresa) from c in p.deti)) from p in Osoby Tento dotaz nám pro každou osobu vedenou v databázi dá její jméno, adresu a jméno a adresu všech jejích dětí. Výsledek je typu: struct {String ja; Adresa moje_adresa; Bag<struct{String jmeno; Adresa adresa}> moje_deti; }

Manipulace a objekty OQL umí také vytvářet jednotlivé objekty. Pro vytvoření objektu nějaké třídy se použije jméno třídy jako konstruktor (čili OQL umí vytvořit jen ty objekty, jejichž třídy jsou definovány v databázi). Atributy vytvářeného objektu mohou být inicializovány libovolným platným výrazem.

Příklad Vytvoříme budovu se dvěma byty Předpokládejme, že ve schématu databáze je definován typ List_apart takto: Typedef List<Ref<Byt> > List_byt; Dotaz pak bude mít tento tvar: Dum( adresa: Adresa(cislo: 10, ulice: Elm Street ), byty: List_byt(list(Byt(cislo:1), Byt(cislo: 2))))

Vyvolávání metod Metody objekt ů se vyvolávají stejným způsobem, jako se přistupuje k ostatním položkám objektu pomocí tečkové notace. Pokud daná metoda nemá žádné parametry, vyvolání vypadá stejn ě, jako přístup k nějaké členské proměnné. dum.nejlevnejsi.je_obyvan.jmeno nám vrátí jméno osoby, která bydlí v nejlevnějším byt ě v daném dom ě. nejlevnejsi je přitom metoda objektu dum, která vrátí jako návratovou hodnotu objekt typu Byt (ten nejlevně jší byt). Kdyby v objektu dum byla členská promě nná nejlevnejsi typu Byt, dotaz by vypadal naprosto stejn ě. Pokud metoda má nějaké parametry, dávají se do závorek za jménem metody

Polymorfismus Filosofie polymorfismu u OQL je stejná jako u OOP. select p.aktivity from p in Osoby V předcházejícím příklad ě se polymorfismus projevuje jednak v tom, že je v podstat ě uživateli skryto, že kolekce Osoby obsahuje 3 typy objekt ů (Osoba, Zamestnanec a Student) a jednak v tom, že je vždy zavolána správná virtuální metoda aktivity (mechanismu, který to zajišťuje se říká pozdní vazba)

Polymorfismus - dodatek Navíc uživatel může v dotazu explicitn ě specifikovat třídu u objektu, kde nemůže být odvozena staticky. (jako to bylo u objektu p v předchozím dotazu). To se děje pomocí tzv. Indikátoru třídy Interpret musí potom za běhu ověřovat, zda daný objekt je daného typu P ř.: select ((Student)p).rocnik from p in Osoby where prubeh studia in p.aktivity

Kompozice operátorů Pro používání operátor ů v OQL platí jednoduché pravidlo: operátor lze umístit kdekoliv, pokud typy jeho operand ů jsou korektní. Říkáme, že pravidla pro kompozici operátor ů jsou ortogonální k typovému systému V tom se OQL liší od SQL, kde toto neplatí na 100%

příklad Chceme znát jméno ulice, kde žijí zaměstnanci s nejnižším průměrným platem. Budeme postupovat krok za krokem a budeme používat define pro mezivýsledky

Příklad pokračování 1) Vytvoříme si seznam (přesněji Bag) všech zaměstnanců Define Zamestnanci as Select (Zamestnanec)p from p in Osoby where ma praci in p.aktivity

Příklad pokračování 2) Roztřídíme zaměstnance podle ulic a spočítáme průměrný plat pro každou ulici define plat_map as select ulice, prumerny_plat: avg(select p.e.plat from partition p) from e in Zamestnanci group by e.zije_v.dum.adresa.ulice Výsledek dotazu má typ: Bag<struct{String ulice, float prumerny_plat;}>

Příklad dokončení 3) předchozí výsledek utřídíme podle platu define setrideny_plat_map as select s from s in plat_map order by s.prumerny_plat Typ výsledku je: List<struct{String ulice, float prumerny_plat;}> 4) snadno zjistíme nejmenší hodnotu v seznamu první prvek setrideny_plat_map[0].ulice

Příklad jednou větou (select ulice, prumerny_plat: avg (select p.e.plat from partition p) from e in (select (Zamestnanec)p from p in Osoby where has a job in p.aktivity) group by e.zije_v.dum.adresa.ulice order by avg (select p.e.plat from partition p) )[0].ulice