Index: topia/doc/PersistenceImplantationJDBCMultiTable.rst diff -u topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.2 topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.3 --- topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.2 Fri Aug 26 18:15:42 2005 +++ topia/doc/PersistenceImplantationJDBCMultiTable.rst Tue Aug 30 13:19:52 2005 @@ -3,8 +3,8 @@ ============================================== :Authors: Benjamin POUSSIN -:Version: $Revision: 1.2 $ -:Date: $Date: 2005/08/26 18:15:42 $ +:Version: $Revision: 1.3 $ +:Date: $Date: 2005/08/30 13:19:52 $ L'implantation avec une seul table pour toutes les entités a des limites du au base de données qui ne support pas completement le SQL standard. @@ -76,18 +76,21 @@ Si on a le model suivant:: + Person + ^ + | Company 1----* Employe | contrat -Pour faire les requetes, pour tous les elements simples (int, string, double, boolean, -...) une requete SQL simple suffit. Des que l'on arrive sur les classes -d'association, il faut traiter autre, car, l'information est dans une autre +Pour faire les requetes, pour tous les elements simples (int, string, double, +boolean, ...) une requete SQL simple suffit. Des que l'on arrive sur les classes +d'association, il faut traiter autrement, car, l'information est dans une autre table. Pour cela, il faut faire une analyse en Java de la requete:: - SELECT * FROM o.cl.entities.Employe as E + SELECT * FROM o.cl.entities.Employe as E WHERE E.name = 'poussin' AND E.company.name = 'truc'; Dans ce cas, il faut rechercher la classe de E, avec cette classe il faut @@ -97,7 +100,7 @@ company.name = 'truc' -et qui ont dans la classe d'association E comme element +et qui ont dans la classe d'association, E comme element Ce qui pourrait donner:: @@ -119,3 +122,39 @@ SELECT * FROM o.cl.entities.Employe as E WHERE E.contrat.fonction = 'commercial'; + +Héritage +-------- + +Lorsque l'on fait une demande sur Person, il faut aussi essayer de la faire +sur Employe, car on s'attend a avoir les classes les enfants dans les réponses + +Le mieux est de faire une jointure **FULL JOIN**, sur la table mere et les +table filles. Pour cela il faut récupérer la liste des champs de la classe +mère pour faire la bonne jointure. Ce qui donnerait:: + + select * from (person FULL JOIN employ USING + (topia_id, topia_longdate, topia_class, topia_isnew, topia_isdeleted, + field_name, field_..., ...)) AS t + WHERE t.field_name!='' order by field_name desc; + +Ensuite on pourrait utiliser une union ou faire deux requetes et les fusionner +dans la liste résultat. Le probleme sera peut-être au niveau des agregations +(count, avg, max, min, ...), et des conditions de tri + +Pour savoir dans qu'elle table faire les recherches il faut utiliser +la table topia_heritage_table au travers de la methode du storage:: + + public String [] getChidTableName(Class clazz) throws SQLException; + +Il etait prevu dans les requetes de pouvoir faire:: + + ... FROM ONLY person ... + +Le mot cle *only* indique de ne pas faire la recherche sur les +classes filles. Vérifier que le mot cle *only* est bien pris en +compte par le parser de requete. + +:rem: peut-etre que le mot cle utilisé est STRICT, mettre a la + place ONLY pour avoir la même syntaxe que PostgreSQL. + Index: topia/doc/Todo.rst diff -u topia/doc/Todo.rst:1.9 topia/doc/Todo.rst:1.10 --- topia/doc/Todo.rst:1.9 Fri Aug 26 17:53:35 2005 +++ topia/doc/Todo.rst Tue Aug 30 13:19:52 2005 @@ -18,6 +18,19 @@ Verfier que lors d'un delete d'un objet, on fait aussi un delete sur les classes d'association +Asso: + - (done) Faire heriter les classes d'association d'une interface qui aurait les + methode getAttributeA et getAttributeB + - (done) et qui aurait les memes metaInfo lors de la génération de l'interface + reelle d'association que les methodes d'acces au attribut reel de + l'association + - (done) De cette facon ont evite pas mal d'appels par introspection dans le proxy + (a faire, mais semble plus compliqué que prevu: methode impliquée: + setFieldAssociationCardinality1, addFieldAssociationCardinalityN). + +Verifier que le proxy gere bien toutes les methodes de l'interface +TopiaEntity (toXML, dependentEntities, remove, ...) + Appels distant --------------