Author: bpoussin Date: 2012-09-10 08:41:03 +0200 (Mon, 10 Sep 2012) New Revision: 1512 Url: http://nuiton.org/repositories/revision/wikitty/1512 Log: Mise a jour de la documentation - suppression des In - ajout de #offset, #limit, #depth Modified: trunk/src/site/rst/user/query.rst trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java Modified: trunk/src/site/rst/user/query.rst =================================================================== --- trunk/src/site/rst/user/query.rst 2012-09-10 06:40:20 UTC (rev 1511) +++ trunk/src/site/rst/user/query.rst 2012-09-10 06:41:03 UTC (rev 1512) @@ -543,59 +543,111 @@ Quelques exemples +++++++++++++++++ -.. FIXME wrong doc, in doesn't exists anymore - Pour avoir tous les attachments de tous les noeuds de tous les arbres:: WikittyQuery q = new WikittyQueryMaker() - .in(Element.ID) + .containsOne(Element.ID) .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT).end(); WikittyQuery q = WikittyQueryParser.parse( - "id IN (SELECT WikittyTreeNode.attachment)"); + "id={SELECT WikittyTreeNode.attachment}"); Pour avoir tous les attachments de tous les noeuds d'un arbre ayant le nom 'MyTree':: WikittyQuery q = new WikittyQueryMaker() - .in(Element.ID) + .containsOne(Element.ID) .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) - .in(Element.ROOT_NODE) - .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree").end(); + .containsOne(Element.ROOT_NODE) + .select(Element.ID) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree").end(); WikittyQuery q = WikittyQueryParser.parse( - "id IN (SELECT WikittyTreeNode.attachment WHERE rootNode IN (WikittyTreeNode.name=MyTree))"); + "id={SELECT WikittyTreeNode.attachment WHERE rootNode={SELECT id WHERE (WikittyTreeNode.name=MyTree)}"); Pour avoir tous les attachments d'un sous arbre commencant à un noeud ayant le nom "MyBranch" d'un arbre ayant le nom 'MyTree':: WikittyQuery q = new WikittyQueryMaker() - .in(Element.ID) + .containsOne(Element.ID) .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) .and() - .in(Element.ROOT_NODE) - .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree") + .containsOne(Element.ROOT_NODE) + .select(Element.ID) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree") .close(); - .in(Element.PATH_NODE) - .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyBranch").end(); + .containsOne(Element.PATH_NODE) + .select(Element.ID) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyBranch").end(); - WikittyQuery q = WikittyQueryParser.parse("id IN (SELECT WikittyTreeNode.attachment WHERE - + " rootNode IN (WikittyTreeNode.name=MyTree) AND pathNode IN (WikittyTreeNode.name=MyBranch))"); + WikittyQuery q = WikittyQueryParser.parse("id={SELECT WikittyTreeNode.attachment WHERE + + " (rootNode={SELECT id WHERE (WikittyTreeNode.name=MyTree)} AND" + + " pathNode={SELECT id WHERE (WikittyTreeNode.name=MyBranch)})}"); Pour avoir tous les attachments d'un arbre ayant le nom 'MyTree' jusqu'à une profondeur de 3 (root, fils, sous fils):: WikittyQuery q = new WikittyQueryMaker() - .in(Element.ID) + .containsOne(Element.ID) .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) .and() - .in(Element.ROOT_NODE) + .containsOne(Element.ROOT_NODE) .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree") .close(); .le(Element.PATH_NODE, 3).end(); - WikittyQuery q = WikittyQueryParser.parse("id IN (SELECT WikittyTreeNode.attachment WHERE - + " rootNode IN (WikittyTreeNode.name=MyTree) AND pathNode<=3)"); + WikittyQuery q = WikittyQueryParser.parse("id={(SELECT WikittyTreeNode.attachment WHERE + + " rootNode={SELECT Element.ID WHERE (WikittyTreeNode.name=MyTree)} AND pathNode<=3)}"); +Limiter et étendre les recherches +--------------------------------- + +Il est possible de restraindre la plage de résultats retournés. Mais aussi +de demander à ce que les recherches se fasse aussi sur les relations entres +objet pour une profondeur donnée. + +offset +++++++ + +Indique le premier résultat qui doit être retourné. + +Si on souhaite seulement les résultats à partir du 10ème:: + + WikittyQuery q = new WikittyQueryMaker().rTrue().end(); + q.setOffset(10); + + WikittyQuery q = WikittyQueryParser.parse("TRUE #offset 10"); + +limit ++++++ + +Indique le nombre de résultats qui doit être retournés. + +Si on souhaite seulement avoir 20 résultats:: + + WikittyQuery q = new WikittyQueryMaker().rTrue().end(); + q.setLimit(20); + + WikittyQuery q = WikittyQueryParser.parse("TRUE #limit 20"); + +depth ++++++ + +Indique la profondeur de recherche, c'est à dire le nombre de fois que l'on suite +les relations. + +Par exemple si on a des 'Person' qui appartiennent à une 'Company'. 'Person' ne +contient que l'id d'une company. Il faut donc faire des containsOne avec un select +si on veut faire des contraintes sur les personnes appartenants à une company. + +Si on souhaite toutes les personnes s'appelant Jean de la Company 'Code Lutin':: + + WikittyQuery q = WikittyQueryParser.parse("Couteau 'Code lutin' #depth 1"); + +Il faut faire attention car on ne travail pas sur le nom des champs, les recherches +se font dans ce cas la toujours en fulltext. Donc vous pouvez avoir beaucoup +plus de résultat qu'attendu. Mettre une profondeur de plus de 1 peut avoir +des conséquences non négligeable sur les performances de recherche. + Spécificité de WikittyQueryMaker -------------------------------- @@ -736,7 +788,7 @@ * Nom : name - Nommage de la requête. -* Premier index : first - Permet de définir le premier index à retourner. +* Premier index : offset - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination. * Nombre : limit - Permet de définir le nombre de résultat à retourner. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-09-10 06:40:20 UTC (rev 1511) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-09-10 06:41:03 UTC (rev 1512) @@ -35,18 +35,17 @@ import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.BusinessEntityImpl; +import org.nuiton.wikitty.entities.Element; import org.nuiton.wikitty.entities.FieldType; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.query.conditions.Aggregate; import org.nuiton.wikitty.query.conditions.And; import org.nuiton.wikitty.query.conditions.Between; -import org.nuiton.wikitty.query.conditions.ConditionValue; import org.nuiton.wikitty.query.conditions.Condition; +import org.nuiton.wikitty.query.conditions.ConditionValue; import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; -import org.nuiton.wikitty.entities.Element; -import org.nuiton.wikitty.entities.ElementField; import org.nuiton.wikitty.query.conditions.Equals; import org.nuiton.wikitty.query.conditions.False; import org.nuiton.wikitty.query.conditions.Greater; @@ -223,7 +222,7 @@ /** * Ajoute une condition, cette condition est prise comme une condition terminal * Si l'on veut continuer a construire la requete, il faut avoir ajouter - * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #in()} + * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #containsOne()} * @param c la condition a ajouter * @return {@code this} with the {@code c} restriction added. */ @@ -236,7 +235,7 @@ * Parse et ajoute un bout de requete. Cette requete est prise comme une * condition terminal si l'on veut continuer a construire la requete, il * faut avoir ajouter avant une - * {@link #and()}, {@link #or()}, {@link #not()}, {@link #in()} + * {@link #and()}, {@link #or()}, {@link #not()}, {@link #containsOne()} * @param query la requete a ajouter (peut-etre vide ou nul, dans ce cas, la * condition utiliser est "true") * @return {@code this} with the {@code c} restriction added. @@ -391,7 +390,7 @@ * Ex : The field with value titi is in [titi,tutu] but not in * [tutu,tata] * - * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * Force l'ajout du containsOne en terminal (il n'y a pas besoin de faire * de {@link #close()} * * @param element the element on which the restriction is put @@ -404,7 +403,7 @@ } /** - * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * Force l'ajout du containsOne en terminal (il n'y a pas besoin de faire * de {@link #close()} * * @see {@link ContainsOne} @@ -1153,26 +1152,6 @@ return this; } -// /** -// * Add {@link In} to allow search on association (like sql join). -// * To close this sub query you must used {@link #close()} -// * @param foreignFieldName association fieldName -// * @return {@code this} -// * @see {@link In} -// */ -// public WikittyQueryMaker in(String foreignFieldName) { -// return in(Element.get(foreignFieldName)); -// } -// -// /* -// * @see {@link In} -// */ -// public WikittyQueryMaker in(Element element) { -// Condition child = new In(element); -// addCondition(child); -// return this; -// } -// /** * Close last non terminal condition (or, and, not, in). * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();