chapter 8 object-oriented query languages

46
1 Chapter 8 Object-oriented Query Languages

Upload: tess98

Post on 25-May-2015

3.419 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Chapter 8 Object-oriented Query Languages

1

Chapter 8

Object-oriented Query Languages

Page 2: Chapter 8 Object-oriented Query Languages

2

Object-oriented query language

• OQL (Object Query Language)– ODMG (Object Database Management Group)

– ODMG-93 release 1.2 (1993)

– The Object Database Standard: ODMG 2.0, Ed. R.G.G. Cattell and D.K. Barry, Morgan Kaufmann, 1997

• SQL3– ISO/IEC JTC1 SC21 WG3

– http://speckle.ncsl.nist.edu/~ftp/

• While OQL is trying to bring the best of SQL into the object-oriented world, SQL3 is trying to bring the best of objet-orientation into the relational world

Page 3: Chapter 8 Object-oriented Query Languages

3

Using an OODBMS

Declarations inODL or PL ODL

Application Sourcein [extended] PL

DeclarationPreprocessor

PL Compiler

ODBMSRuntime

ApplicationBinary

Linker

RunningApplicationDatabase

data access

metadata

Page 4: Chapter 8 Object-oriented Query Languages

4

ODL

• The coupling of ODL definitions and the host language is tighter– The host language should be object-oriented (C++, Smalltalk)

– the ODL declarations can be translated directly into declarations of the host language

Copy andTranslation

ApplicationData Structures

RelationalRepresentation

RDBMS

TransparentODBMS

Data Transfer

Page 5: Chapter 8 Object-oriented Query Languages

5

Method signature in ODL

• ODL allows method as property– A function associated with a class

– Applied to an object and may also take one or more other arguments

• declare the method names and function parameters – The actual code for a method would be written in the host language

– Function name can be overloaded

• Signature syntax – Functions parameters are specified to be in, out or inout

– The function may have a return value

– Functions may raise exceptions

Page 6: Chapter 8 Object-oriented Query Languages

6

Adding method signature to the Movie class– interface Movie

(extent Movieskey (title, year))

{

attribute string title;

attribute integer year;

attribute integer length;

attribute enumeration {color, blackAndWhite} filmType;

relationship set <Star> stars inverse Star::starredIn;

relationship Studio ownedBy inverse Studio::owns;

float lengthInHours() raises (noLengthFound);

starNames(out set <string>);

otherMovies(in Star, out set <Movie>) raises (noSuchStar);

};

Page 7: Chapter 8 Object-oriented Query Languages

7

The extent of a class

• The extent of a type is the set of all instances of the type within a particular database– If an object is an instance of the type A, then it will of necessity to be

member of the extent of A

– If a type A is a subtype of type B, then the extent of A is a subset of the extent of B

• Declaration format– EXTENT <extent name>

– Must appear immediately after the declaration of the interface name

• OQL queries refer to the extent of a class, not to the class name itself

Page 8: Chapter 8 Object-oriented Query Languages

8

An object-oriented movie schemainterface Movie (extent Movies key (title, year)){ attribute string title; attribute integer year; attribute integer length; attribute enumeration {color, blackAndWhite} filmType; relationship Set <Star> stars inverse Star::starredIn relationship Studio ownedBy inverse Studio::owns; float lengthInHours() raises (noLengthFound); starNames (out Set<String>); otherMovies (in Star, out Set<Movie>) raises (noSuchStar);};interface Star (extent Stars key name){ attribute string name; attribute struct Addr {string street, string city} address; relationship Set<Movie> starredIn inverse Movie::stars;};

interface Studio (extent Studios key name){ attribute string name; attribute string address; relationship Set<Movie> owns inverse Movie::ownedBy;};

Page 9: Chapter 8 Object-oriented Query Languages

9

The OQL type system

• There are no limits in OQL on the depth of nesting of type constructors

• Constants (immutable objects) are constructed as below:– Basic types

• atomic types: integers, floats, characters, strings, and Booleans

• enumerations: the values in an enumeration are actually declared in ODL. Any one of these values may be used as a constant

– Complex types • Set (…), Bag (…), List (…), Array (…), Struct (…)

• The first four of these are called collection types

