class Artiste private type tuple ( nom : string, prenom : string, style: string, oeuvres: list(OEuvre)) method public ajoeuvre(o:OEuvre) end; class Musee type tuple( read nom: string, read adresse: tuple(rue:string,ville:string)) end; class OEuvre private type tuple( read titre: string, read annee: Date, read auteur:Artiste, read cote: integer) end; class Exposition public type tuple( oeuvres: unique set(OEuvre), musee: Musee, datedeb: Date, duree:integer) method public tarif:integer end; name LesArtistes : unique set(Artiste); name LesOEuvres : unique set(OEuvre); name LesMusees : unique set(Musee); name LesExpositions : list(Exposition); /* petits ajouts pour que ça marche*/ method body ajoeuvre(o:OEuvre) in class Artiste {self->oeuvres+=list(o);}; method init(n:string,p:string,s:string) in class Artiste; method body init(n:string,p:string,s:string) in class Artiste {self->nom=n;self->prenom=p;self->style=s;}; /* vidange de la base*/ run body{LesArtistes=unique set(); LesOEuvres=unique set();LesMusees=unique set();LesExpositions=list();} /*insertion de l artiste Estudianti*/ run body{o2 Artiste a=new Artiste("Estudianti","bidule","burlesque"); LesArtistes += unique set(a); }; /*langage o2C*/ /*Implementez la methode tarif de la classe Exposition (le tarif de l exposition est egal a la somme des cotes de oeuvres exposees, il est double si l exposition a lieu a Paris).*/ method body tarif:integer in class Exposition {o2 OEuvre o; o2 integer tar=0; for (o in self->oeuvres){tar +=o->cote;} if (((self->musee)->adresse).ville=="Paris") tar=tar*2; return(tar); }; /*Proposez une implementation de la methode d'initialisation de la classe OEuvre.*/ method init(t:string,a:Date,au:Artiste,c:integer) in class OEuvre; method body init(t:string,a:Date,au:Artiste,c:integer) in class OEuvre {self->titre=t; self->annee=a; self->auteur=au; self->cote=c; au->ajoeuvre(self); }; /*Ajoutez a la liste des oeuvres l oeuvre de titre ExamBD de cote 3, creee le 21 Fevrier 2000 par l artiste Estudianti (cet artiste est deja present dans la base de donnees)*/ run body{o2 OEuvre o;o2 Artiste a; o2query(a,"element(select x from x in LesArtistes where x.nom=$1)","Estudianti"); o=new OEuvre("ExamBD",new Date(21,2,2000),a,3); LesOEuvres +=unique set(o); }; /* ajouts pour les tests*/ method init(n:string,r:string,v:string) in class Musee; method body init(n:string,r:string,v:string) in class Musee {self->nom=n;self->adresse.rue=r;self->adresse.ville=v;}; /* insertions dans la base */ run body{o2 Artiste b=new Artiste("Lucie","x","mamour"); o2 Artiste c=new Artiste("Camille","x","mamouritou"); o2 OEuvre d= new OEuvre("oeuvre1",new Date(20,1,1998),b,2); o2 OEuvre e= new OEuvre("oeuvre2",new Date(23,7,1999),c,3); o2 OEuvre o=new OEuvre("oeuvre3",new Date(12,12,2000),c,1); o2 Musee m=new Musee("lespontsdece","Gallieni","Angers"); o2 Musee m1=new Musee("maison","Foch","Angers"); o2 Musee m2=new Musee("chezmia","Princes","Toulouse"); o2 Musee m3=new Musee("chezpapi","presdubiel","Faverges"); o2 Exposition e1=new Exposition; o2 Exposition e2=new Exposition; e1->oeuvres=unique set(d,e); e1->musee=m; e1->datedeb=new Date(18,2,2000); e1->duree=5; e2->oeuvres=unique set(e,o); e2->musee=m1; e2->datedeb=new Date(18,12,2000); e2->duree=15; LesMusees=unique set(m,m1,m2,m3); LesArtistes +=unique set(b,c); LesOEuvres += unique set(d,e,o); LesExpositions +=list(e1,e2); }; select struct(auteur:a.auteur.nom, musee:e.musee.nom) from e in LesExpositions, a in e.oeuvres; /*\Requetes en OQL*/ /*Combien y a-t-il d'oeuvre de cote superieure \`a 3?*/ count(select o from o in LesOEuvres where o.cote>=3); /*Noms des oeuvres et de leurs auteurs.*/ select struct(oeuvre:o.titre, auteur:o.auteur.nom) from o in LesOEuvres; /*Quel(s) artiste(s) a(ont) compose le plus d'oeuvres? (nom de l'(ou des) artiste(s)*/ select a.nom from a in LesArtistes where count(a.oeuvres)=max(select count(b.oeuvres) from b in LesArtistes); /*Expositions ne concernant qu'un seul artiste (nom du musee et date de debut)*/ select e.musee.nom, e.datedeb from e in LesExpositions where count(select distinct o.auteur from o in e.oeuvres)=1; /*Regrouper les musees selon leur ville (resultat sous forme d'un ensemble de couples (nom de ville, ensemble de noms de musees))*/ select struct(ville:m.adresse.ville, musees:(select x.m.nom from x in partition)) from m in LesMusees group by m.adresse.ville