ODMG OQL Jan Forch Dotazovací jazyky, MFF UK
Obsah Objektově orientované databáze Úvod do ODMG-93 Motivace Idea Datový model OQL Gramatika OQL Literatura Dotazy 2 Jan Forch - ODMG OQL
Objektově orientované databáze Objektový datový model V souladu s viděním světa (entita objekt) Definice složitých objektů a jejich manipulace OOSŘBD 3 Jan Forch - ODMG OQL
Úvod do ODMG-93 - historie 1993: konsorcium vůdčích výrobců OOSŘBD návrh standardu ODMG-93. Nadmnožina obecnějšího modelu Common Object Model (COM) vytvořeného skupinou OMG. Převzat byl jeho definiční jazyk IDL. Dotazovací část Object Query Language (OQL), která souvisí s koncepcí dotazovací části standardu SQL92. Rozhraní k OO PJ C++, Smalltalk (k Java: nahrazeno Java Data Objects (JDO)) 2001: skupina rozpuštěna (verze ODMG 3.0) OOPJ + SŘBD = OOSŘBD 4 Jan Forch - ODMG OQL
Úvod do ODMG-93 Třída (nebo typ), instance (nebo objekt), atribut, metoda a integritní omezení Třída - šablona pro instance (objekty), které mohou sdílet atributy a metody. Doména atributů: primitivní typ dat, abstraktní typ dat (ADT), nebo odkaz na třídu. Metoda je funkce (její implementace je skryta) aplikovatelná na instance třídy (výpočet založený na hodnotách atributů). Identifikátor objektu (OID) Každý objekt má jednoznačný identifikátor, prostřednictvím kterého lze z databáze získat odpovídající objekt. 5 Jan Forch - ODMG OQL
Idea Zapouzdření Data jsou zabalena spolu s metodami. Jednotkou zapouzdření je objekt. Metody jsou platné pouze na příslušných objektech, se kterými jsou zapouzdřeny. hierarchie tříd, dědění Podtřída hierarchie Dědění je proces znamenající pro podtřídu osvojení všech atributů a metod z nadtřídy. Vícenásobné dědění ( problémy např. řešení konfliktů stejných jmen zděděných atributů a metod). 6 Jan Forch - ODMG OQL
Datový model - standard ODMG (Object Data Management Group) standard pokrývá: Objektový model ODL (Object definition language), pro objektový model a jeho syntax, verze ODL pro C++ a Smalltalk OQL (Object query language) pro objektový model Propojení s C++, umožňující programům v C++ operovat nad databázemi splňující standard Propojení se SmallTalkem umožňující programům ve Smalltalku operovat nad databázemi splňující standard 7 Jan Forch - ODMG OQL
Datový model objektový model Objektový model ODMG je podporován ODMGcompliant object data management systems (ODBMS) Pokrývá: Charakteristiku objektů Jak spolu mohou objekty vzájemně souviset Jak mohou být objekty pojmenované a identifikované 8 Jan Forch - ODMG OQL
Datový model objektový model - požadavky Objektový model specifikuje tyto konstrukce: Základní modelovací primitiva jsou objekty a literály každý objekt má unikátní identifikátor. Literály nemají žádný identifikátor Objekty a literály jsou kategorizovány pomocí jejich typů Stavy objektů jsou definovány hodnotami jejich atributů Chování objektu je definováno množinou operací, které mohou být vykonány na jeho instancích nebo přímo instancemi samotnými ODMS ukládá objekty a umožňuje jejich sdílení více uživateli ODMS je založeno na datovém schématu ODMG a obsahuje instance objektů typů definovaných objektovým schématem ODMG 9 Jan Forch - ODMG OQL
Datový model - OQL Dotazovací jazyk nad objekty podle standardu ODMG Velmi podobný SQL Klausule select, from, where, group by, použity podobně jako v SQL (příklady později) Volnější syntaxe -> jednodušší gramatika 10 Jan Forch - ODMG OQL
Datový model - standard ODMG objektový model podporuje. Zápis tříd, objektů s atributy a metodami Dědičnost Klasické typy používané v databázích (string, date, ) Podporuje zápis vztahů pomocí mechanismu referencí Kolekce (set, list, ) Třídy použité pro praktickou realizaci spojení ODL a C++ importovány do zdrojových souborů jako knihovna 11 Jan Forch - ODMG OQL
Datový model příklad C++ class Person{ d_string name; d_date birthdate; d_set < d_ref<person> > parents inverse children; d_list < d_ref<person> > children inverse parents; d_ref<apartment> lives_in inverse is_used_by; }; Person(); int age(); void marriage( d_ref<person> spouse); void birth( d_ref<person> child); d_set< d_ref<person> > ancestors;; virtual d_set<d_string> activities(); 12 Jan Forch - ODMG OQL
Datový model - příklad C++ class Employee: Person{ float salary; }; virtual d_set<d_string> activities(); class Student: Person{ d_string grade; }; virtual d_set<d_string> activities(); 13 Jan Forch - ODMG OQL
Datový model - příklad C++ class Address{ int number; d_string street; }; class Building{ Address address; d_list< <d_ref<apartment> > apartments inverse building; d_ref<apartment> less_expensive(); }; class Apartment{ int number; d_ref<building> building; d_ref<person> is_used_by inverse lives_in; }; d_set< d_ref<person> > Persons; d_set< d_ref<apartment> > Apartments; d_set< d_ref<apartment> > Vacancy; d_list< d_ref<apartment> > Directory; }; 14 Jan Forch - ODMG OQL
OQL - principy OQL je založen na objektovém modelu ODMG OQL je nadmnožina dotazovací části SQL což umožňuje použití OQL pro dotazování nad databází Jakýkoliv dotaz, který funguje na relační databázi funguje i nad OQL Rozšíření zahrnují značení pro objektově orientovaný přístup k datům, identitu objektů, vyjádření cesty k datům tečkovou notací, polymorfismus, volání operací, pozdní vazbu v případě použití polymorfických struktur OQL poskytuje primitiva pro práci s kolekcemi (množinami, multi-množinami, seznamy, poli) 15 Jan Forch - ODMG OQL
OQL - principy OQL je funkcionální jazyk, kde operátory mohou být volně používány a spojovány pokud jejich operandy dodržují očekávaný typ operátorů To je důsledek toho, že jakýkoliv výsledek dotazu v OQL odpovídá standardu ODMG, a tudíž nad ním může být volán další dotaz OQL není výpočetně úplný jazyk, je to jednoduchý dotazovací jazyk pro přístup do objektových databází OQL může být voláno přímo z programů napsaných v jazyce, pro které je definován ODMG binding (C++, SmallTalk) Naopak OQL může volat operace napsané v těchto jazycích 16 Jan Forch - ODMG OQL
OQL - principy OQL neposkytuje explicitní aktualizační operátory ale raději používá volání operací definovaných pro tento účel přímo na objektech Neporušuje sémantiku objektové databáze, která je podle definice spravovaná pomocí metod definovaných na objektech Dotazy OQL jsou výrazy sestavené pomocí typovaných operandů spojených rekurzivně do dotazu pomocí operátorů 17 Jan Forch - ODMG OQL
OQL základy syntaxe Spojení funkcionálního programování, SQL a OO programovacího jazyka (C++) Dále popis syntaxe OQL ve formátu popis jednotlivé funkcionality podporované OQL + příklad 18 Jan Forch - ODMG OQL
OQL přístup k atributům p.lives_in.building.adddress.street Přístup k atributům a metodám objektů pomocí. a -> notace Přístupy je možno řetězit libovolně za sebe p je instance třídy Person 19 Jan Forch - ODMG OQL
OQL atomické literály Literály v OQL mají obvyklý význam Objektový literál: nil Logický literál: false, true Integer literál: sekvence číslic, např. 27 Float literál: např. 3.14 nebo 314.16e-2 Znakový literál: znak mezi apostrofy, např. z Řetězcový literál: řetězec mezi uvozovkami např.,"a string" 20 Jan Forch - ODMG OQL
OQL select, from select c.name from c in p.children Klasický tvar dotazu Dotaz: Vrať jména dětí osoby p select distinct c.name from c in p.children Eliminace duplicit ve výsledku select c.lives_in.building.address from p in Persons, c in p.children V OQL může kolekce ve from části dotazu dědit od předchozí kolekce použitím cesty, která začíná v položce předchozí kolekce p se v tomto kontextu nazývá iterátorem 21 Jan Forch - ODMG OQL
OQL formát výsledku dotazu select může vracet záznamy ve formě seznamu, množiny, multi-množiny, pole Implicitní forma je multi-množina (Bag) Záznamy se mohou opakovat Použitím klíčového slova distinct se změní forma výsledku na množinu (Set) Pořadí prvků při procházení je nedefinováno Použitím klíčového slova order by v dotazu se změní forma výsledku na seznam (List) Pořadí definováno tělem order by sekce dotazu 22 Jan Forch - ODMG OQL
OQL where select c.lives_in.building.address from p in Persons, where c in p.children p.lives_in.building.address.street = "Main Street" and count(p.children) >= 2 and c.lives_in!= p.lives_in where klauzule realizována predikátem, který eliminuje nevyhovující záznamy Dotaz: Vrať adresy dětí rodičů majících trvalé bydliště na "Main Street, kteří mají alespoň 2 děti, kde dítě bydlí jinde než rodič 23 Jan Forch - ODMG OQL
OQL join select p from p in Persons, b in (select distinct a.building from a in Apartments) where p.name = b.address.street Spojení lze provést i mezi entitami, které nejsou provázány přímo na objektové úrovni Pomocí vnořeného dotazu Dotaz: Vrať osoby se jménem stejným jako ulice, na které se nachází některý z bytů 24 Jan Forch - ODMG OQL
OQL manipulace s daty select struct(me: p.name, from p in Persons my_address: p.lives_in.building.address, my_children: (select struct(name: c.name, from c in p.children)) address: c.lives_in.building.address) Když potřebujeme výsledná data zformátovat do určité datové struktury Klíčové slovo struct slouží k označení sekce s definicí struktury Struktury mohou být libovolně zanořené do sebe viz. příklad 25 Jan Forch - ODMG OQL
OQL volání metod OQL dovoluje volat metody s/bez parametrů kdekoliv, kde výsledný typ metody odpovídá požadovanému typu v dotazu V případě, že metoda nemá žádné parametry, její volání se neliší od přístupu k atributům objektu Tento volný syntax uvolňuje práci jazykem (Uživatel nemusí vědět, zda je daná hodnota přímo atributem, či zda je spočítaná.) select max(select c.age from c in p.children) from p in Persons, where p.name = "Paul" 26 Jan Forch - ODMG OQL
OQL polymorfismus Hlavním přínosem objektové technologie je možnost manipulace s polymorfickými strukturami Příklad: třídy Person, Employee, Student Každá má jinou implementaci metody activities() vracející aktivity typické pro daný typ osoby select p.activities from p in Persons Persons je pole polymorfických struktur dědících od třídy Person Při volání daného selectu z příkladu se pokaždé zavolá správná implementace metody activities v závislosti na konkrétním typu instance 27 Jan Forch - ODMG OQL
OQL přetypování Pokud potřebujeme jít v hierarchii tříd níže od předků k potomkům, je možné použít mechanismu přetypování. Interpret OQL musí korektně zkontrolovat, zda daná instance může být přetypována na potomka Motivací je nutnost dostat se k metodám, které jsou v potomkovy implementovány select ((Student)p). grade from p in Persons where "course of study" in p.activities 28 Jan Forch - ODMG OQL
OQL pojmenování výsledků dotazů OQL umožňuje pojmenovat výsledky dotazů Takto pojmenované výsledky je poté možno použít v jiných dotazech jako vstupy define Employees as select (Employee) p from p in Persons where "has a job" in p.activities define salary_map as select street, average_salary: avg (select p.e.salary from partition p) from e in Employees group by e.lives_in.building.address.street 29 Jan Forch - ODMG OQL
OQL testování na nil Poté co uživatelská aplikace změní data v OOSŘBD, některé objekty (reference na ně) mohou nabývat hodnoty nil Je možné testovat objekt proti této hodnotě a zjišťovat tak validitu instance objektu select c.name from c in Globe.clients where c!=nil and count (c.order) = 3 Kvůli zjednodušení probíhá tento test v souladu se standardem implicitně, predikát where je v případě nil objektu vyhodnocen vždy na false, záznam je tedy automaticky přeskočen Se stejnou sémantikou je tedy možno psát: select c.name from c in Globe.clients where count (c.order) = 3 30 Jan Forch - ODMG OQL
OQL přístup k prvkům pole Pro přístup k prvkům pole se používá klasická syntaxe ve formátu: Globe.clients[2] 31 Jan Forch - ODMG OQL
OQL vytváření objektů OQL umožňuje vytváření dočasných objektů Atributům je přiřazena hodnota odpovídající položky s parametrů Client (name: "Trent") o2_list_client (list(client(name:"john"), (Client(name:"Jack"))) 32 Jan Forch - ODMG OQL
OQL operátory - count Vrací počet prvků kolekce Parametrem je kolekce, pro níž chceme znát její mohutnost count (Globe.employees) Jedná se o agregační operátor (podobně jako v SQL je možné použít nad řádky agregovanými podle nějaké domény) Podobně se chovají i operátory min, max, sum and avg 33 Jan Forch - ODMG OQL
OQL operátory - element Pokud má uživatel strukturu množiny výsledků dotazu o jednom prvku, může jej přímo extrahovat ze struktury pomocí operátoru element element ( select e from e in Globe.employees where e.name = "Tintin") 34 Jan Forch - ODMG OQL
OQL operátory - exists Existenční operátor ve smyslu predikátové logiky s podobnou sémantikou jako jeho ekvivalent v SQL select c.name from c in TheCompanies where exists e in c.employees: e.age < 23 35 Jan Forch - ODMG OQL
OQL operátory group by Seskupuje dohromady objekty kolekcí se stejnou hodnotou určitých atributů Nad atributy, podle kterých neprobíhá agregace je možno volat ve výsledku dotazu agregační operátory select * from e in Globe.employees group by e.salary Výsledek dotazu je tvaru: bag (struct (salary: real, partition: bag (struct (e:employee)))) První složka struktury je hodnota atributů určité skupiny, přes které se agreguje (plat), druhá složka je ve standardu pojmenovaná partition obsahuje množinu objektů (zaměstnanců) se stejnou hodnotou atributu, přes který se agregovalo (plat) select salary, number: count (partition) from e in Globe.employees group by e.salary having count (partition) > 10 36 Jan Forch - ODMG OQL
OQL operátory having Podobně jako v SQL umožňuje filtrovat agregované skupiny podle hodnot vrácených agregačními operátory select salary, number: count (partition) from e in Globe.employees group by e.salary having count (partition) > 100 37 Jan Forch - ODMG OQL
OQL operátory like Podobně jako v SQL umožňuje porovnávat řetězcové atributy proti zjednodušeným regulárním výrazům select distinct e.salary from e in Globe.employees where e.name like "Sp*" 38 Jan Forch - ODMG OQL
OQL operátory order by Podobně jako v SQL umožňuje řadit výsledky dotazů podle určených atributů select e from e in Globe.employees order by e.name, e.age 39 Jan Forch - ODMG OQL
OQL operátory množinové OQL umožňuje na množiny objektů aplikovat operace sjednocení, průnik, rozdíl + (union) sjednocení * (intersect) průnik - (difference) rozdíl Je možné použít libovolně jak znaménkový tak slovní zápis MyEmployees + YourEmployees Sémantikou operátoru pick je získání libovolného prvku množinové kolekce pick (MyEmployees) 40 Jan Forch - ODMG OQL
OQL konverze list to set OQL umožňuje převádět kolekce (množina, list, ) mezi sebou Důležité v případě nutnosti použití kolekce jako parametru metody či operátoru Očekává parametr určitého typu Funkce listtoset konvertuje list nebo pole na množinu listtoset (Globe.clients) intersect listtoset (TheCompanies[2].clients) Operátor order by použitý v dotazu konvertuje implicitní formát výsledku dotazu (množinu nebo multimnožinu) na seznam (list) select e from e in the_employees order by e.salary Pokud nám jde jen o formát výsledku je možné použít zápis: select e from e in the_employees order by * 41 Jan Forch - ODMG OQL
OQL konverze flatten OQL umožňuje převádět kolekce kolekcí na ploché kolekce pomocí operátoru flatten (spojení obsahu kolekcí do jedné velké) flatten (select distinct c.clients from c in TheCompanies) 42 Jan Forch - ODMG OQL
Gramatika OQL - ukázka OQL je definována pomocí BNF (Backus Naur Form), froma bezkontextové gramtiky query_program ::={define_query;} query define_query ::=define identifier as query query ::= nil query ::= true query ::= false query ::= integer_literal query ::= float_literal query ::= character_literal query ::= string_literal query ::= entry_name query ::= query_name query ::= bind_argument1 query ::= from_variable_name query ::= (query) query ::= query + query2 query ::= query - query query ::= query * query query ::= query / query query ::= - query query ::= query mod query query ::= abs (query) query ::= query query query ::= query comparison_operator query query ::= query like string_literal comparison_operator ::= = comparison_operator ::=!= comparison_operator ::= > comparison_operator ::= < comparison_operator ::= >= 43 Jan Forch - ODMG OQL
Gramatika OQL priorita operátorů Výpis operátorů sestupně podle priority (operátory se stejnou prioritou se vyhodnocují zleva doprava): () []. -> not - (unarní) + (unární) i n * / mod intersect + - union except < > <= >= < some < any < all (atd.... pro všechny porovnávací operátory) =!= like and exists for all or.. :, (identifikátor) operátor přetypování order having group by where from select 44 Jan Forch - ODMG OQL
Literartura ODMG OQL User Manual Release 5.0 February 1998 The Object Data Standart: ODMG 3.0 (R.G.G Catell, Douglas K. Barry) 45 Jan Forch - ODMG OQL
Otázky??? 46 Jan Forch - ODMG OQL