• Example– struct(foo: bag(1,2,1), bar: “baz”)

Page 10: Chapter 8 Object-oriented Query Languages

10

Path expression• If a denotes an object belonging to class C, and p is some property of t

he class, then a.p denotes the result of “applying p to a”.– if p is an attribute, then a.p is the value of that attribute in object a– if p is a relationship. Then a.p is the object or collection of objects related

to a by relationship p– if p is a method, then a.p is the result of applying p to a

• OQL uses the arrow () as a synonym for the dot

• For example– Suppose myMovie is a host-language variable for the Movie object– myMovie.length– myMovie.lengthInHours()– myMovie.stars– myMovie.starNames(myStars)

Page 11: Chapter 8 Object-oriented Query Languages

11

Select-from-where expressions in OQL

• OQL’s select-from-where is similar to SQL’s – Possible to use any collect-producing expression such as another select-fr

om-where expression (for example, in the FROM clause, in the SELECT clause)

– Use != rather than <>

• The query produces a bag of objects

• Example– SELECT m.year

FROM Movies mWHERE m.title = “Gone with the Wind”

Page 12: Chapter 8 Object-oriented Query Languages

12

Example of select-from-where expressions

• Find the names of the stars of Casablanca– select s.name

from Movies m, m.stars s

where m.title = “Casablanca”;

– Evaluation can be carried out this way:

for each m in Movies do

for each s in m.stars do

if m.title = “Casablanca” then

add s.name to the output bag

Page 13: Chapter 8 Object-oriented Query Languages

13

Eliminating duplicates

• Technically a query produces a bag, rather than a set as an answer

• To eliminate duplicates, use DISTINCT following SELECT

• Example– SELECT DISTINCT s.name

FROM Movies m, m.stars s

WHERE m.ownedBy.name = “Disney”;

Page 14: Chapter 8 Object-oriented Query Languages

14

Complex output types

• The expression(s) in the SELECT clause can be any expression, including expressions built using type constructors.

• Example– Find the set of pairs of stars living at the same address

– select star1: s1, star2: s2

from Stars s1, Stars s2

where s1.addr = s2.addr and s1.name < s2.name;

Page 15: Chapter 8 Object-oriented Query Languages

15

Subqueries

• A select-from-where expression can be present in FROM clause

• The similar capability will be a part of the proposed SQL3

• Example– Retrieve the stars of the movies made by Disney

– select distinct s.name

from Movies m, m.stars s

where m.ownedBy.name = “Disney”

– select distinct s.name

from (select m

from Movies m

where m.ownedBy.name = “Disney”) d, d.stars s

Page 16: Chapter 8 Object-oriented Query Languages

16

Ordering the result

• We can make the output be a list with an ORDR BY clause, while the result of OQL is normally either a bag or (if distinct is used) a set

• Example– find the set of Disney movies, but let the result be a list of movies, ordere

d by length. If there are ties, let the movies of equal length be ordered alphabetically.

– Select m

from Movies m

where m.ownedBy.name = “Disney”

order by m.length, m.title;

• ASC vs DESC

Page 17: Chapter 8 Object-oriented Query Languages

17

Quantifier expressions

• We can test whether all, or at least one, member of a set satisfies some condition– FOR ALL x IN S : C(x)

– EXISTS x IN S : C(x)

• Example– Find all the stars of Disney movies

select s

from Stars s

where exists m in s.starredIn : m.ownedBy.name = “Disney”

– Find stars that have appeared only in Disney moviesselect s

from Stars s

where for all m in s.starredIn : m.ownedBy.name = “Disney”;

Page 18: Chapter 8 Object-oriented Query Languages

18

Aggregations

• OQL uses the same five aggregation operators that SQL does– AVG, COUNT, SUM, MIN and MAX

– the operators in OQL apply to collections whose members are of a suitable type

• Example– To compute the average length of all movies

– AVG (select m.length from Movies m)

Page 19: Chapter 8 Object-oriented Query Languages

19

Group-by expressions (1)

• The form of GROUP BY clause– GROUP BY f1:e1, f2:e2, …, fn:en

• When there is only one variable x in the FROM clause– The value of x ranges over some collection C

– The actual value returned by the GROUP BY is a set of structures

