Upload
annabelle-wilkerson
View
216
Download
2
Embed Size (px)
Citation preview
Object Query Language (OQL)
Marián KamenišťákMFF – UK Praha26.11.2003
Úvod
podobný SQL jazykuzaložený na ODMG štandarteArchitektúra: Nástroje: C, C++, Java, … DB engine: napr. O2 engine & store Interfaces: O2ODBC, O2Cobra, ..
Základné dotazy (C++)
class item {String what; double price;};class client {String name;
Array <item> order;int amount();};
Základné dotazy
Select distinct e.salary from e in Schema.employees
where e.family != nil and e.position = “reporter”;
… where count(e.children) >=1;… group by … having …… order by … (vracia pole) existujú agregačné fcie: min, max, sum, avg
Tvorenie výsledkov
Define MyEmployees asselect struct(employee:
struct(e.name,position: e.post),
salary: e.salary)from e in Company.employees;
element (select e from e in MyEmployees where e.salary>150000);
Množinové operátory
Zjednotenie(+): MyEmployees + YourEmployeesPrienik (*)Rozdiel (-)
Konverzie
listtoset(Companies[2].clients)Naopak: select e from e in MyEmployees order by e.name;z kolekcie kolekcií na plochú kolekciu:flatten(select e.clients from c in
Companies); flatten(list(list(1,2), list(1,2,3)))
-> list(1,2,1,2,3)
‘string’ like ‘%nice_%’
Preddefinované typy kolekcií
Set<T> - mna set(1,2,5)
Bag<T> - multimna bag(1,2,2,3,3)
Varray<T> - dynamické poleList<T> - Varray s metódami pre manipuláciu (insert, delete,..) list(1,2,2,3); list(3..5)
Ref - perzistentný pointer
Pokročilé OQLclass Person {String name;Date birth;set<ref<Person>> childs inverse parents;set<ref<Person>> parents inverse childs;
Person(); //constructorvoid birth(ref<Person> child); //narodenie d.virtual set<String> activities();
}
OQL
class Employee:Person{ //podtriedafloat salary;virtual set<String> activities();//predefinit.
};
Join: Select p from p in Persons,
b in (select a.building from a in Apartments)
Where p.name = b.address.street;
OQL – Data manipulation
select struct (me:p.name,
address:p.lives_in.building.address;childs: (select struct(name: c.name,
address: c.lives_in.building.address)
from c in p.children))from p in Persons;//adresy detí cez všetky osoby.
OQL Polymorfizmus
napr. mna Persons obsahuje prvky tried Preson, Employee, Student.Potom sa virtuálna metóda activities() vykoná pre konkrétnu triedu. Select ((Student)p).grade
from p in Personswhere “lecture” in p.activities;
OQL
define salary_map asselect street,
average_salary: avg(select p.e.salary from partition p)
from e in Employeesgroup by e.lives_in.building.address.street;
//returns Bug<struct{String street; float avg_salary;>};
OQL
define sorted_salary_map asselect s from s in salary_maporder by s.average_salary
List<struct{String street; float avg_salary;}>
sorted_salary_map[2].street;
OQL
define Jakes asselect x from Students xwhere x.name = “Jake”;
define Jake as first(element(select x from Students xwhere x.name = “Jake”));
//first, last operators in list
OQL
Prechádzanie štruktúrami: person.name == person->name //rovnaké Jake->woman!=nil and Jake->woman->name=Carol
Dereferencie p1 = p2 je pravda, ak ukazujú na rovnaký objekt *p1 = *p2 je pravda, ak majú rovnaké hodnoty
OQL - group by
select * from Employees egroup by
low: e.salary<1000,medium: e.salary>=1000 and
e.salary<2000,high: e.salary>=2000;
Vytvorí pomenované partition bugy
Literatúra
ODMG OQL user manual 5.0 feb. 1998