Institut Supérieur d’Informatique - Université Tunis El Manar
Module 4 : Standards
et langages des bases
de données à objets
(Section 2)
Riadh ZAAFRANI
Novembre 2020
1ère année MP2L
1
1
Objets Database
◼ Voyons enfin le concept de base de données.
◼ Puisqu'un SGBDO peut créer de nombreuses bases de
données différentes, chacune ayant son propre schéma, le
modèle objet de l'ODMG possède des interfaces pour les
objets DatabaseFactory et Database.
◼ Chaque base possède son propre nom de base de données.
L'opération bind permet d'affecter des noms individuels
uniques
aux objets persistants. L'opération lookup
retourne l'objet portant l'object_name spécifié. L'opération
unbind supprime le nom d'un objet persistant nommé de
la base de données.
2
2
1
Objets Database
◼ interface DatabaseFactory {
Database new();
} ;
◼ interface Database {
void
void
void
object
object
open (in string database_name);
close () ;
bind(in any some_object, in string object_name);
unbind
lookup
(in string name);
(in string object_name)
raises(ElementNotFound);…
}
3
Plan
◼Préambule
◼Le modèle objet de l'ODMG
◼Objets et littéraux
◼Interfaces du modèle objet de l'ODMG
◼Interfaces, classes et héritage
◼Le langage de définition d'objets ODL
◼Le langage de requête objet: OQL
4
4
3
2
Exemple : Mini-Monde de la base de
données UNIVERSITE
◼ Une
de
base
données
nommée
UNIVERSITE mémorise les étudiants,
leur département, leur dossier et leurs
inscriptions, ainsi que les cours offerts
par l'université.
◼ Elle mémorise également
les projets
subventionnés des enseignants et des
étudiants diplômés.
5
Analyse des besoins de la base de
données UNIVERSITE
◼ Pour chaque personne,
la base de données
le nom de la
contient des informations sur
personne [Nom], son numéro de sécurité sociale
[NoSS], son adresse [Adresse], son sexe [Sexe] et
sa date de naissance [NDate].
◼ Deux sous-classes du type d'entité PERSONNE
ont été identifiées: PROFESSEUR et ETUDIANT.
◼ Les attributs spécifiques de PROFESSEUR sont le
de
rang
conférences, assistant, etc.), le bureau [PBureau],
le numéro de téléphone [PPhone] et
le salaire
[Salaire].
cours, maître
(chargé
[Rang]
de
5
6
6
3
Analyse des besoins de la base de
données UNIVERSITE
◼ Tous les membres du corps enseignant sont associés à
un ou plusieurs départements par la relation [appartient]
(un enseignant pouvant être associé à plusieurs
départements, la relation est M: N).
◼ Un attribut spécifique de ETUDIANT est
[Niveau]
(première année =: 1, deuxième année =: 2, ..., étudiant
diplômé =: 5).
◼ Chaque étudiant est également lié à des départements
([DOMINANTE] et [SOUSDOMINANTE]), à la session
de cours auxquels il assiste actuellement [INSCRIT] et
aux cours qu'il a suivis [DOSSIER]. Chaque instance du
dossier contient la note obtenue [Note].
7
7
Analyse des besoins de la base de
données UNIVERSITE
◼ ETUD_DIP est une sous-classe de ETUDIANT, avec le
prédicat Annee = 5.
◼ Pour chaque étudiant diplômé, on mémorise la liste de
ses précédents diplômes dans un attribut composite
multivalué [Diplomes]. Nous associons également
l'étudiant diplômé à un responsable de recherches
[RESP _RECH] et à un comité de thèse [COMITE] s'il
en existe un.
◼ Un département possède les attributs nom [DNom],
téléphone [DPhone] et numéro de bureau [DBureau]. Il
est lié au professeur qui est son président [PDT] et à la
faculté à laquelle il appartient [FAC].
8
8
4
Analyse des besoins de la base de
données UNIVERSITE
◼ Chaque faculté a pour attributs un nom [FNom], un
numéro de bureau [FBureau] et le nom de son doyen
[Doyen].
◼ Un cours a pour attributs un numéro de cours [NoC], un
[CDesc]. Pour chaque
nom [CNom] et un descriptif
cours, plusieurs sessions sont proposées. Chaque
session a pour attribut un numéro de session [NoS] et
l'année et
le trimestre au cours desquels elle a été
proposée ([Annee] et [Trim]).
◼ Les numéros de session sont des identifiants uniques.
Les sessions offertes pendant le trimestre en cours se
trouvent dans une sous-classe SESSION_COURANTE
de SESSION, avec les prédicats Trim == TrimCour et
Annee == AnCour.
9
9
Analyse des besoins de la base de
données UNIVERSITE
◼ Chaque session est liée à l'enseignant qui l'a
l'enseigne ([enseigne]), si
enseignée ou qui
celui-ci figure dans la base de données.
un
sous-ensemble
de
◼ La catégorie ENSEIGNANT_CHERCHEUR
de
est
PROFESSEUR et
et
comprend tous les professeurs, ainsi que
tous les étudiants diplômés, qui vivent de
l'enseignement ou de la recherche.
de
l'union
ETUD_DIP
10
10
5
Analyse des besoins de la base de
données UNIVERSITE
◼ Enfin, le type d'entité SUBVENTION mémorise toutes
les allocations et les contrats de recherche attribués à
l'université.
◼ Chaque subvention a pour attributs un titre [Titre], un
l'a attribuée
numéro [NoSub],
[Admin] et une date de début [DateD]. Une subvention
est liée à un directeur de recherche [DR] et à tous les
chercheurs qui en bénéficient [BENEF].
l'administration qui
◼ Chaque instance de BENEF a pour attribut une date de
début [Debut], une date de fin (si elle est connue) [Fin]
et le pourcentage de temps consacré au projet [Temps]
par le chercheur bénéficiaire de la subvention.
11
11
Schéma conceptuel EER de la BD UNIVERSITE
NoSS
DateNaiss
Sexe
NoRue
Rue
NoApt
Ville
Departement
Prenom
2e
Prenom
Nom
Famille
Nom
PBureau
Rang
Salaire
PPhone
PROFESSEUR
PERSONNE
d
Adresse
Code Post
Niveau
ETUDIANT
Diplome
Annee
Diplomes
Niveau = 5
ETUD_DIP
M
INSCRIT
N
Note
M
DOSSIER
N
N
SOUS
DOMINANTE
1
SESSION_COURANTE
Trim = TrimCour
et
Annee = AnCour
N
DOMINANTE
1
1
Faculte
RESP_RECH
N
M
COMITE
N
N
BENEF
M
1
DR
N
NoSub
Titre
SUBVENTION
Admin
DateD
Publicité
Debut
Temps
Fin
1
PDT
M
1
APPARTIENT
N
ENSEIGNANT_CHERCHEUR
1
ENSEIGNE
N
FACULTE
FD
N
1
DEPARTEMENT
FNom
Doyen
FBureau
DNom
DPhone
Bureau
12
SESSION
N
1
CS
N
COURS
1
DC
NoS
Annee
Trim
NoC
CNom
CDesc
12
6
Le langage de définition d'objets: ODL
◼ Après cette vue d'ensemble du modèle objet de
l'ODMG, nous allons voir comment ces concepts
peuvent servir à créer un schéma de base de données
objets avec le langage de définition d'objets ODL
(Object Definition Language).
◼ La syntaxe et les types de données d'ODL sont prévus
pour être compatibles avec l'IDL (Interface Definition
Language) de CORBA (Common Object Request
Broker Architecture), avec des extensions pour les
relations et autres concepts des bases de données.
13
13
Le langage de définition d'objets: ODL
◼ ODL est conçu pour prendre en charge les constructions
sémantiques du modèle objet de l'ODMG.
◼ Il est indépendant de tout langage de programmation.
Il sert principalement à créer des spécifications d'objets
- autrement dit des classes et des interfaces.
◼ En conséquence, ODL n'est pas un langage de
programmation à part entière. Un utilisateur peut définir
un schéma de base de données en ODL indépendamment
langage de programmation, puis utiliser une
de tout
liaison de langage (language binding) pour spécifier
comment
les constructions ODL correspondront aux
constructions d'un langage spécifique comme C++,
Smalltalk ou Java.
14
14
7
Le langage de définition d'objets: ODL
◼ On peut considérer la notation graphique d’ODL, comme
une variante des diagrammes EER, avec la notion
supplémentaire d'héritage d'interface mais à laquelle
manquent plusieurs concepts EER,
tels les catégories
(types union) et les attributs de relations.
Interface
Personne_IF
Classe
PERSONNE
Relations
1 :1
1 :N
M :N
15
Héritage
Héritage d’interface
(est-un) utilisant « : »
Héritage de classe
utilisant extends
15
Le langage de définition d'objets: ODL
◼ La figure ci-dessous montre un schéma objet possible
pour une partie de la base de données UNIVERSITE.
PERSONNE
a_etudiants_dominante
DEPARTEMENT
Propose
a_professeurs
Propose_par
COURS
a-sessions
etudiants
SESSION
de_cours
Travaille_dans
PROFESSEUR
ETUDIANT
a_en_dominante
sessions_terminees
inscrit_a
conseiller
comite
EtudDip
conseille
dans_comite_de
16
Etudiants_inscrits
SESSION_COURANTE
16
8
Le langage de définition d'objets: ODL
◼ Le listing suivant présente l’ensemble de définitions de
la base de données
classes possibles en ODL pour
UNIVERSITE.
◼ Il existe généralement plusieurs façons de traduire un
diagramme de schéma objet (ou un diagramme de schéma
EER)
la
représentation la plus simple.
classes ODL. Nous
choisi
avons
en
◼ Les types d'entité sont
traduits en classes ODL et
l'héritage est obtenu au moyen d'extensions.
◼ Mais il n'y a aucun moyen direct de traduire les catégories
(types union) ou de réaliser l'héritage multiple.
17
17
Le langage de définition d'objets: ODL
◼ Les classes Personne, Professeur, Etudiant, et EtudDip ont
professeurs,
extensions
personnes,
respectivement
etudiants et etudiants_dip.
les
◼ Professeur et Etudiant dérivent toutes deux de Personne, et
EtudDip étend Etudiant. De ce fait, on peut forcer la collection
etudiants (et la collection professeurs) à être à tout moment un
sous-ensemble de la collection personnes. De même,
la
collection etudiants_dip sera un sous-ensemble de etudiants.
◼ En même temps, les objets individuels de type Etudiant et
Professeur hériteront des propriétés (attributs et relations) et
des opérations de Personne, et les objets de type EtudDip
hériteront de celles de Etudiant.
18
18
9
Le langage de définition d'objets: ODL
◼ class Personne
(
extent personnes
key
noss )
PNom {string prenom, string
{ attribute struct
deuxiemeprenom, string nomFamille}
attribute string
attribute date
attribute enum Genre {M,F}
attribute struct Adresse {short no, string rue, short noappt,
nom;
noss;
datenaissance;
sexe ;
string ville, string dep, short codepost} adresse;
short
} ;
age() ;
19
19
Le langage de définition d'objets: ODL
◼ class Professeur extends Personne (extent professeurs)
{ attribute string
attribute float
attribute string
attribute string
relationship
relationship
relationship
inverse
inverse
inverse
rang ;
salaire;
bureau;
tel;
Departement travaille_dans
Departement :: a_professeurs;
set<EtudDip>
conseille
EtudDip :: conseiller;
set<EtudDip>
EtudDip :: comite;
augmenter(in float augmentation);
promouvoir(in string nouveau_rang) ;
dans_comite_de
void
void
} ;
20
20
10
Le langage de définition d'objets: ODL
◼ class Etudiant extends Personne (extent etudiants);
{ attribute
attribute
relationship
inverse
relationship
inverse
relationship
inverse
annee;
string
Departement en_sous_dominante;
Departement a_en_dominante
Departement :: a_etudiants_dominante;
set<Note>
Note :: etudiants;
set<Session_Courante> inscrits_a
SessionCourante :: etudiants_inscrits;
sessions_terminees
void changer_dominante(in string dnom) raises (dnom_not_valid);
MP() ;
float
sinscrire(in short nosession) raises (session_not_valid);
void
void note_attribuee(in short nosession ; in ValeursNotes note)
raises (Session_not_valid, note_not_valid); } ;
21
21
Le langage de définition d'objets: ODL
◼ class EtudiantDip extends Etudiant
etudiants_dip)
( extent
{ attribute
relationship
inverse
relationship
set<Diplome> diplomes;
conseiller
Professeur
Professeur:: conseille;
Publicité
comite
set<Professeur>
void
void
} ;
22
Professeur :: dans_comite_de;
inverse
attribuer_conseiller(in string nom; in string prenom)
raises (professeur_not_valid);
attribuer_comite(in string nom; in string prenom)
raises (professeur_not_valid);
22
11
Le langage de définition d'objets: ODL
◼ Les
classes
et
SessionCourante sont de simples transpositions des types
d'entités correspondants.
Departement,
Session
Cours,
◼ class Cours
( extent cours key nocours )
{ attribute
attribute
attribute
relationship
string
string
string
set<Session> a_sessions
Cnom;
nocours;
description;
relationship
inverse
Session :: de_cours;
Departement propose_par
inverse
Departement:: propose;
23
} ;
23
Le langage de définition d'objets: ODL
◼ class Departement (extent departements key dnom)
dnom;
dtel;
dbureau;
fac;
pdt;
string
string
string
string
Professeur
set<Professeur>
Professeur :: travaille_dans;
set<Etudiant>
Etudiant :: a_en_dominante;
set<Cours> propose
Cours :: propose_par;
a_professeurs
a_etudiants_dominante
{ attribute
attribute
attribute
attribute
attribute
relationship
inverse
relationship
inverse
relationship
inverse
} ;
24
24
12
Le langage de définition d'objets: ODL
◼ class Session (
extent
sessions)
{ attribute
attribute
attribute enum trimestre {printemps, ete, automne, hiver} trim;
relationship
short nosession;
string an;
set<Note>
etudiants
inverse
Note:: session;
relationship Cours
de_cours
inverse
Cours:: a_sessions;
} ;
◼ class SessionCourante extends Session (extent sessions_courantes )
{ relationship
inverse
void
set<Etudiant>
Etudiant:: inscrit_a;
inscrire_etudiant (in string noss)
etudiants_inscrits
raises (etudiant_not-valid, session_pleine);
} ;
25
25
Le langage de définition d'objets: ODL
◼ La
classe Note nécessite quelques
explications. Elle
correspond en effet à la relation M:N qui existe entre les
classes Etudiant et Session.
◼ La raison pour laquelle on a créé une classe séparée (au lieu
d'une paire de relations inverses) est qu'elle comprend un
attribut de relation.
◼ En conséquence, la relation M:N est associée à la classe Note,
et il existe une paire de relations 1:N, l'une entre Etudiant et
Note et l'autre entre Session et Note. Ces deux relations sont
représentées par les propriétés suivantes: sessions_terminees
de Etudiant, session et etudiant de Note, et etudiants de
Session.
26
26
13
Le langage de définition d'objets: ODL
◼ class Note
(extent Notes)
{ attribute
enum ValeursNotes
{A, B, C, D, F, I, P} note;
relationship Session
inverse
relationship Etudiant
session
Session :: etudiants;
etudiant
inverse Etudiant :: sessions_terminees;
} ;
27
27
Le langage de définition d'objets: ODL
◼ Enfin,
la classe Diplome sert à représenter
l'attribut
composite multivalué diplomes de EtudDip.
◼ class Diplome
{ attribute
attribute
attribute
} ;
string
string
string
fac;
diplome;
an;
28
28
14
Héritage d'interface
◼ L'exemple précédent ne contenait aucune interface mais
seulement des classes.
◼ Prenons l’exemple du schéma d'une base de données qui
stocke des objets géométriques pour illustrer les interfaces
et l'héritage d'interface (ou de comportement).
ObjectGeometrique
Rectangle
Triangle
Cercle
29
29
Héritage d'interface
◼ On spécifie une
interface ObjetGeometrique,
avec des
opérations pour calculer le périmètre et la surface d'un objet, ainsi
que des opérations pour translater (déplacer) et faireTourner un
objet.
◼ interface ObjetGeometrique
{ attribute enum Forme {Rectangle,Triangle,Cercle,...} forme;
attribute struct Point {short x, short y} point_de_reference;
float
float
void
perimetre();
aire();
translater(in short x_translation,
in short y_translation);
faire_tourner(in float angle_de_rotation);
30
void
} ;
30
15
Héritage d'interface
◼ Plusieurs classes (Rectangle, Triangle, Cercle,
etc.) héritent de l'interface ObjetGeometrique.
◼ Comme ObjetGeometrique est une interface, elle
n'est pas instanciable - autrement dit, elle ne permet
pas de créer directement des objets.
◼ Mais on peut créer des objets de type Rectangle,
Triangle, Cercle...
◼ Ces objets héritent de toutes les opérations de
l'interface ObjetGeometrique.
31
Héritage d'interface
◼ class Rectangle: ObjetGeometrique ( extent rectangles)
{ attribute struct Point {short x, short y} point_de_reference;
attribute short
attribute short hauteur;
attribute float
longueur;
angle_orientation; } ;
◼ class Triangle: ObjetGeometrique ( extent triangles)
{ attribute struct Point {short x, short y} point_de_reference;
attribute short cote_1 ;
attribute short cote_2 ;
attribute float
attribute float angle_orientation; } ;
cote1_cote2_angle;
◼ class Circle : ObjetGeometrique ( extent circles )
{ attribute struct Point {short x, short y} point_de_reference;
attribute short
rayon;
} ;
32
31
32
16
Héritage d'interface
◼ Notez que, dans l'héritage d'interface, les opérations sont
héritées, mais pas les propriétés (attributs, relations).
◼ En conséquence, si une propriété est nécessaire dans une
classe qui hérite, elle doit être répétée dans la définition
de
l'attribut
cette
point_de_reference.
comme
classe,
pour
◼ Remarquez que les opérations héritées peuvent avoir des
implémentations différentes dans chaque classe. Par
exemple, les implémentations des opérations surface et
perimetre seront différentes pour les objets Rectangle,
Triangle et Cercle.
33
33
Héritage d'interface
◼ Une classe peut hériter de plusieurs interfaces, de
même qu'une interface peut hériter de plusieurs
interfaces.
◼ Mais
avec EXTENDS (héritage de
classe),
l'héritage multiple est interdit.
◼ Une classe ne peut donc hériter via EXTENDS que
d'une seule autre classe (et hériter en plus de zéro
Publicité
ou plusieurs interfaces).
34
34
17
Plan
◼Préambule
◼Le modèle objet de l'ODMG
◼Objets et littéraux
◼Interfaces du modèle objet de l'ODMG
◼Interfaces, classes et héritage
◼Le langage de définition d'objets ODL
◼Le langage de requête objet: OQL
35
35
Le langage de requête objet: OQL
◼ OQL (Object Query Language) est
le langage de
requête proposé pour le modèle objet de l'ODMG.
◼ Il est conçu pour collaborer étroitement avec les
langages de programmation pour lesquels une liaison
ODMG est définie, par exemple C++, Smalltalk et Java.
◼ Une requête OQL encapsulée dans un de ces langages
peut retourner des objets qui correspondent au langage
utilisé.
◼ En outre, il est possible d'écrire dans le langage en
question les implémentations des opérations des classes
d'un schéma ODMG.
36
36
18
Le langage de requête objet: OQL
◼ La syntaxe des requêtes OQL est semblable à celle
de SQL, le langage de requête standard des bases
de données relationnelles, avec des fonctionnalités
supplémentaires pour les concepts ODMG (identité
des objets, objets complexes, opérations, héritage,
polymorphisme et relations).
◼ Les exemples destinés à illustrer les requêtes OQL
tirés du schéma de la base de données
sont
UNIVERSITE.
37
37
Schéma conceptuel EER de la BD UNIVERSITE
NoSS
DateNaiss
Sexe
NoRue
Rue
NoApt
Ville
Departement
Prenom
2e
Prenom
Nom
Famille
Nom
PBureau
Rang
Salaire
PPhone
PROFESSEUR
PERSONNE
d
Adresse
Code Post
Niveau
ETUDIANT
Diplome
Annee
Diplomes
Niveau = 5
ETUD_DIP
M
INSCRIT
N
Note
M
DOSSIER
N
N
SOUS
DOMINANTE
1
SESSION_COURANTE
Trim = TrimCour
et
Annee = AnCour
N
DOMINANTE
1
1
Faculte
RESP_RECH
N
M
COMITE
N
N
BENEF
M
1
DR
N
NoSub
Titre
SUBVENTION
Admin
DateD
Debut
Temps
Fin
1
PDT
M
1
APPARTIENT
N
ENSEIGNANT_CHERCHEUR
1
ENSEIGNE
N
FACULTE
FD
N
1
DEPARTEMENT
FNom
Doyen
FBureau
DNom
DPhone
Bureau
38
SESSION
N
1
CS
N
COURS
1
DC
NoS
Annee
Trim
NoC
CNom
CDesc
38
19
Requêtes OQL simples
◼ La syntaxe OQL de base est une structure select …
from … where … comme en SQL.
◼ Par exemple, écrire la requête qui extrait les noms
les départements de la faculté «
de tous
Ingénierie » ?
◼ Q0:
SELECT d.dnom
FROM d in departements
WHERE d.fac = 'Ingénierie';
39
39
Points d'entrées dans une base de données
◼ En général, chaque requête nécessite un point d'entrée
dans la base de données, qui peut être un objet persistant
nommé quelconque.
◼ Pour de nombreuses requêtes, ce point d'entrée est le nom
de l'extension d'une classe. Le nom de l'extension est le
nom d'un objet persistant dont le type est une collection
(dans la plupart des cas un set) des objets de la classe.
◼ Si l'on regarde les noms des extensions pour la base de
nommé
données UNIVERSITE en ODL,
départements est de type set<Departement> ; personnes
est de type set<Personne> ; professeurs est de type
set<Professeur> et ainsi de suite.
l'objet
40
40
20
Variable itérateur
◼ L'emploi d'un nom d'extension - departements dans la
requête Q0 - comme point d'entrée référence une
collection persistante d'objets.
◼ Chaque fois qu'une collection est référencée dans une
requête OQL, nous devons définir une variable itérateur
- d dans la requête Q0 - qui parcourt chaque objet de la
collection.
◼ Dans de nombreux cas, comme dans cet exemple,
la
requête sélectionnera dans la collection, en fonction des
conditions spécifiées dans la clause where.
41
41
Requêtes OQL simples
◼ Dans la requête Q0, seuls les objets persistants d de la
collection de departements qui satisfont à la condition d.fac
= 'Ingénierie' sont récupérés dans le résultat de la requête.
◼ Pour chaque objet d sélectionné, la valeur de d.dnom est
retournée. En conséquence, le type du résultat de Q0 est
bag<string>, parce que le type de chaque valeur de dnom
est string (même si le résultat réel de la requête est un set
parce que dnom est un attribut de clé). En général, le résultat
d'une requête est du type bag pour select … from … et de
type set pour select … distinct … from …, comme en SQL
(l'ajout du mot clé distinct élimine les doublons) .
42
42
21
Requêtes OQL simples
◼ Pour
reprendre l'exemple Q0,
il existe trois
syntaxes possibles pour spécifier un itérateur :
◼ d in departments
◼ departements d
◼ departements as d
◼ Nous utiliserons la première syntaxe dans nos
exemples.
◼ Notez que
les deux dernières options
sont
comparables à la spécification de variables de
tuples dans une requête SQL.
43
43
Résultats des requêtes et expressions de chemin
◼ Les objets nommés qui servent de point d'entrée dans les
requêtes OQL ne sont pas limités aux noms d'extensions.
Tout objet persistant nommé, qu'il référence un objet
atomique (isolé) ou un objet collection, peut servir de
point d'entrée.
◼ Le résultat d'une requête peut généralement être de tout
type susceptible d'être exprimé dans le modèle objet de
l'ODMG.
◼ Une requête n'applique pas obligatoirement la structure
select … from … where. Dans le cas le plus simple, tout
nom persistant peut constituer une requête.
44
44
22
Résultats des requêtes et expressions de chemin
◼ Le résultat de cette requête est une référence à cet objet
persistant. Par exemple, la requête:
departments;
◼ Q1:
◼ retourne une référence à la collection de tous les objets
le type est
persistants departements, collection dont
set<Departement>.
◼ De même, si nous avons attribué (via l'opération bind) le
nom persistant csdepartement à un seul objet departement
(le département informatique), la requête:
◼ Q1a:
◼ retourne une référence à cet unique objet de type
csdepartment;
Departement.
45
45
Résultats des requêtes et expressions de chemin
Publicité
◼ Une fois un point d'entrée spécifié, l'expression de
chemin permet de spécifier un chemin vers les
attributs et les objets associés.
◼ Une
de
expression
commence
habituellement par un nom d'objet persistant, ou
par la variable itérateur qui parcourt
les objets
d'une collection.
chemin
◼ Ce nom est suivi de zéro ou de plusieurs noms de
relations ou de noms d'attributs connectés par des
points.
46
46
23
Résultats des requêtes et expressions de chemin
◼ Par exemple,
les lignes suivantes sont des exemples
d'expressions de chemin, qui sont également des requêtes
valides en OQL :
csdepartment.pdt;
◼ Q2:
◼ L’expression, Q2, retourne un objet de type Professeur,
le type de l'attribut pdt de la classe
parce que c'est
Departement.
◼ C'est une référence à l'objet Professeur qui est lié à l'objet
Departement dont le nom persistant est csdepartment via
l'attribut pdt, autrement dit une référence à l'objet
Professeur
département
informatique.
président
qui
est
du
le
47
47
Résultats des requêtes et expressions de chemin
csdepartment.pdt.rang;
◼ Q2a:
◼ La seconde expression, Q2a, est similaire, excepté
qu'elle retourne le rang de cet objet Professeur
(président du département
informatique) et non la
référence à l'objet.
◼ Le type retourné par Q2a est donc string, c'est-à-dire le
type de données de l'attribut rang de la classe Professeur.
◼ Chaque expression Q2 et Q2a ne retourne qu'une seule
valeur, parce que les attributs pdt (de Department) et
rang (de Professeur) sont tous deux monovalués et sont
appliqués à un seul objet.
48
48
24
Résultats des requêtes et expressions de chemin
csdepartment.a_professeurs;
◼ Q2b:
◼ La troisième expression, Q2b, est différente: elle
retourne un objet de type set<Professeur>, même si
elle est appliquée à un unique objet, parce que c'est le
type de la relation a_professeurs de la classe
Departement.
les
objets Professeur
◼ La collection retournée contiendra des références à
tous
l'objet
departement dont le nom persistant est csdepartement
via la relation a_professeurs, autrement dit des
références à tous les objets Professeur qui travaillent
dans le département informatique.
associés
à
49
49
Résultats des requêtes et expressions de chemin
◼ Mais pour obtenir les rangs des enseignants du
département informatique, nous ne pouvons pas
écrire:
◼ Q3’: csdepartment.a_professeurs.rang;
◼ La raison en est que nous ne savons pas si l'objet
retourné serait de type set<string> ou bag<string>
(le dernier étant le plus probable, puisque plusieurs
enseignants peuvent partager le même rang). Pour
éliminer ce genre d'ambiguïté, OQL n'autorise pas
d'expressions comme Q3'.
50
50
25
Résultats des requêtes et expressions de chemin
◼ Q3a:
◼ En revanche, on doit utiliser un itérateur pour
parcourir ces collections, comme dans les requêtes
Q3a ou Q3b ci-après:
select
from f in csdepartment.a_professeurs;
select
distinct f.rang
from f in csdepartment.a_professeurs;
◼ Q3b:
f.rang
◼ Ici, Q3a retourne bag<string> (des doublons
apparaissent dans le résultat), alors que Q3b
retourne set<string> (les doublons sont éliminés
par le mot clé distinct).
51
51
Résultats des requêtes et expressions de chemin
◼ Les requêtes Q3a et Q3b illustrent toutes deux
la façon dont on peut définir dans la clause
from une variable qui opérera une itération sur
une collection restreinte spécifiée dans
la
requête.
◼ La variable f de Q3a et Q3b parcourt
les
collection
éléments
csdepartement.a_professeurs, qui est de type set
<Professeur>, et n'en extrait que les enseignants
qui sont membres du département informatique.
de
la
52
52
26
Résultats des requêtes et expressions de chemin
◼ En général, une requête OQL peut retourner un résultat
doté d'une structure complexe spécifiée dans la requête
elle-même au moyen du mot clé struct. Par exemple :
csdepartement.pdt.conseille;
◼ Q4:
◼ Ici, Q4 est une requête simple qui retourne un objet de
type set<EtudDip> (la collection d'étudiants diplômés
le président du
dont
département informatique).
le directeur de recherches est
◼ Supposons maintenant que l'on ait besoin d'une requête qui
extraie le nom et le prénom de ces étudiants, ainsi que la
liste de leurs diplômes.
53
53
Résultats des requêtes et expressions de chemin
◼ Nous pouvons écrire la requête Q4a, dans laquelle la
variable s parcourt
la collection d'étudiants diplômés
supervisés par le président, et la variable d parcourt les
diplômes de chaque étudiant s.
◼ Q4a: select struct (
nom:struct(nom_personne: s.nom.nomfamille,
prenom_personne: s.nom.prenom),
diplomes:(select struct( dip: d.diplome,
an: d.an,
fac: d.fac)
from s in csdepartement.pdt.conseille;
from d in s.diplomes)
54
54
27
Résultats des requêtes et expressions de chemin
◼ Le type du résultat de Q4a est une collection de
structs (premier niveau), dans laquelle chaque
structure a deux composants: nom et diplomes.
◼ Le composant nom est une structure de deuxième
niveau, constituée de nomfamille et prenom,
chacun étant formé d'une seule chaîne.
◼ Le composant diplomes est défini par une requête
imbriquée. C'est une collection de structures de
deuxième niveau dont les composants sont trois
chaînes: dip, an et fac.
55
55
Résultats des requêtes et expressions de chemin
◼ Notez que OQL est orthogonal en ce qui concerne la
spécification des expressions de chemin. Autrement dit,
les noms d'attributs, de relations
et d'opérations
(méthodes) sont interchangeables dans les expressions,
tant que le système de types d'OQL n'est pas compromis.
◼ Nous pouvons par exemple écrire les requêtes suivantes
pour extraire la moyenne des points de tous les étudiants
seniors se spécialisant en informatique.
est
◼ Le résultat
l'ordre décroissant des
moyennes, puis dans l'ordre croissant des noms et des
prénoms :
trié dans
56
56
28
Résultats des requêtes et expressions de chemin
◼ Q5a:
select struct(nom_personne : s.nom.nomfamille,
prenom_personne :s.nom.prenom,
mp
: s.mp)
from s in csdepartement.a_etudiants_dominante
where s.annee = 'senior'
order by mp desc, nom_personne asc, prenom_personne asc;
◼ Q5b:
select struct(nom_personne : s.nom.nomfamille,
prenom_personne : s.nom.prenom,
mp
: s.mp)
from s in etudiants
where s.en_dominante.dnom = 'Informatique'
and s.annee = 'senior'
order by mp desc, nom_personne asc, prenom_personne asc;
57
57
Résultats des requêtes et expressions de chemin
◼ Q5a utilise directement
le point d'entrée nommé
csdepartement pour localiser directement la référence au
département informatique, puis localise les étudiants via la
relation a_etudiants_dominante.
◼ Alors que Q5b recherche dans l'extension etudiants pour
le
en_dominante dans
étudiants
les
tous
localiser
département informatique.
les noms d'opérations
◼ Remarquez la façon dont les noms d'attributs, les noms de
sont
relations et
interchangeables (de manière orthogonale) dans les
expressions de
chemin : mp est une opération,
en_dominante et a_étudiants_dominante sont des relations
et annee, nom, dnom, nom et prenom sont des attributs.
(méthodes)
58
58
29
Résultats des requêtes et expressions de chemin
◼ L'implémentation de l'opération mp calcule la
moyenne des points et retourne une valeur de type
float pour chaque étudiant.
◼ La clause order by est similaire à la construction
SQL correspondante, et spécifie dans quel ordre le
résultat de la requête doit être affiché.
◼ C'est pourquoi
la collection retournée par une
requête contenant une clause order by est de type
list.
59
59
Spécification de vues avec des requêtes nommées
◼ Le mécanisme des vues en OQL s'appuie sur le
concept de requête nommée.
◼ Le mot clé define permet de spécifier l'identificateur
de la requête, qui doit être un nom unique parmi tous
les objets nommés, noms de classes, noms de
Publicité
méthodes ou noms de fonctions du schéma.