– Struct (f1:v1, f2:v2, …, fn:vn, partition: P)

– v1, v2, …, vn are a list of values that comes from evaluating e1(i), e2(i), …, en(i) for at least one value of i in the collection C

– The last field has the special name Partition. P is a bag consisting of structures of the form

Struct (x:i)

– The SELECT clause may refer only to the fields in the result of the GROUP BY, namely f1, f2, …, fn, partition

Page 20: Chapter 8 Object-oriented Query Languages

20

Group-by expressions (2)

• The variables appearing in the FROM clause are x1, x2, …, xk

– All variables x1, x2, …, xk may be used in the expressions e1, e2, …, en of the GROUP BY clause

– Structures in the bag that is the value of the partition field have fields named x1, x2, …, xk

– Suppose i1, i2, …, ik are values for x1, x2, …, xk, respectively, that make the WHERE clause true. Then there is a structure in the set that is the result of the GROUP BY of the form

Struct(f1:e1 (i1, i2, …, ik ), …, fn:en(i1, i2, …, ik ), partition P)and in bag P is the structure:

Struct(x1:i1, x2:i2, …, xk:ik)

Page 21: Chapter 8 Object-oriented Query Languages

21

Example of group-by expressions

• Build a table of the total length of movies for each studio and for each year– select std, yr, sumLength: SUM(select p.m.length from partition p)

from Movies m

group by std: m.ownedBy.name, yr: m.year

– Result of group by: a set of structures

Page 22: Chapter 8 Object-oriented Query Languages

22

Having clauses

• To eliminate some of the groups created by the GROUP BY, use a HAVING clause– HAVING <condition>

• Example– Compute the sum of the lengths of movies for only those studios and year

s such that the studio produced at least one movie of 120 minutes

– select std, yr, sumLength: SUM (select p.m.length from partition p)

from Movies m

group by std : m.ownedBy.name, yr : m.year

having max (select p.m.length from partition p) > 120

Page 23: Chapter 8 Object-oriented Query Languages

23

Set operators

• The operators UNION, INTERSECT, EXCEPT operate on either sets or bags– Set-oriented process takes place only if both operands are sets

• Rules for operating on bags – Suppose an object x appears n1 and n2 times in B1 and B2 respectively

– In B1 B2, x appears n1+n2 times

– In B1 B2, x appears min (n1, n2) times

– In B1 B2, x appears

• if n1 n2, then 0 times

• if n1 > n2, then n1 - n2 times

Page 24: Chapter 8 Object-oriented Query Languages

24

Example of set operators

• Find the set of movies starring Harrison Ford that were not made by Disney– (select distinct m

from Movies m, m.stars s where s.name = “Harrison Ford”) except (select distinct m from Movies m where m.ownedBy.name = “Disney”)

Page 25: Chapter 8 Object-oriented Query Languages

25

Assigning values to host-language variables

• It is possible to assign result of OQL expressions to host-language variable of the proper type

• Example– Retrieve all movies made before 1920

– select distinct m

from Movies m

where m.year < 1920

– if oldMovies is a host-language variable of set<Movie>

– oldMovies = select distinct m

from Movies m

where m.year < 1920;

Page 26: Chapter 8 Object-oriented Query Languages

26

Extracting elements of collections

• OQL provides the operator ELEMENT to turn a singleton set or bag into its lone member

• Example– gwtw = element (select m

from Movies m

where m.title = “Gone With The Wind”

);

– The SELECT statement must return a bag with one element only

Page 27: Chapter 8 Object-oriented Query Languages

27

Obtaining each member of a collection

• Need to make a set (bag) into a list, using ORDER BY

• Can access ith element by L[i-1]

• Example– A C++ function that prints the title, year, and length of each movie

– movieList = select m from Movies m order by m.title, m.year;

numberOfMovies = count(Movies);

for (i = 0; i < numberOfMovies; i++) {

movie = movieList[i];

cout << movie.title << “ “ << movie.year << “ “ << movie.length << “\n”;

}

Page 28: Chapter 8 Object-oriented Query Languages

28

Creating new objects

• OQL expressions allow us to create new object– In place of the triangular brackets that are used describe types, the round p

arentheses are used when we are constructing values

• Example– x = Struct (a:1, b:2);

y = Bag (x, x, Struct (a:3, b:4));

– Suppose that the type StarPair is struct{star1: Star, star2: Star}

– Select distinct StarPair(star1: s1, star2: s2)

from Stars s1, Stars s2

where s1.addr = s2.addr and s1.name < s2.name

– The query returns Set<StarPair>

Page 29: Chapter 8 Object-oriented Query Languages

29

Tuple objects in SQL3

• OQL has no specific notion of relation, objects in SQL3 keep relations as a central concept

• Objects in SQL3– Row objects

– Abstract Data Types (ADT, value ADT)

Page 30: Chapter 8 Object-oriented Query Languages

30

Row types

• In SQL3, one can define a row type T– CREATE ROW TYPE T ( <component declarations> )

• Example– Create row type AddressType (

street char(50), city char(20)

);

Create row type StarType (

name char(30),address AddressType

);

Page 31: Chapter 8 Object-oriented Query Languages

31

Declaring relations with a row type

• May declare one or more relations whose tuples are of a row type– CREATE TABLE <table_name> OF TYPE < row type name>

• Example– Create table MovieStar of type StarType;

• To access a component, use a double-dot notation that corresponds closely to the single-dot notation of OQL or C

• Example– Find the name and street address of each star living in Beverly Hills

– select MovieStar.name, MovieStar.address..street

from MovieStar

where MovieStar.address..city = ‘Beverly Hills’;// “MovieStar.” is not necessary

Page 32: Chapter 8 Object-oriented Query Languages

32

References

• If T is a row type, then REF(T) is the type of a reference to a tuple of type T

• Example– Create row type MovieType (

title char(30), year integer, inColor bit(1) );

Create table Movie of type MovieType;

Create row type StarType (

name char(30), address AddressType,

bestMovie ref(MovieType)); // reference to the star’s best movie

Page 33: Chapter 8 Object-oriented Query Languages

33

Example of references

• Represent the stars-in relationship (M:N) between movies and stars– Is likely that use of collection types as attribute types will be deferred to S

QL4

– Hence, need to create a separate relation for the M:N relationship

– Create row type MovieType (

title char(30), year integer, inColor bit(1));

Create row type AddressType (street char(50), city char(20));

Create row type StarType (name char(30), address AddressType);

Create row type StarsInType (star ref(StarType), movie ref(MovieType));

Create table Movie of type MovieType;

Create table MovieStar of type StarType;

Create table StarsIn of type StarsInType;

Page 34: Chapter 8 Object-oriented Query Languages

34

Following references

• In SQL3, -> is used for dereferencing (same meaning as in C)

• if x is a reference to a tuple t and a is an attribute of t, then x -> a is the value of the attribute a in tuple t

• Example– Find the titles of all the movies in which Mel Gibson starred

– Select movie->title

from StarsIn

where star->name = ‘Mel Gibson’;

Page 35: Chapter 8 Object-oriented Query Languages

35

Dereferencing and component-extraction

• The dot and -> operators are synonyms in OQL– each applies to an OQL object that is a tuple and returns a component of

that object

• In SQL3 – “->” is applicable to a reference to tuple

– dot operator is applicable to tuple variable

– if r is a reference to a tuple t, then r->a yields the same value as t..a

Page 36: Chapter 8 Object-oriented Query Languages

36

Domains and row types

• Major differences between domains and row types– Domains define types for components, while row types are types for

entire tuples

– Two domains can represent the same type and values from those domains will not be distinguished

– However, suppose two row types T1 and T2 have identical definitions. Then tuples from relations with those types cannot be interchanged

• An attribute whose type is a reference to a T1 cannot be made to refer to a tuple whose type is T2

Page 37: Chapter 8 Object-oriented Query Languages

37

Scopes of references

• SQL3 provides a mechanism for specifying which relation a reference attribute refers to

– SCOPE FOR <attribute> IS <relation>– The named attribute whose type must be a reference, always refers to a tupl

e of the named relation

• Example– Create row type StarsInType (

star ref(StarType), movie ref(MovieType) );

Create table StarsIn of type StarsInType

scope for star is MovieStar,

scope for movie is Movie;– Useful when there are other relations declared to be type StarType or Movie

Type

Page 38: Chapter 8 Object-oriented Query Languages

38

Object identifiers as values

• In SQL3, we can refer to object IDs explicilty– VALUES FOR <attribute> ARE SYSTEM GENERATED

• Example– create row type MovieType (

movie_id ref(MovieType),

title char(30), year integer, inColor bit(1));

Create table Movie of type MovieType

values for movie_id are system generated;

Page 39: Chapter 8 Object-oriented Query Languages

39

Abstract data types in SQL3

• Row types are not encapsulated !

• SQL3 has another “class” definition, abstract data type (ADT), that does support encapsulation– Objects of an ADT are used as components of tuples, not as tuples

themselves

Page 40: Chapter 8 Object-oriented Query Languages

40

Defining ADT’s

• ADT definition :– CREATE TYPE <type name> (

list of attributes and their types

optional declaration of = and < functions for the type

declaration of functions (methods) for the type );

• SQL3 provides certain “built-in” functions with every ADT, and these do not need to be declared or defined– Constructor function that returns a new object of the type

– Observer functions for each attribute that return the value of this attribute

– Mutator functions for each attribute that set the value of that attribute to a new value

Page 41: Chapter 8 Object-oriented Query Languages

41

Example of defining ADT’s– Create type AddressADT (

street char(50), city char(20),

equals addrEq,less than addrLT,

other function could be declared here );

– Create type Mpeg (

video blob,length integer,

copyright varchar(255),

equals default,less than none,

definitions of functions go here );

Page 42: Chapter 8 Object-oriented Query Languages

42

Defining methods for ADT’s

• After the attribute list of an ADT, we can append any list of function declarations– FUNCTION <name> ( <arguments> ) RETURNS <type> ;

• Functions are of two types: internal and external– external: written in host language and only their signature appears in the

definition of the ADT

– internal: written in an extended SQL

– some options• := assignment operator

• A variable local can be declared by giving its name, preceded by a colon and followed by its type

• The dot operator is used to access components of a structure

• Boolean values can be expressed as in WHERE clauses

• BEGIN and END are used to collect several arguments into the body of a function

Page 43: Chapter 8 Object-oriented Query Languages

43

ADT definition example (1/2) – Function AddressADT (:s char(50), :c char(20)) returns AddressADT;

:a AddressADT;

begin

:a := AddressADT(); // built-in constructor

:a.street := :s;

:a.city := :c;

return :a;

end;

– Function addrEq (:a1 AddressADT, :a2 AddressADT) returns boolean;

return(:a1.street = :a2.street and :a1.city = :a2.city);

Page 44: Chapter 8 Object-oriented Query Languages

44

ADT definition example (2/2)– Function addrLT (:a1 AddressADT, :a2 AddressADT) returns boolean;

return ((:a1.city < :a2.city) or (:a1.city = :a2.city) and (:a1.street < :a2.street)

);

– Function fullAddr (:a AddressADT) returns char(82);:z char(10);

begin

:z = findZip (:a.street, :a.city);

return(:a.street || ‘ ‘ || :a.city || ‘ ‘ || :z);

end;

Page 45: Chapter 8 Object-oriented Query Languages

45

External functions

• ADTs may also have methods that are written in some host language rather than in SQL3– DECLARE EXTERNAL <function name> <signature>

LANGUAGE <language name>

• Example– DECLARE EXTERNAL findZip

char(50) char(20) RETURNS char(10)

LANGUAGE C;

Page 46: Chapter 8 Object-oriented Query Languages

46

Comparison of ODL/OQL and SQL3

ODL/OQL SQL3 row types SQL3 ADTs

Programmingenvironment

Embedded in an OOprogramming language

Limited interfacebetween SQL and host-

language variables

Additionallyexternal function

Role ofrelations

Weak Strong Strong

Encapsulation Encapsulated Not encapsulated Encapsulated

Extents forclasses

Maintain single extentfor each class

No notion of extents Same as the left

Mutability ofobjects

Mutable Mutable Mutable

Objectidentity

Cannot stored ormanipulated by user

Can stored ormanipulated by user

(REF type)

Cannot stored ormanipulated by user