Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- 1653 discussions
r1276 - in trunk: src/site/rst/user wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 19:45:36 +0100 (Mon, 02 Jan 2012)
New Revision: 1276
Url: http://nuiton.org/repositories/revision/wikitty/1276
Log:
debut de documentation de l'API Query
Added:
trunk/src/site/rst/user/query.rst
Modified:
trunk/src/site/rst/user/search.rst
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Added: trunk/src/site/rst/user/query.rst
===================================================================
--- trunk/src/site/rst/user/query.rst (rev 0)
+++ trunk/src/site/rst/user/query.rst 2012-01-02 18:45:36 UTC (rev 1276)
@@ -0,0 +1,364 @@
+======================
+Recherche avec Wikitty
+======================
+
+Wikitty permet de rechercher parmis les entités enregistrées tout en fournissant
+les fonctionalités de pagination. Pour cela vous pouvez construire
+programmatiquement vos recherches en utilisant WikittyQueryMaker ou de façon
+textuel en utilisant WikittyQueryParser.
+
+Au final vous obtenez dans les deux cas un WikittyQuery utilisable pour vos
+recherche pour les méthodes WikittyClient.findXXXX.
+
+Utilisation via WikittyClient
+-----------------------------
+
+Les requêtes peuvent être utilisée dans les méthodes:
+
+- findAllByQuery(Query): WikittyQueryResult<String>
+- findByQuery(Query): String
+- findAllByQuery(Class<E>, Query): WikittyQueryResult<E>
+- findByQuery(Class<E>, Query): E
+
+Dans les deux premières méthodes les résultats seront retournés de façon brut
+sous forme de String. Si le résultat représente une entité, le String sera son
+id. Si le résultat représente une Date, la date sera la valeur tel que retournée
+par la la méthode WikittyUtil.toString(Date)
+
+Les deux dernières méthodes essaient de convertir le résultat en objet de la
+classe passée en paramètre. Par exemple si vous savez que le résultat sont des
+valeurs numeriques vous pouvez passer Number.class en argument.
+
+
+Vous pouvez aussi utiliser les méthodes suivantes qui construiront les requêtes
+pour vous:
+
+- findAllByExample(E): List<E>
+- findByExample(E): E
+
+Structure d'une requête
+-----------------------
+
+Par exemple si vous souhaitez faire la recherche sur::
+
+ User.lastname=poussin AND User.firstname=benjamin
+
+Vous pouvez soit utiliser le WikittyQueryMaker::
+
+ WikittyQuery query = new WikittyQueryMaker()
+ .and()
+ .eq(User.ELEMENT_FIELD_USER_LASTNAME, "poussin")
+ .eq(User.ELEMENT_FIELD_USER_FIRSTNAME, "benjamin")
+ .end();
+
+Le end() indique que la condition est fini et que l'on souhaite la query
+
+Vous pouvez aussi utiliser WikittyQueryParser pour faire le même travail, mais
+il est plus sûr d'utiliser le WikittyQueryMaker tant que vous le pouvez::
+
+ WikittyQueryParser parser = WikittyQueryParser.parse(
+ "User.lastname=poussin User.firstname=benjamin");
+
+S'il n'y a pas d'opérateur entre deux contrainte un AND est automatiquement
+ajouté.
+
+Les contraintes disponibles
+---------------------------
+
+De nombreuses contraintes sont disponibles pour créer vos recherches :
+
+* Egalité : eq - Vérifie si un champ est égal a une valeur, si le champs est un
+ champs texte, il est possible d'ajouter des "*" en début et en fin de la
+ chaîne de recherche pour faire l'équivalent d'un startsWith ou endsWith. Si
+ vous utilisez WikittyQueryMaker les méthodes sw (startsWith) et ew (endsWith)
+ font se travail pour vous.::
+
+ WikittyQuery q = new WikittyQueryMaker().eq(User.ELEMENT_FIELD_USER_LASTNAME, "poussin").end();
+ WikittyQuery q = new WikittyQueryMaker().eq(User.ELEMENT_FIELD_USER_LASTNAME, "*ssin").end();
+ WikittyQuery q = new WikittyQueryMaker().ew(User.ELEMENT_FIELD_USER_LASTNAME, "ssin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=poussin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=*ssin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=*ssin");
+
+* Non égalité : neq - Vérifie si un champ n'est pas égal a une valeur. De la
+ même façon que le eq, il est possible d'ajouter des '*'. Ou d'utiliser les
+ méthode notsw et notew.::
+
+ WikittyQuery q = new WikittyQueryMaker().ne(User.ELEMENT_FIELD_USER_LASTNAME, "poussin").end();
+ WikittyQuery q = new WikittyQueryMaker().ne(User.ELEMENT_FIELD_USER_LASTNAME, "*ssin").end();
+ WikittyQuery q = new WikittyQueryMaker().notew(User.ELEMENT_FIELD_USER_LASTNAME, "ssin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=poussin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=*ssin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=*ssin");
+
+* Contient tous : containsAll - Vérifie si un champ multivalué contient au moins
+ une valeur de la liste des valeurs passées en argument::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .containsOne(User.ELEMENT_FIELD_USER_LASTNAME, "poussin", "couteau").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname={poussin, couteau}");
+
+* Egalité d'extension : exteq - Vérifie si un Wikitty possède une extension::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .exteq(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension=User");
+
+* Non égalité d'extension : extne - Vérifie qu'un Wikitty ne porte pas une
+extension.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .extne(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension!=User");
+
+* ContainsAll d'extension : extContainsAll - Vérifie si un Wikitty possède tous
+ les extensions::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .extContainsAll(User.EXT_USER, Employee.EXT_EMPLOYEE).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension=[User, Employee]");
+
+* Égalité d'extension : ideq - Vérifie qu'un Wikitty porte l'identifiant::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ideq(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("id=1234567-1234-1234567");
+
+* Non égalité d'identifiant : idneq - Vérifie qu'un Wikitty ne porte pas
+l'identifiant.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .idne(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("id!=1234567-1234-1234567");
+
+* Similitude : like - Vérifie qu'une chaîne de caractère est égale à une autre
+ sans tenir compte de la case ni des accents. Cette opérateur ne recherche que
+ de façon textuelle, vous pouvez ajouter des '*' en début et fin de d'expression::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .like(User.ELEMENT_FIELD_USER_FIRSTNAME, "helene").end();
+ WikittyQuery q = new WikittyQueryMaker()
+ .like(User.ELEMENT_FIELD_USER_FIRSTNAME, "*lene").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname LIKE helene");
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname LIKE *lene");
+
+* Non similitude : unlike - Vérifie qu'une chaîne de caractère n'est pas égale à une autre
+ sans tenir compte de la case ni des accents. Cette opérateur ne recherche que
+ de façon textuelle, vous pouvez ajouter des '*' en début et fin de d'expression::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .unlike(User.ELEMENT_FIELD_USER_FIRSTNAME, "helene").end();
+ WikittyQuery q = new WikittyQueryMaker()
+ .unlike(User.ELEMENT_FIELD_USER_FIRSTNAME, "*lene").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname UNLIKE helene");
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname UNLIKE *lene");
+
+* Supérieur strictement : gt - Vérifie qu'un champ est strictement supérieur à
+ une valeur. Cette condition s'applique surtout sur les champs de type Date et
+ Number::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .gt(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age > 18");
+
+* Supérieur ou égal : ge - Vérifie si un champ est supérieur ou égal à une
+valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ge(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age >= 18");
+
+* Inférieur strictement : lt - Vérifie si un champ est strictement inférieur à
+une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .lt(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age < 18");
+
+* Inférieur ou égal : le - Vérifie si un champ est inférieur ou égal à une
+valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .le(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age <= 18");
+
+* Entre : bw - Vérifie si un champ est compris entre deux valeurs.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .bw(Product.ELEMENT_FIELD_PRODUCT_PRICE, 2, 2.50).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("Product.price=[2 TO 2.5]");
+
+* Commence par : sw - Vérifie si un champ de type chaîne commence par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .sw(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=pous*");
+
+* Ne commence pas par : notsw - Vérifie si un champ de type chaîne ne commence pas
+par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .notsw(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=pous*");
+
+* Termine par : ew - Vérifie si un champ de type chaîne termine par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ew(User.ELEMENT_FIELD_USER_LASTNAME, "sin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=sin*");
+
+* Ne termine pas par : notew - Vérifie si un champs de type chaîne ne termine
+pas par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .notew(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=pous*");
+
+* Mot-clé : keyword - Vérifie si la valeur est présente dans n'importe quel
+ champ de n'importe quelle extension en fulltext (pas de prise en compte de la
+ case out des accents).::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .keyword("partout").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("partout");
+
+* Nul : isNull - Vérifie si la valeur d'un champ est nulle::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .isNull(User.ELEMENT_FIELD_USER_LASTNAME).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=NULL");
+
+* Non nul : isNotNull - Vérifie si la valeur d'un champ n'est pas nulle.
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .isNotNull(User.ELEMENT_FIELD_USER_LASTNAME).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=NULL");
+
+* False : rFalse - retourne toujours faux::
+
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .rFalse().end();
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE");
+
+* True : rTrue - retourne toujours vrai::
+
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .rTrue().end();
+
+ WikittyQuery q = WikittyQueryParser.parse("TRUE");
+
+Les noeuds à sous-requête
+-------------------------
+
+* Les noeuds à sous requêtes permettent de faire des requêtes complexes.
+
+* Non : not - Résultat inverse de la sous-requête.
+
+* Ou : or - Ou entre les différentes sous-requêtes.
+
+* Et : and - Et entre les différentes sous-requêtes.
+
+* Requête associée : in - Permet d'effectuer des jointures.
+
+* Selection : select - Ajout d'un select pour définir le champs à retourner au
+ lieu de l'id
+
+
+Recherche avancée
+-----------------
+
+Si vous souhaitez mettre des espaces dans une expression texte avec le parser
+il faut utiliser les guillemets pour encadrer la chaine.::
+
+ WikittyQuery q = WikittyQueryParser.parse("simple OR \"la jolie chaine que je recherche\"");
+
+Il est possible de faire une recherche sur un nom de champs qui peut⁻être utilisé
+par différente extension. Pour cela on remplace le nom d'extension par '*'::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .eq(new ElementField(ElementField.ALL_EXTENSION, "name"), "poussin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*.name==poussin");
+
+Dans ce cas la recherche est une recherche fulltext qui peut-être utilisé
+quelque soit le type du champs. Mais si vous souhaitez restrainte la recherche
+au champs d'un certain type vous pouvez ajouter le type à la fin.::
+
+ Date _1950 = new Date(...);
+ Date _1960 = new Date(...);
+ WikittyQuery q = new WikittyQueryMaker()
+ bw.(new ElementField("birthday", FieldType.TYPE.DATE), _1950, _1960).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*.birthday.DATE=[\"01/01/1950\" TO \"01/01/1961\"]");
+
+Il est aussi possible de faire une recherche fulltext, c'est à dire sur tous les
+champs de toutes les extentions::
+
+ Date _1950 = new Date(...);
+ Date _1960 = new Date(...);
+ WikittyQuery q = new WikittyQueryMaker()
+ eq.(Element.ALL_FIELD, "poussin).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*=poussin");
+
+
+Les autres valeurs d'une requête
+--------------------------------
+
+* Nom : name - Nommage de la requêtes.
+
+* Les requêtes permettent d'ajouter un ordre ou des facettes :
+
+* Premier index : first - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination.
+
+* Nombre : limit - Permet de définir le dernier index à retourner. Principalement utilisé pour la pagination.
+
+* [TODO] facetMinCount
+
+* [TODO] facetLimit
+
+* [TODO] facetSort
+
+* [TODO] facetExtension
+
+* [TODO] facetField
+
+* [TODO] facetQuery
+
+* Tri : sortAscending - Ajout d'un ou plusieurs champs pour le tri ascendant du résultat.
+
+* Tri : sortDescending - Ajout d'un ou plusieurs champs pour le tri descendant du résultat.
+
+Les résultats
+-------------
+
+Lorsqu'on effectue une recherche, on obtient un WikittyQueryResult. En effet, les
+résultats étant paginés, on obtient tout ou partie des résultats.
+Un WikittyQueryResult contient le nombre total de résultats, les résultats de la page
+ainsi que le premier index, le nombre de résultats et les facettes si elles ont
+été utilisées pour la recherche.
Modified: trunk/src/site/rst/user/search.rst
===================================================================
--- trunk/src/site/rst/user/search.rst 2012-01-02 17:58:20 UTC (rev 1275)
+++ trunk/src/site/rst/user/search.rst 2012-01-02 18:45:36 UTC (rev 1276)
@@ -26,6 +26,8 @@
Recherche avec Wikitty
======================
+Cette API est complètement dépréciée, il faut maintenant utiliser l'API QUERY
+
Wikitty permet de rechercher parmis les entités enregistrées tout en fournissant
les fonctionalités de pagination. Pour cela vous pouvez construire
programmatiquement vos recherches en utilisant un système de Criteria.
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-01-02 17:58:20 UTC (rev 1275)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-01-02 18:45:36 UTC (rev 1276)
@@ -453,7 +453,7 @@
* @return {@code this} with the {@code extneq} restriction added.
* @see {@link NotEquals}
*/
- public WikittyQueryMaker extneq(String extensionName) {
+ public WikittyQueryMaker extne(String extensionName) {
return ne(Element.EXTENSION, extensionName);
}
@@ -463,10 +463,10 @@
* Restrict search to wikitties that do not have the id given in parameter.
*
* @param idOrWikitty the id the wikitties must not have.
- * @return {@code this} with the {@code idneq} restriction added.
+ * @return {@code this} with the {@code idne} restriction added.
* @see {@link NotEquals}
*/
- public WikittyQueryMaker idneq(Object idOrWikitty) {
+ public WikittyQueryMaker idne(Object idOrWikitty) {
return ne(Element.ID, idOrWikitty);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:58:20 UTC (rev 1275)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 18:45:36 UTC (rev 1276)
@@ -4,8 +4,6 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.FieldType;
-import org.nuiton.wikitty.entities.WikittyExtension;
-import org.nuiton.wikitty.entities.WikittyField;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
1
0
r1275 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 18:58:20 +0100 (Mon, 02 Jan 2012)
New Revision: 1275
Url: http://nuiton.org/repositories/revision/wikitty/1275
Log:
ajout d'un constructeur pour faciliter la recherche sur toutes les extensions '*', le nouveau constructeur prend en argument le type du champs
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:48:40 UTC (rev 1274)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:58:20 UTC (rev 1275)
@@ -3,6 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyField;
@@ -28,13 +29,39 @@
final static public String ALL_EXTENSION = "*";
+ /**
+ * Le parametre doit etre completement qualifier c-a-d: extName.fieldName.
+ * ex: User.firstName.
+ * @param fqfield
+ */
public ElementField(String fqfield) {
super(fqfield);
}
+ /**
+ * Ce constructeur permet de creer un champs, si a la place de extensionName
+ * vous passez {@link #ALL_EXTENSION} le champs represente tous les champs
+ * partant se nom sur toutes les extensions
+ * @param extensionName
+ * @param fieldName
+ */
public ElementField(String extensionName, String fieldName) {
super(WikittyUtil.getFQFieldName(extensionName, fieldName));
}
+ /**
+ * Cree un champs sur toutes les extensions ex: "*.name" en specifiant le
+ * type du champs ex: "*.birthday.DATE"
+ *
+ * @param fieldName le champs sans l'extension
+ * @param type le type que le champs doit avoir
+ */
+ public ElementField(String fieldName, FieldType.TYPE type) {
+ // le separateur entre le type et le champs est le meme que entre
+ // l'extension et le champs, on utilise la meme methode
+ super(WikittyUtil.getFQFieldName(
+ WikittyUtil.getFQFieldName(ALL_EXTENSION, fieldName), type.name()));
+ }
+
}
1
0
r1274 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 18:48:40 +0100 (Mon, 02 Jan 2012)
New Revision: 1274
Url: http://nuiton.org/repositories/revision/wikitty/1274
Log:
ajout d'un constructeur pour facilite la recherche sur toutes les extensions '*'
et d'une constante ALL_EXTENSION='*'
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 16:56:31 UTC (rev 1273)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:48:40 UTC (rev 1274)
@@ -2,6 +2,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyField;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
@@ -23,9 +26,15 @@
private static final long serialVersionUID = 1L;
- public ElementField(String value) {
- super(value);
+ final static public String ALL_EXTENSION = "*";
+
+ public ElementField(String fqfield) {
+ super(fqfield);
}
+ public ElementField(String extensionName, String fieldName) {
+ super(WikittyUtil.getFQFieldName(extensionName, fieldName));
+ }
+
}
1
0
r1273 - in trunk: wikitty-api/src/test/java/org/nuiton/wikitty/api wikitty-generators/src/main/java/org/nuiton/wikitty/generator
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 17:56:31 +0100 (Mon, 02 Jan 2012)
New Revision: 1273
Url: http://nuiton.org/repositories/revision/wikitty/1273
Log:
Evolution #1674: Change method argument for collection adder method in generated object
- addAll(Collection
- add(<Type>...
- remove(<Type>...
Modified:
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -704,7 +704,7 @@
}
@Override
- public void addAllLabels(Set<String> labels) {
+ public void addAllLabels(Collection<String> labels) {
this.labels.addAll(labels);
}
@@ -713,8 +713,10 @@
* @param element
*/
@Override
- public void addLabels(String element) {
- labels.add(element);
+ public void addLabels(String... element) {
+ for (String v : element) {
+ labels.add(v);
+ }
}
/**
@@ -722,8 +724,10 @@
* @param element
*/
@Override
- public void removeLabels(String element) {
- labels.remove(element);
+ public void removeLabels(String... element) {
+ for (String v : element) {
+ labels.remove(v);
+ }
}
/**
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -338,17 +338,23 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
getterName = "get" + StringUtils.capitalize(attributeName);
- ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeSimpleNameInSet);
+ ObjectModelOperation getter = addOperation(
+ abstractClass, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClass, getter, "Override");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result = <%=helperClassName%>.<%=getterName%>(getWikitty());
+ <%=attributeTypeCollectionStrict%> result = <%=helperClassName%>.<%=getterName%>(getWikitty());
return result;
}*/;
setOperationBody(getter, getterBody);
@@ -356,10 +362,10 @@
String setterName = "set" + capitalizedAttributeName;
ObjectModelOperation setter = addOperation(abstractClass, setterName, "void");
addAnnotation(abstractClass, setter, "Override");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> oldValue = get<%=capitalizedAttributeName%>();
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=setterName%>(getWikitty(), <%=attributeName%>);
getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
@@ -368,10 +374,10 @@
String addAllName = "addAll" + capitalizedAttributeName;
ObjectModelOperation addAll = addOperation(abstractClass, addAllName, "void");
addAnnotation(abstractClass, addAll, "Override");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> oldValue = get<%=capitalizedAttributeName%>();
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=addAllName%>(getWikitty(), <%=attributeName%>);
getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
@@ -380,22 +386,24 @@
String addName = "add" + capitalizedAttributeName;
ObjectModelOperation adder = addOperation(abstractClass, addName, "void");
addAnnotation(abstractClass, adder, "Override");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=addName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>());
+ getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(abstractClass, removeName, "void");
addAnnotation(abstractClass, remover, "Override");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=removeName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(remover, removerBody);
@@ -586,18 +594,23 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
String attributeNameCapitalized = StringUtils.capitalize(attributeName);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
getterName = "get" + attributeNameCapitalized;
- ObjectModelOperation getter = addOperation(abstractClassForThisMetaExtension, getterName, attributeTypeSimpleNameInSet);
+ ObjectModelOperation getter = addOperation(abstractClassForThisMetaExtension, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClassForThisMetaExtension, getter, "Override");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result;
+ <%=attributeTypeCollectionStrict%> result;
if (extensionForMetaExtension == null) {
result = <%=helperClassName%>.<%=getterName%>(getWikitty());
} else {
@@ -610,68 +623,76 @@
String setterName = "set" + attributeNameCapitalized;
ObjectModelOperation setter = addOperation(abstractClassForThisMetaExtension, setterName, "void");
addAnnotation(abstractClassForThisMetaExtension, setter, "Override");
- addParameter(setter, attributeTypeSimpleNameInSet, "values");
+ addParameter(setter, attributeTypeCollectionStrict, "values");
String setterBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=setterName%>(getWikitty(), values);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=setterName%>(extensionForMetaExtension.getName(), getWikitty(), values);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(setter, setterBody);
String addAllName = "addAll" + attributeNameCapitalized;
ObjectModelOperation addAll = addOperation(abstractClassForThisMetaExtension, addAllName, "void");
addAnnotation(abstractClassForThisMetaExtension, addAll, "Override");
- addParameter(addAll, attributeTypeSimpleNameInSet, "values");
+ addParameter(addAll, attributeTypeCollectionGeneric, "values");
String addAllBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=addAllName%>(getWikitty(), values);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=addAllName%>(extensionForMetaExtension.getName(), getWikitty(), values);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(addAll, addAllBody);
String addName = "add" + attributeNameCapitalized;
ObjectModelOperation adder = addOperation(abstractClassForThisMetaExtension, addName, "void");
addAnnotation(abstractClassForThisMetaExtension, adder, "Override");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=addName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=addName%>(extensionForMetaExtension.getName(), getWikitty(), element);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + attributeNameCapitalized;
ObjectModelOperation remover = addOperation(abstractClassForThisMetaExtension, removeName, "void");
addAnnotation(abstractClassForThisMetaExtension, remover, "Override");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=removeName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=removeName%>(extensionForMetaExtension.getName(), getWikitty(), element);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(remover, removerBody);
@@ -680,14 +701,16 @@
addAnnotation(abstractClassForThisMetaExtension, clear, "Override");
String clearBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=clearName%>(getWikitty());
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=clearName%>(extensionForMetaExtension.getName(), getWikitty());
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(clear, clearBody);
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -231,28 +231,30 @@
if (attribute.getMaxMultiplicity() > 1 || attribute.getMaxMultiplicity() == -1) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric = "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + StringUtils.capitalize(attributeName);
- getter = addOperation(contract, getterName, attributeTypeSimpleNameInSet);
+ getter = addOperation(contract, getterName, attributeTypeCollectionStrict);
String setterName = "set" + StringUtils.capitalize(attributeName);
ObjectModelOperation setter = addOperation(contract, setterName, "void");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String addAllName = "addAll" + StringUtils.capitalize(attributeName);
ObjectModelOperation addAll = addOperation(contract, addAllName, "void");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addName = "add" + StringUtils.capitalize(attributeName);
ObjectModelOperation adder = addOperation(contract, addName, "void");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(contract, removeName, "void");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String clearName = "clear" + StringUtils.capitalize(attributeName);
addOperation(contract, clearName, "void");
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -191,25 +191,31 @@
// get, add, remove and clear
//calculate template parameters
- String attributeTypeInSet = WikittyTransformerUtil.generateResultType(attribute, true);
- String attributeTypeInSetImpl = null;
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
+
+ String attributeTypeCollectionStrictImpl = null;
String collectionType = WikittyTransformerUtil.getCollectionTypeName(attribute);
if (Set.class.getSimpleName().equals(collectionType)){
addImport(abstractClass, Set.class);
addImport(abstractClass, LinkedHashSet.class);
- attributeTypeInSetImpl = "LinkedHashSet<String>";
+ attributeTypeCollectionStrictImpl = "LinkedHashSet<String>";
}
if (List.class.getSimpleName().equals(collectionType)){
addImport(abstractClass, List.class);
addImport(abstractClass, ArrayList.class);
- attributeTypeInSetImpl = "ArrayList<String>";
+ attributeTypeCollectionStrictImpl = "ArrayList<String>";
}
//adding the attribute
ObjectModelAttribute modelAttribute = addAttribute(abstractClass,
- attributeName + " = new " + attributeTypeInSetImpl + "()",
- attributeTypeInSet);
+ attributeName + " = new " + attributeTypeCollectionStrictImpl + "()",
+ attributeTypeCollectionStrict);
String annotation = "WikittyField(fqn=\""+ businessEntity.getName() + "." + attributeName +"\")";
addAnnotation(abstractClass, modelAttribute, annotation);
addImport(abstractClass, "org.nuiton.wikitty.entities.WikittyField");
@@ -217,7 +223,7 @@
// adding the getter
getterName = "get" + StringUtils.capitalize(attributeName);
- ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeInSet);
+ ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClass, getter, "Override");
String getterBody = ""
/*{
@@ -229,14 +235,14 @@
getterName = "set" + StringUtils.capitalize(attributeName);
ObjectModelOperation setter = addOperation(abstractClass, getterName, "void");
addAnnotation(abstractClass, setter, "Override");
- addParameter(setter, attributeTypeInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
if (<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
} else {
// make copy to prevent modification of source collection
- this.<%=attributeName%>=new <%=attributeTypeInSetImpl%>(<%=attributeName%>);
+ this.<%=attributeName%>=new <%=attributeTypeCollectionStrictImpl%>(<%=attributeName%>);
}
modificationCount++;
}*/;
@@ -246,11 +252,11 @@
String addAllName = "addAll" + StringUtils.capitalize(attributeName);
ObjectModelOperation addAll = addOperation(abstractClass, addAllName, "void");
addAnnotation(abstractClass, addAll, "Override");
- addParameter(addAll, attributeTypeInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if (this.<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
}
this.<%=attributeName%>.addAll(<%=attributeName%>);
modificationCount++;
@@ -261,13 +267,15 @@
String addName = "add" + StringUtils.capitalize(attributeName);
ObjectModelOperation adder = addOperation(abstractClass, addName, "void");
addAnnotation(abstractClass, adder, "Override");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
if (this.<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
}
- this.<%=attributeName%>.add(element);
+ for (<%=attributeType%> v : element) {
+ this.<%=attributeName%>.add(v);
+ }
modificationCount++;
}*/;
setOperationBody(adder, adderBody);
@@ -276,11 +284,15 @@
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(abstractClass, removeName, "void");
addAnnotation(abstractClass, remover, "Override");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- <%=attributeName%>.remove(element);
- modificationCount++;
+ if (this.<%=attributeName%> != null) {
+ for (<%=attributeType%> v : element) {
+ <%=attributeName%>.remove(element);
+ }
+ modificationCount++;
+ }
}*/;
setOperationBody(remover, removerBody);
@@ -290,8 +302,10 @@
addAnnotation(abstractClass, clear, "Override");
String clearBody = ""
/*{
- <%=attributeName%>.clear();
- modificationCount++;
+ if (this.<%=attributeName%> != null) {
+ <%=attributeName%>.clear();
+ modificationCount++;
+ }
}*/;
setOperationBody(clear, clearBody);
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -121,26 +121,36 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
- String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
- String attributeNameCapitalized = StringUtils.capitalize(attributeName);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+ String getFieldMethodName =
+ WikittyTransformerUtil.generateGetFieldAsCall(attribute);
+ String attributeNameCapitalized =
+ StringUtils.capitalize(attributeName);
+
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + attributeNameCapitalized;
- ObjectModelOperation getter = addOperation(helper, getterName, attributeTypeSimpleNameInSet, ObjectModelModifier.STATIC);
+ ObjectModelOperation getter = addOperation(
+ helper, getterName, attributeTypeCollectionStrict,
+ ObjectModelModifier.STATIC);
addParameter(getter, "Wikitty", "wikitty");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result = wikitty.<%=getFieldMethodName%>(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeType%>.class);
+ <%=attributeTypeCollectionStrict%> result = wikitty.<%=getFieldMethodName%>(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeType%>.class);
return result;
}*/;
setOperationBody(getter, getterBody);
String setterName = "set" + attributeNameCapitalized;
- ObjectModelOperation setter = addOperation(helper, setterName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation setter = addOperation(
+ helper, setterName, "void", ObjectModelModifier.STATIC);
addParameter(setter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
wikitty.setField(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeName%>);
@@ -148,14 +158,15 @@
setOperationBody(setter, setterBody);
String addAllName = "addAll" + attributeNameCapitalized;
- ObjectModelOperation addAll = addOperation(helper, addAllName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation addAll = addOperation(
+ helper, addAllName, "void", ObjectModelModifier.STATIC);
addParameter(addAll, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if(<%=attributeName%> != null){
- for (String id:<%=attributeName%>){
- add<%=attributeNameCapitalized%>(wikitty, id);
+ for (<%=attributeType%> v:<%=attributeName%>){
+ add<%=attributeNameCapitalized%>(wikitty, v);
}
}
}*/;
@@ -164,20 +175,24 @@
String addName = "add" + attributeNameCapitalized;
ObjectModelOperation adder = addOperation(helper, addName, "void", ObjectModelModifier.STATIC);
addParameter(adder, "Wikitty", "wikitty");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
- wikitty.addToField(<%=extensionVariableName%>, <%=fieldVariableName%>, element);
+ for (<%=attributeType%> v : element) {
+ wikitty.addToField(<%=extensionVariableName%>, <%=fieldVariableName%>, v);
+ }
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(helper, removeName, "void", ObjectModelModifier.STATIC);
addParameter(remover, "Wikitty", "wikitty");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- wikitty.removeFromField(<%=extensionVariableName%>, <%=fieldVariableName%>, element);
+ for (<%=attributeType%> v : element) {
+ wikitty.removeFromField(<%=extensionVariableName%>, <%=fieldVariableName%>, v);
+ }
}*/;
setOperationBody(remover, removerBody);
@@ -383,29 +398,37 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
String capitalizedAttributeName = StringUtils.capitalize(attributeName);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + capitalizedAttributeName;
- ObjectModelOperation getter = addOperation(helper, getterName, attributeTypeSimpleNameInSet, ObjectModelModifier.STATIC);
+ ObjectModelOperation getter = addOperation(
+ helper, getterName, attributeTypeCollectionStrict,
+ ObjectModelModifier.STATIC);
addParameter(getter, "String", "extensionName");
addParameter(getter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
String getterBody = ""
/*{
String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- <%=attributeTypeSimpleNameInSet%> result = (<%=attributeTypeSimpleNameInSet%>) wikitty.getFqField(fieldName);
+ <%=attributeTypeCollectionStrict%> result = (<%=attributeTypeCollectionStrict%>) wikitty.getFqField(fieldName);
return result;
}*/;
setOperationBody(getter, getterBody);
String setterName = "set" + capitalizedAttributeName;
- ObjectModelOperation setter = addOperation(helper, setterName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation setter = addOperation(
+ helper, setterName, "void", ObjectModelModifier.STATIC);
addParameter(setter, "String", "extensionName");
addParameter(setter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
clear<%=capitalizedAttributeName%>(extensionName, wikitty);
@@ -414,10 +437,11 @@
setOperationBody(setter, setterBody);
String addAllName = "addAll" + capitalizedAttributeName;
- ObjectModelOperation addAll = addOperation(helper, addAllName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation addAll = addOperation(
+ helper, addAllName, "void", ObjectModelModifier.STATIC);
addParameter(addAll, "String", "extensionName");
addParameter(addAll, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if(<%=attributeName%> != null){
@@ -429,14 +453,17 @@
setOperationBody(addAll, addAllBody);
String addName = "add" + capitalizedAttributeName;
- ObjectModelOperation adder = addOperation(helper, addName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation adder = addOperation(
+ helper, addName, "void", ObjectModelModifier.STATIC);
addParameter(adder, "String", "extensionName");
addParameter(adder, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
-/*{
- String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- wikitty.addToField(fieldName, element);
+/*{
+ for (<%=attributeType%> v : element) {
+ String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
+ wikitty.addToField(fieldName, v);
+ }
}*/;
setOperationBody(adder, adderBody);
@@ -444,11 +471,13 @@
ObjectModelOperation remover = addOperation(helper, removeName, "void", ObjectModelModifier.STATIC);
addParameter(remover, "String", "extensionName");
addParameter(remover, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- wikitty.removeFromField(fieldName, element);
+ for (<%=attributeType%> v : element) {
+ String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
+ wikitty.removeFromField(fieldName, v);
+ }
}*/;
setOperationBody(remover, removerBody);
1
0
r1272 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/storage wikitty-api/src/test/java/org/nuiton/wikitty/storage wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 16:08:12 +0100 (Mon, 02 Jan 2012)
New Revision: 1272
Url: http://nuiton.org/repositories/revision/wikitty/1272
Log:
Evolution #1868: Add facet topic sort order in query
(ajout de l'implantation des facets dans le InMemory)
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Comparator;
+
+/**
+ * Use to specify sort order of Facet in result
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public enum FacetSortType {
+ /** sort on count of topic */
+ count("count", FacetTopicCountComparator.instance),
+ /** sort on name of topic */
+ name("index", FacetTopicNameComparator.instance);
+
+ public String solrValue;
+ public Comparator<FacetTopic> compartor;
+
+ private FacetSortType(String solrValue, Comparator<FacetTopic> compartor) {
+ this.solrValue = solrValue;
+ this.compartor = compartor;
+ }
+
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -20,6 +20,14 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(FacetTopicCountComparator.class);
+ final static public Comparator<FacetTopic> instance = new FacetTopicCountComparator();
+
+ /**
+ * You must use {@link instance}
+ */
+ public FacetTopicCountComparator() {
+ }
+
public int compare(FacetTopic o1, FacetTopic o2) {
int thisVal = o1.getCount();
int anotherVal = o2.getCount();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -17,14 +17,22 @@
*/
public class FacetTopicNameComparator implements Comparator<FacetTopic> {
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(FacetTopicNameComparator.class);
+ final static public Comparator<FacetTopic> instance =
+ new FacetTopicNameComparator();
+ final static public Comparator<FacetTopic> instanceCaseSensitive =
+ new FacetTopicNameComparator(false);
protected boolean ignoreCase = true;
+ /**
+ * You must use {@link instance} or {@link instanceCaseSensitive}
+ */
public FacetTopicNameComparator() {
}
+ /**
+ * You must use {@link instance} or {@link instanceCaseSensitive}
+ */
public FacetTopicNameComparator(boolean ignoreCase) {
this.ignoreCase = ignoreCase;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -53,10 +53,12 @@
*/
protected int facetMinCount = 1;
/**
- * Nombre maximum de facet a retourner apres la requete. Par default on en
+ * Nombre maximum de topic par facet a retourner. Par default on en
* retourne 100.
*/
protected int facetLimit = 100;
+ /** sort topic order, default is sorted on count */
+ protected FacetSortType facetSort = FacetSortType.count;
/** Facet on condition. */
protected List<FacetQuery> facetQuery;
@@ -113,6 +115,7 @@
ObjectUtils.equals(this.getSortAscending(), other.getSortAscending()) &&
ObjectUtils.equals(this.getSortDescending(), other.getSortDescending()) &&
ObjectUtils.equals(this.getFacetLimit(), other.getFacetLimit()) &&
+ ObjectUtils.equals(this.getFacetSort(), other.getFacetSort()) &&
ObjectUtils.equals(this.getFacetMinCount(), other.getFacetMinCount()) &&
ObjectUtils.equals(this.getFacetQuery(), other.getFacetQuery()) &&
ObjectUtils.equals(this.getCondition(), other.getCondition());
@@ -200,6 +203,14 @@
return this;
}
+ public void setFacetSort(FacetSortType facetSort) {
+ this.facetSort = facetSort;
+ }
+
+ public FacetSortType getFacetSort() {
+ return facetSort;
+ }
+
public List<FacetQuery> getFacetQuery() {
if (facetQuery == null) {
facetQuery = new LinkedList<FacetQuery>();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -71,6 +71,7 @@
q.setFacetMinCount(o.getFacetMinCount());
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
+ q.setFacetSort(o.getFacetSort());
q.setName(o.getName());
q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -0,0 +1,107 @@
+package org.nuiton.wikitty.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.FacetSortType;
+import org.nuiton.wikitty.query.FacetTopic;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Select;
+import org.nuiton.wikitty.services.WikittyTransaction;
+
+/**
+ * Ensemble de methode reutilisable dans differente implantation de
+ * {@link WikittySearchEngine}
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineHelper {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineHelper.class);
+
+ /**
+ * Gere le travail pour les requetes ayant un {@link Select}
+ *
+ * @param searchEngine le searchEngine a utiliser pour les sous requetes
+ * @param transaction la transaction a utiliser
+ * @param query la requete qui debute par un {@link Select}
+ * @return
+ */
+ static public WikittyQueryResult<String> findAllByQueryWithSelect(
+ WikittySearchEngine searchEngine, WikittyTransaction transaction,
+ WikittyQuery query) {
+
+ if (!(query.getCondition() instanceof Select)) {
+ throw new WikittyException("Query don't start with Select condition");
+ } else {
+ // gere les conditions qui commence par select
+ // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
+ // car le select est execute via une facette, mais cette facette
+ // n'a pas les meme limites que les autres facette
+
+ Select select = (Select)query.getCondition();
+ String extName = WikittyExtension.extractExtensionName(
+ select.getElement().getValue());
+ WikittyQueryMaker newCond = new WikittyQueryMaker()
+ .and()
+ .exteq(extName)
+ .condition(select.getSubCondition());
+
+ // copy de la query pour les facettes
+ WikittyQuery queryFacet = query.copy();
+ queryFacet.setCondition(newCond.getCondition());
+ queryFacet.setLimit(0);
+
+ // copy de la query pour le select
+ // on part de facet qui a deja la bonne condition
+ WikittyQuery querySelect = queryFacet.copy();
+ querySelect.setLimit(0);
+ querySelect.setFacetMinCount(0);
+ querySelect.setFacetLimit(Integer.MAX_VALUE);
+ // on force le sort pour toujours utiliser le meme
+ querySelect.setFacetSort(FacetSortType.count);
+ querySelect.setFacetQuery();
+ querySelect.setFacetField(select.getElement());
+
+ // execution des requetes
+ WikittyQueryResult<String> resultFacet =
+ searchEngine.findAllByQuery(transaction, queryFacet);
+ WikittyQueryResult<String> resultSelect =
+ searchEngine.findAllByQuery(transaction, querySelect);
+
+ // creation des resultats via la facette select
+ List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
+
+ List<String> selectList = new ArrayList<String>(
+ Math.min(topics.size(), query.getLimit()));
+ if (query.getFirst() < topics.size()) {
+ int first = query.getFirst();
+ int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
+ for (FacetTopic topic : topics.subList(first, last)) {
+ selectList.add(topic.getTopicName());
+ }
+ }
+
+ // fusion des resultats
+ WikittyQueryResult<String> result = new WikittyQueryResult<String>(
+ query.getName(),
+ query.getFirst(),
+ topics.size(),
+ resultSelect.getQueryString(),
+ resultFacet.getFacets(),
+ selectList);
+
+ return result;
+ }
+ }
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -38,7 +38,16 @@
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.commons.collections.Bag;
+import org.apache.commons.collections.BagUtils;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Factory;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.bag.HashBag;
+import org.apache.commons.collections.map.LazyMap;
+import org.apache.commons.collections.map.LazySortedMap;
+import org.apache.commons.collections.map.PredicatedMap;
+import org.apache.commons.collections.set.PredicatedSet;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,6 +57,8 @@
import org.nuiton.wikitty.entities.FieldType.TYPE;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.FacetQuery;
+import org.nuiton.wikitty.query.FacetTopic;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
@@ -56,6 +67,7 @@
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.query.conditions.ElementId;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -113,38 +125,126 @@
// do nothing
}
- private boolean checkRestriction(WikittyTransaction transaction,
- Condition condition, Wikitty w) {
+ static private boolean checkRestriction(WikittySearchEngine searchEngine,
+ WikittyTransaction transaction, Condition condition, Wikitty w) {
WikittyQueryVisitorCheckCondition v =
- new WikittyQueryVisitorCheckCondition(this, transaction, w);
+ new WikittyQueryVisitorCheckCondition(searchEngine, transaction, w);
condition.accept(v);
boolean result = v.getResult();
return result;
}
+
+ static public class FacetPredicate {
+ WikittyTransaction tx;
+ WikittySearchEngine searchEngine;
+ WikittyQuery query;
+ Map<String, Bag> topic;
+
+ public FacetPredicate(WikittySearchEngine searchEngine,
+ WikittyTransaction tx, WikittyQuery query) {
+ this.searchEngine = searchEngine;
+ this.tx = tx;
+ this.query = query;
+
+ topic = LazyMap.decorate(new HashMap(), new Factory() {
+ public Object create() {
+ return new HashBag();
+ }
+ });
+
+ }
+
+ public Map<String, List<FacetTopic>> getFacets() {
+ Map<String, List<FacetTopic>> result = new HashMap<String, List<FacetTopic>>();
+ for (String facetName : topic.keySet()) {
+ List<FacetTopic> list = new ArrayList<FacetTopic>();
+ Bag b = topic.get(facetName);
+ for (Object topicName : b.uniqueSet()) {
+ int count = b.getCount(topicName);
+ // pour ajouter le topic il faut un minimum indique dans la query
+ if (count >= query.getFacetMinCount()) {
+ FacetTopic ft = new FacetTopic(facetName, String.valueOf(topicName), count);
+ list.add(ft);
+ }
+ }
+ // on tri les facets selon l'ordre demande ...
+ Collections.sort(list, query.getFacetSort().compartor);
+ // ... et on en prend que le nombre demande
+ if (list.size() > query.getFacetLimit()) {
+ list = list.subList(0, query.getFacetLimit());
+ }
+ result.put(facetName, list);
+ }
+ return result;
+ }
+
+ public boolean add(Wikitty w) {
+ boolean result = false;
+
+ // create facet extension
+ if (query.isFacetExtension()) {
+ String facetName = ElementExtension.EXTENSION.getValue();
+ for (String extName : w.getExtensionNames()) {
+ topic.get(facetName).add(extName);
+ result = true;
+ }
+ }
+
+ // create facet field
+ for (ElementField e : query.getFacetField()) {
+ String fqf = e.getValue();
+ Object value = w.getFqField(fqf);
+ topic.get(fqf).add(value);
+ result = true;
+ }
+
+ // create facet query
+ for (FacetQuery q : query.getFacetQuery()) {
+ if (checkRestriction(searchEngine, tx, q.getCondition(), w)) {
+ String facetName = q.getName();
+ if (facetName == null) {
+ facetName = q.getCondition().toString();
+ }
+ topic.get(facetName).add(facetName);
+ }
+ }
+
+ return result;
+ }
+ }
@Override
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
- // throw new UnsupportedOperationException("Not supported yet.");
- int first = query.getFirst();
- int limit = query.getLimit();
- List<String> ids = new LinkedList<String>();
- int currentIndex = 0;
- for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
- Wikitty w = entry.getValue();
- String id = entry.getKey();
- Condition c = query.getCondition();
- if (!w.isDeleted() && checkRestriction(transaction, c, w)) {
- currentIndex++;
- if (currentIndex > first) {
- ids.add(id);
+ WikittyQueryResult<String> result;
+
+ if (query.getCondition() instanceof Select) {
+ result = WikittySearchEngineHelper.findAllByQueryWithSelect(
+ this, transaction, query);
+ } else {
+ int first = query.getFirst();
+ int limit = query.getLimit();
+ List<String> ids = new LinkedList<String>();
+ FacetPredicate facets = new FacetPredicate(this, transaction, query);
+
+ int totalResult = 0;
+ for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
+ Wikitty w = entry.getValue();
+ String id = entry.getKey();
+ Condition c = query.getCondition();
+ if (!w.isDeleted() && checkRestriction(this, transaction, c, w)) {
+ totalResult++;
+ if (totalResult > first && ids.size() < limit) {
+ // ajout en tant que resultat
+ ids.add(id);
+ }
+ facets.add(w);
}
- if (ids.size() >= limit) {
- break;
- }
}
+
+ result = new WikittyQueryResult<String>(query.getName(),
+ first, totalResult, query.getCondition().toString(), facets.getFacets(), ids);
}
- return new WikittyQueryResult<String>(query.getName(),
- first, ids.size(), query.getCondition().toString(), null, ids);
+ return result;
}
@Override
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -35,6 +35,9 @@
public void testfindAllByQuery() throws Exception {
// initialisation des données
+ // 2 label: l1("toutou", "titi") et l2()
+ // 3 group: g1("MonGroup1", [l1]), g2("MonGroup2", [l2]), g3("MonGroup3", [l1,l2])
+
WikittyLabelImpl l1 = new WikittyLabelImpl(new WikittyImpl("l1"));
l1.addLabels("toutou");
l1.addLabels("titi");
@@ -170,6 +173,19 @@
g3.getWikittyId())));
}
+ { // select (et donc les facets)
+ WikittyQuery q = new WikittyQueryMaker()
+ .select(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS, l1)
+ .end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ System.out.println("dd:" + result.getAll());
+ // g3 doit etre retrouve via le join, et g1 est exclue via la not(ideq)
+ Assert.assertEquals(2, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g1.getName(), g3.getName())));
+ }
+
// TODO poussin 20111228 do more test to test all possible condition
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -69,6 +69,7 @@
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.query.FacetQuery;
+import org.nuiton.wikitty.query.FacetSortType;
import org.nuiton.wikitty.query.FacetTopic;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryMaker;
@@ -78,6 +79,7 @@
import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
+import org.nuiton.wikitty.storage.WikittySearchEngineHelper;
/**
*
@@ -662,58 +664,8 @@
WikittyQueryResult<String> result;
if (query.getCondition() instanceof Select) {
- // gere les conditions qui commence par select
- // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
- // car le select est execute via une facette, mais cette facette
- // n'a pas les meme limites que les autres facette
-
- Select select = (Select)query.getCondition();
- String extName = WikittyExtension.extractExtensionName(
- select.getElement().getValue());
- WikittyQueryMaker newCond = new WikittyQueryMaker()
- .and()
- .exteq(extName)
- .condition(select.getSubCondition());
-
- // copy de la query pour les facettes
- WikittyQuery queryFacet = query.copy();
- queryFacet.setCondition(newCond.getCondition());
- queryFacet.setLimit(0);
-
- // copy de la query pour le select
- // on part de facet qui a deja la bonne condition
- WikittyQuery querySelect = queryFacet.copy();
- querySelect.setLimit(0);
- querySelect.setFacetMinCount(0);
- querySelect.setFacetLimit(Integer.MAX_VALUE);
- querySelect.setFacetQuery();
- querySelect.setFacetField(select.getElement());
-
- // execution des requetes
- WikittyQueryResult<String> resultFacet = findAllByQuery(transaction, queryFacet);
- WikittyQueryResult<String> resultSelect = findAllByQuery(transaction, querySelect);
-
- // creation des resultats via la facette select
- List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
-
- List<String> selectList = new ArrayList<String>(
- Math.min(topics.size(), query.getLimit()));
- if (query.getFirst() < topics.size()) {
- int first = query.getFirst();
- int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
- for (FacetTopic topic : topics.subList(first, last)) {
- selectList.add(topic.getTopicName());
- }
- }
-
- // fusion des resultats
- result = new WikittyQueryResult<String>(
- query.getName(),
- query.getFirst(),
- topics.size(),
- resultSelect.getQueryString(),
- resultFacet.getFacets(),
- selectList);
+ result = WikittySearchEngineHelper.findAllByQueryWithSelect(
+ this, transaction, query);
} else {
// Create querySolr
@@ -768,6 +720,7 @@
querySolr.setFacet(true);
querySolr.setFacetMinCount(query.getFacetMinCount());
querySolr.setFacetLimit(query.getFacetLimit());
+ querySolr.setFacetSort(query.getFacetSort().solrValue);
if (isFacetExtension) {
querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
1
0
31 Dec '11
Author: bpoussin
Date: 2011-12-31 15:06:23 +0100 (Sat, 31 Dec 2011)
New Revision: 1271
Url: http://nuiton.org/repositories/revision/wikitty/1271
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- implantation du select en condition ce qui permet de faire des jointures facilement avec le In
(tout semble fini, reste a nettoyer un peu et ajouter plus de tests)
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java
trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -26,7 +26,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -39,6 +39,7 @@
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.Select;
/**
* Wikitty client is object used in client side to access WikittyService.
@@ -173,22 +174,28 @@
this.wikittyService = new WikittyServiceEnhanced(wikittyService);
}
- public <E extends BusinessEntity> E store(E e) {
- Wikitty w = ((BusinessEntityImpl)e).getWikitty();
- store(w);
- return e;
- }
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // STORE
+ //
+ ////////////////////////////////////////////////////////////////////////////
public Wikitty store(Wikitty w) {
long start = TimeLog.getTime();
WikittyEvent resp = wikittyService.store(securityToken, w);
// update object
resp.update(w);
-
+
timeLog.log(start, "store");
return w;
}
+ public <E extends BusinessEntity> E store(E e) {
+ Wikitty w = ((BusinessEntityImpl)e).getWikitty();
+ store(w);
+ return e;
+ }
+
public <E extends BusinessEntity> E[] store(E e1, E e2, E... eN) {
List<E> es = new ArrayList<E>(eN.length + 2);
Collections.addAll(es, e1, e2);
@@ -258,61 +265,35 @@
return wikitties;
}
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // RESTORE
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
/**
- * Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
- * @param <E> object type
- * @param clazz entity class
- * @param id entity id
- * @param checkExtension if true check that Wikitty result has all extension
- * declared in clazz
+ * Restore wikitty entity with specified id or {@code null} if entity can't be be found.
+ *
+ * @param id entity ids if null return is empty list
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
- public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
- try {
- long start = TimeLog.getTime();
- E result = null;
- if (id != null) {
- HashSet<String> extNames = null;
+ public List<Wikitty> restore(List<String> id) {
+ long start = TimeLog.getTime();
- Wikitty wikitty = wikittyService.restore(securityToken, id);
- if (wikitty != null) {
- if (checkExtension) {
- extNames = new HashSet<String>(wikitty.getExtensionNames());
- }
- result = WikittyUtil.newInstance(
- securityToken, wikittyService, clazz, wikitty);
-
- if (checkExtension) {
- // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
- BusinessEntityImpl b = (BusinessEntityImpl) result;
- Collection<WikittyExtension> BusinessEntityStaticExtensions = b.getStaticExtensions();
- for (WikittyExtension ext : BusinessEntityStaticExtensions) {
- String extensionName = ext.getName();
- if (!extNames.contains(extensionName)) {
- // extension wanted by BusinessEntity (clazz)
- // is not in wikitty, then wikitty is not good type
- // for business
- result = null;
- break;
- }
- }
- }
- }
- }
-
- timeLog.log(start, "restore<Business>");
- return result;
- } catch (SecurityException eee) {
- throw eee;
- } catch (Exception eee) {
- throw new WikittyException("Can't restore wikitty", eee);
+ List<Wikitty> result;
+ if (id == null) {
+ result = new ArrayList<Wikitty>();
+ } else {
+ result = wikittyService.restore(securityToken, id);
}
+
+ timeLog.log(start, "restore<list>");
+ return result;
}
/**
* Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
+ *
* @param id entity id
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
@@ -320,47 +301,14 @@
long start = TimeLog.getTime();
Wikitty result = null;
if (id != null) {
- result = wikittyService.restore(securityToken, id);
+ result = restore(Collections.singletonList(id)).get(0);
}
-
+
timeLog.log(start, "restore");
- return result;
- }
-
- /**
- * Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
- * @param <E> object type
- * @param clazz entity class
- * @param id entity id
- * @return wikitty entity with specified id or {@code null} if entity can't be found
- */
- public <E extends BusinessEntity> E restore(Class<E> clazz, String id) {
- E result = restore(clazz, id, false);
return result;
}
/**
- * Restore wikitty entity with specified id or {@code null} if entity can't be be found.
- *
- * @param id entity ids if null return is empty list
- * @return wikitty entity with specified id or {@code null} if entity can't be found
- */
- public List<Wikitty> restore(List<String> id) {
- long start = TimeLog.getTime();
-
- List<Wikitty> result;
- if (id == null) {
- result = new ArrayList<Wikitty>();
- } else {
- result = wikittyService.restore(securityToken, id);
- }
-
- timeLog.log(start, "restoreWikitty<list>");
- return result;
- }
-
- /**
* Restore wikitty entity with specified id or {@code null} if entity
* can't be be found, or checkExtension is true and wikitty don't match
* extension wanted.
@@ -406,6 +354,40 @@
return result;
}
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id) {
+ E result = restore(clazz, id, false);
+ return result;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @param checkExtension if true check that Wikitty result has all extension
+ * declared in clazz
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
+ long start = TimeLog.getTime();
+ E result = null;
+ if (id != null) {
+ result = restore(clazz, Collections.singletonList(id), checkExtension).get(0);
+ }
+
+ timeLog.log(start, "restore<Business>");
+ return result;
+ }
+
public <E extends BusinessEntity> List<E> restore(Class<E> clazz, List<String> id) {
List<E> result = restore(clazz, id, false);
return result;
@@ -417,7 +399,7 @@
list = new ArrayList<String>(id);
}
List<Wikitty> resultList = restore(list);
- Set<Wikitty> result = new HashSet<Wikitty>(resultList);
+ Set<Wikitty> result = new LinkedHashSet<Wikitty>(resultList);
return result;
}
@@ -432,10 +414,16 @@
list = new ArrayList<String>(id);
}
List<E> resultList = restore(clazz, list, checkExtension);
- Set<E> result = new HashSet<E>(resultList);
+ Set<E> result = new LinkedHashSet<E>(resultList);
return result;
}
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // DETELE
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
public void delete(String id) {
long start = TimeLog.getTime();
wikittyService.delete(securityToken, id);
@@ -477,6 +465,12 @@
timeLog.log(start, "delete<list<BusinessEntity>>");
}
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND (ALL) BY EXEMPLE <E>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
/**
* Null field are not used in search request.
*
@@ -494,7 +488,7 @@
.setFirst(first).setLimit(limit)
.setFacetField(fieldFacet);
- WikittyQueryResult<String> queryResult = findAllIdByQuery(query);
+ WikittyQueryResult<String> queryResult = findAllByQuery(query);
WikittyQueryResult<E> result = (WikittyQueryResult<E>)castTo(
e.getClass(), queryResult);
@@ -512,7 +506,7 @@
long start = TimeLog.getTime();
WikittyQuery query = new WikittyQueryMaker().wikitty(e).end();
- String id = findIdByQuery(query);
+ String id = findByQuery(query);
E result = (E)restore(e.getClass(), id);
timeLog.log(start, "findByExample");
@@ -521,112 +515,171 @@
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL BY CRITERIA <E>
+ // FIND ALL BY QUERY <E>
//
///////////////////////////////////////////////////////////////////////////
/**
+ * Cette method doit etre l'unique methode finalement utilise par toutes
+ * les methodes find avec un cast vers clazz
+ *
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If one criteria is null, find all extensions
- * for this criteria else if criteria is empty return nothing.
- *
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
+ *
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
- * @param criterias criterias
+ * @param queries criterias
+ * @param limitToFirst if true limit result to first result (first = 0, limit = 1)
* @return paged result
*/
- public <E extends BusinessEntity> List<WikittyQueryResult<E>> findAllByQuery(
- Class<E> clazz, List<WikittyQuery> criterias) {
+ protected <E> List<WikittyQueryResult<E>> findAllByQuery(
+ Class<E> clazz, List<WikittyQuery> queries, boolean limitToFirst) {
long start = TimeLog.getTime();
List<WikittyQueryResult<E>> result = null;
- if (criterias != null) {
- // newInstance only return BusinessEntityWikittyImpl
- BusinessEntityImpl sample =
- (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
+ List<WikittyQuery> serviceQueries;
+ if (queries != null) {
+ if (clazz.isAssignableFrom(BusinessEntity.class)) {
+ // on demande un business entity donc on modifie
+ // pas les criteres pour ajouter les contraintes sur les
+ // extensions
- Wikitty wikitty = sample.getWikitty();
- Collection<String> extensions = wikitty.getExtensionNames();
+ // newInstance only return BusinessEntityWikittyImpl
+ BusinessEntityImpl sample =
+ (BusinessEntityImpl) WikittyUtil.newInstance((Class<BusinessEntity>)clazz);
- List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
- for (WikittyQuery criteria : criterias) {
+ Wikitty wikitty = sample.getWikitty();
+ Collection<String> extensions = wikitty.getExtensionNames();
- // on ajoute la condition sur les extensions dans le critere
- // du coup, pour ne pas modifier le critere qui vient en parametre
- // il faut creer un nouveau critere ...
- WikittyQuery serviceCriteria = null;
- if (criteria != null) {
- serviceCriteria = criteria.copy();
+ serviceQueries = new ArrayList<WikittyQuery>(queries.size());
+ for (WikittyQuery criteria : queries) {
- // Dont add contraint if using select
- if (StringUtils.isEmpty(criteria.getSelect())) {
+ // on ajoute la condition sur les extensions dans le critere
+ // du coup, pour ne pas modifier le critere qui vient en parametre
+ // il faut creer un nouveau critere ...
+ WikittyQuery serviceQuery = null;
+ if (criteria != null) {
+ serviceQuery = criteria.copy();
+ WikittyQueryMaker queryMaker;
+ if (serviceQuery.getCondition() instanceof Select) {
+ // si la condition commence par un select
+ // alors il faut modifier la condition du select
+ Select select = (Select)serviceQuery.getCondition();
+ queryMaker = new WikittyQueryMaker()
+ .select(select.getElement())
+ .and().condition(select.getSubCondition())
+ .extContainsAll(extensions);
+ } else {
+ // sinon on modifie directement la condition
+ queryMaker = new WikittyQueryMaker()
+ .and().condition(serviceQuery.getCondition())
+ .extContainsAll(extensions);
+ }
// utilisation de cette nouvelle contrainte sur le nouvel objet
- // creation de la nouvelle contrainte
- WikittyQueryMaker queryMaker = new WikittyQueryMaker()
- .and().condition(serviceCriteria.getCondition())
- .extContainsAll(extensions);
-
- serviceCriteria.setCondition(queryMaker.getCondition());
+ serviceQuery.setCondition(queryMaker.getCondition());
}
+
+ // ajout de ce criteria dans la liste de tous les criteres
+ serviceQueries.add(serviceQuery);
}
+ } else {
+ // on ne demande pas un business entity donc on ne modifie
+ // pas les criteres
+ serviceQueries = queries;
+ }
- // ajout de ce criteria dans la liste de tous les criteres
- serviceCriterias.add(serviceCriteria);
+ if (limitToFirst) {
+ for (WikittyQuery query : serviceQueries) {
+ query.setFirst(0);
+ query.setLimit(1);
+ // lorsqu'on limit au premier, c'est qu'on utilise la methode
+ // pour retourne seulement un objet et pas un WikittyQueryResult
+ // on n'a donc pas a calculer les facets
+ query.setFacetExtension(false);
+ query.setFacetField();
+ query.setFacetQuery();
+ }
}
List<WikittyQueryResult<String>> pagedResult = wikittyService.findAllByQuery(
- securityToken, serviceCriterias);
+ securityToken, serviceQueries);
- // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
- // in one call to service. Currently each PagedResult.cast do a call
result = new ArrayList<WikittyQueryResult<E>>(pagedResult.size());
for (WikittyQueryResult<String> p : pagedResult) {
- result.add((WikittyQueryResult<E>)castTo(sample.getClass(), p));
+ result.add((WikittyQueryResult<E>)castTo(clazz, p));
}
}
- timeLog.log(start, "findAllByCriteria<Business>(List)");
+ timeLog.log(start, "findAllByQuery<E>(List, limitToFirst)");
return result;
}
/**
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If criteria is null, find all extensions
- * else if criteria is empty return nothing.
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
*
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
+ * @param criterias criterias
+ * @return paged result
+ */
+ public <E> List<WikittyQueryResult<E>> findAllByQuery(
+ Class<E> clazz, List<WikittyQuery> criterias) {
+ long start = TimeLog.getTime();
+ List<WikittyQueryResult<E>> result = findAllByQuery(clazz, criterias, false);
+ timeLog.log(start, "findAllByQuery<E>(List)");
+ return result;
+ }
+
+ /**
+ * Search object that correspond to criteria and that have all extension
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
+ *
+ * @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
+ * @param clazz entity class
* @param criteria criteria
* @return paged result
*/
- public <E extends BusinessEntity> WikittyQueryResult<E> findAllByCriteria(
+ public <E> WikittyQueryResult<E> findAllByQuery(
Class<E> clazz, WikittyQuery criteria) {
long start = TimeLog.getTime();
WikittyQueryResult<E> result = findAllByQuery(clazz,
- Collections.singletonList(criteria)).get(0);
- timeLog.log(start, "findAllByCriteria<Business>(One)");
+ Collections.singletonList(criteria), false).get(0);
+ timeLog.log(start, "findAllByQuery<E>(One)");
return result;
}
/**
+ /**
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If criteria is null, find all extensions
- * else if criteria is empty return nothing.
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
*
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
* @param c1 criteria 1
* @param c2 criteria 2
* @param otherCriteria otherCriteria
* @return paged result
*/
- public <E extends BusinessEntity> WikittyQueryResult<E>[] findAllByQuery(
+ public <E> WikittyQueryResult<E>[] findAllByQuery(
Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<E>> resultList = findAllByQuery(clazz, criterias);
+ List<WikittyQueryResult<E>> resultList = findAllByQuery(clazz, criterias, false);
WikittyQueryResult<E>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
timeLog.log(start, "findAllByCriteria<Business>(Varargs)");
return result;
@@ -634,81 +687,81 @@
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL BY CRITERIA <Wikitty>
+ // FIND BY CRITERIA <E>
//
///////////////////////////////////////////////////////////////////////////
- public List<WikittyQueryResult<Wikitty>> findAllByQuery(List<WikittyQuery> criteria) {
+ public <E> List<E> findByQuery(Class<E> clazz, List<WikittyQuery> criterias) {
long start = TimeLog.getTime();
- List<WikittyQueryResult<Wikitty>> result = null;
- if (criteria != null) {
- List<WikittyQueryResult<String>> resultId =
- wikittyService.findAllByQuery(securityToken, criteria);
- // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
- // in one call to service. Currently each PagedResult.cast do a call
- result = new ArrayList<WikittyQueryResult<Wikitty>>(resultId.size());
- for (WikittyQueryResult<String> p : resultId) {
- result.add(castTo(Wikitty.class, p));
+ List<WikittyQueryResult<E>> queryResult =
+ findAllByQuery(clazz, criterias, true);
+ List<E> result = new ArrayList<E>(queryResult.size());
+ for (WikittyQueryResult<E> r : queryResult) {
+ if (r.size() > 0) {
+ result.add(r.peek());
+ } else {
+ result.add(null);
}
}
- timeLog.log(start, "findAllByCriteria(List)");
- return result;
+
+ timeLog.log(start, "multiFindByCriteria<E>(List>");
+ return result;
}
- public WikittyQueryResult<Wikitty> findAllByQuery(WikittyQuery criteria) {
+ public <E> E findByQuery(Class<E> clazz, WikittyQuery criteria) {
long start = TimeLog.getTime();
- WikittyQueryResult<Wikitty> result = null;
+ E result = null;
if (criteria != null) {
- result = findAllByQuery(Collections.singletonList(criteria)).get(0);
+ result = findByQuery(clazz, Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findAllByCriteria(One)");
- return result;
+ timeLog.log(start, "findByQuery<E>(One)");
+ return result;
}
- public WikittyQueryResult<Wikitty>[] findAllByQuery(
- WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
+ public <E> E[] findByQuery(
+ Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<Wikitty>> resultList = findAllByQuery(criterias);
- WikittyQueryResult<Wikitty>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
+ List<E> resultList = findByQuery(clazz, criterias);
+ E[] result = resultList.toArray((E[])Array.newInstance(clazz, resultList.size()));
- timeLog.log(start, "findAllByCriteria(Varargs)");
- return result;
+ timeLog.log(start, "findByCriteria<E>(Varargs)");
+ return result;
}
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL ID BY CRITERIA <String>
+ // FIND ALL FIELD OR ID BY CRITERIA <String>
//
///////////////////////////////////////////////////////////////////////////
- public List<WikittyQueryResult<String>> findAllIdByQuery(List<WikittyQuery> criteria) {
+ public List<WikittyQueryResult<String>> findAllByQuery(List<WikittyQuery> criteria) {
long start = TimeLog.getTime();
List<WikittyQueryResult<String>> result = null;
if (criteria != null) {
result = wikittyService.findAllByQuery(securityToken, criteria);
}
- timeLog.log(start, "findAllIdByCriteria(List)");
- return result;
+ timeLog.log(start, "findAllByCriteria(List)");
+ return result;
}
- public WikittyQueryResult<String> findAllIdByQuery(WikittyQuery criteria) {
+ public WikittyQueryResult<String> findAllByQuery(WikittyQuery criteria) {
long start = TimeLog.getTime();
WikittyQueryResult<String> result = null;
if (criteria != null) {
- result = findAllIdByQuery(
+ result = findAllByQuery(
Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findAllIdByCriteria(One)");
+ timeLog.log(start, "findAllByCriteria(One)");
return result;
}
- public WikittyQueryResult<String>[] findAllIdByQuery(
+ public WikittyQueryResult<String>[] findAllByQuery(
WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
long start = TimeLog.getTime();
@@ -716,10 +769,10 @@
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<String>> resultList = findAllIdByQuery(criterias);
+ List<WikittyQueryResult<String>> resultList = findAllByQuery(criterias);
WikittyQueryResult<String>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
- timeLog.log(start, "findAllIdByCriteria(Varargs)");
+ timeLog.log(start, "findAllByCriteria(Varargs)");
return result;
}
@@ -729,27 +782,27 @@
//
///////////////////////////////////////////////////////////////////////////
- public List<String> findIdByQuery(List<WikittyQuery> criteria) {
+ public List<String> findByQuery(List<WikittyQuery> criteria) {
long start = TimeLog.getTime();
List<String> result = null;
if (criteria != null) {
result = wikittyService.findByQuery(securityToken, criteria);
}
- timeLog.log(start, "findIdByCriteria(List)");
+ timeLog.log(start, "findByCriteria(List)");
return result;
}
- public String findIdByQuery(WikittyQuery criteria) {
+ public String findByQuery(WikittyQuery criteria) {
long start = TimeLog.getTime();
String result = null;
if (criteria != null) {
- result = findIdByQuery(Collections.singletonList(criteria)).get(0);
+ result = findByQuery(Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findIdByCriteria(One)");
+ timeLog.log(start, "findByCriteria(One)");
return result;
}
- public String[] findIdByQuery(
+ public String[] findByQuery(
WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
@@ -757,121 +810,15 @@
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<String> resultList = findIdByQuery(criterias);
+ List<String> resultList = findByQuery(criterias);
String[] result = resultList.toArray(new String[criterias.size()]);
- timeLog.log(start, "findIdByCriteria(Varargs)");
- return result;
- }
-
- ///////////////////////////////////////////////////////////////////////////
- //
- // FIND BY CRITERIA <E>
- //
- ///////////////////////////////////////////////////////////////////////////
-
- public <E extends BusinessEntity> List<E> findByQuery(
- Class<E> clazz, List<WikittyQuery> criterias) {
- long start = TimeLog.getTime();
- List<E> result = null;
- if (criterias != null) {
- BusinessEntityImpl sample =
- (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
-
- Wikitty wikitty = sample.getWikitty();
- Collection<String> extensions = wikitty.getExtensionNames();
- List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
- for (WikittyQuery criteria : criterias) {
- // on a pas besoin de recuperer les limits du query puisqu'on en
- // veut qu'un et donc qu'on ne retourne pas de WikittyQueryResult
- // donc on ne fait pas une copie, on en cree un nouveau directement
- // a partir de la condition
- WikittyQuery q = new WikittyQueryMaker()
- .and().condition(criteria.getCondition())
- .extContainsAll(extensions).end();
- serviceCriterias.add(q);
- }
-
- List<String> id = findIdByQuery(serviceCriterias);
- result = restore(clazz, id);
- }
- timeLog.log(start, "multiFindByCriteria<Business>(List>");
+ timeLog.log(start, "findByCriteria(Varargs)");
return result;
}
- public <E extends BusinessEntity> E findByQuery(
- Class<E> clazz, WikittyQuery criteria) {
- long start = TimeLog.getTime();
- E result = null;
- if (criteria != null) {
- List<E> criterias = findByQuery(clazz, Collections.singletonList(criteria));
- if (!criterias.isEmpty()) {
- result = criterias.get(0);
- }
- }
- timeLog.log(start, "findByCriteria<Business>(One)");
- return result;
- }
-
- public <E extends BusinessEntity> E[] findByQuery(
- Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
- long start = TimeLog.getTime();
-
- List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
- Collections.addAll(criterias, c1, c2);
- Collections.addAll(criterias, otherCriteria);
-
- List<E> resultList = findByQuery(clazz, criterias);
- E[] result = resultList.toArray((E[])Array.newInstance(clazz, resultList.size()));
-
- timeLog.log(start, "findByCriteria<Business>(Varargs)");
- return result;
- }
-
///////////////////////////////////////////////////////////////////////////
//
- // FIND BY CRITERIA <Wikitty>
- //
- ///////////////////////////////////////////////////////////////////////////
-
- public List<Wikitty> findByQuery(List<WikittyQuery> criteria) {
- long start = TimeLog.getTime();
- List<Wikitty> result = null;
- if (criteria != null) {
- List<String> id = findIdByQuery(criteria);
- result = restore(id);
- }
- timeLog.log(start, "findByCriteria(List)");
- return result;
- }
-
- public Wikitty findByQuery(WikittyQuery criteria) {
- long start = TimeLog.getTime();
- String id = findIdByQuery(criteria);
- Wikitty wikitty = restore(id);
- timeLog.log(start, "findByCriteria(One)");
- return wikitty;
- }
-
- public Wikitty[] findByQuery(
- WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
- long start = TimeLog.getTime();
-
- List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
- Collections.addAll(criterias, c1, c2);
- Collections.addAll(criterias, otherCriteria);
-
- List<String> resultList = findIdByQuery(criterias);
- List<Wikitty> wikitties = restore(resultList);
- Wikitty[] result = wikitties.toArray(new Wikitty[resultList.size()]);
-
- timeLog.log(start, "findByCriteria(Varargs)");
- return result;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////
- //
// FIND BY TREE NODE
//
///////////////////////////////////////////////////////////////////////////
@@ -1325,7 +1272,7 @@
.eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, groupName)
.end();
- Wikitty group = findByQuery(criteria);
+ Wikitty group = findByQuery(Wikitty.class, criteria);
if (group != null && user != null) {
result = WikittySecurityUtil.isMember(wikittyService, securityToken,
@@ -1361,7 +1308,7 @@
*
* @param queryResult result to convert
* @param target to cast into.
- * Can be Wikitty, BusinessEntity, String, Date, BigDecimal, Boolean, byte[]
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @return new WikittyQueryResult with element in right class or Exception
* if conversion is impossible
*/
@@ -1401,7 +1348,7 @@
// on commence par tout mettre en Wikitty, en utilisant le if du dessus
WikittyQueryResult<Wikitty> resultTmp = castTo(Wikitty.class, queryResult);
castedResult = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp.getAll());
- } else if (target.isAssignableFrom(BigDecimal.class)) {
+ } else if (target.isAssignableFrom(Number.class)) {
castedResult = new ArrayList<E>(queryResult.size());
for (Object o : queryResult) {
BigDecimal v = WikittyUtil.toBigDecimal(o);
@@ -1448,6 +1395,4 @@
return result;
}
-
-
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -42,12 +42,6 @@
/** query condition */
protected Condition condition;
- /**
- * Use to return select ids
- * Be carefull, can be long if many result is found
- */
- protected String select;
-
/** First index to get result. */
protected int first = 0;
/** Number of result to retrieve. 100 by default. */
@@ -114,7 +108,7 @@
result = ObjectUtils.equals(this.getName(), other.getName()) &&
ObjectUtils.equals(this.getFirst(), other.getFirst()) &&
ObjectUtils.equals(this.getLimit(), other.getLimit()) &&
- ObjectUtils.equals(this.getSelect(), other.getSelect()) &&
+ ObjectUtils.equals(this.isFacetExtension(), other.isFacetExtension()) &&
ObjectUtils.equals(this.getFacetField(), other.getFacetField()) &&
ObjectUtils.equals(this.getSortAscending(), other.getSortAscending()) &&
ObjectUtils.equals(this.getSortDescending(), other.getSortDescending()) &&
@@ -170,15 +164,6 @@
return this;
}
- public String getSelect() {
- return select;
- }
-
- public WikittyQuery setSelect(String select) {
- this.select = select;
- return this;
- }
-
public int getFirst() {
return first;
}
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 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -37,6 +37,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -850,10 +851,29 @@
}
/**
+ * Add {@link Select}, this condition must be first or
+ * @param element le champs dont il faut extraire les donnees
+ * @return {@code this}
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(String element) {
+ return select(new ElementField(element));
+ }
+
+ /*
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(ElementField element) {
+ Condition child = new Select(element);
+ addOnStack(child);
+ 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 sub query
+ * @return {@code this}
* @see {@link In}
*/
public WikittyQueryMaker in(String foreignFieldName) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -30,6 +30,7 @@
import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.parboiled.BaseParser;
@@ -65,6 +66,8 @@
public static final String FALSE = "FALSE";
public static final String ID = "id";
+ public static final String SELECT = "SELECT";
+ public static final String WHERE = "WHERE";
public static final String IN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
@@ -181,15 +184,14 @@
Rule Parens() {
return Sequence(space(), BRACKET_OPEN, space(), or(), space(), BRACKET_CLOSE, space());
- // FIXME
}
Rule condition() {
return FirstOf(
- not(), isNull(), isNotNull(),
+ not(), isNull(), isNotNull(), select(),
eq(), neq(), less(), lesseq(), greater(), greatereq(), like(), notlike(),
between(), containsAll(), containsOne(),
- associated(), rTrue(), rFalse(), keyword()
+ in(), rTrue(), rFalse(), keyword()
);
}
@@ -278,10 +280,14 @@
value(), elems.get().add(removeQuote(match())), space()), CURLY_BRACKET_CLOSE,
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
- Rule associated() {
+ Rule in() {
return Sequence(field(), push(match()), space(), IN, space(), term(),
- push(new In(toElement(pop().toString()), (Condition)pop())));
+ push(new In(toElement(pop(1).toString()), (Condition)pop())));
}
+ Rule select() {
+ return Sequence(SELECT, space(), field(), push(match()), space(), WHERE, space(), term(),
+ push(new Select(new ElementField(pop(1).toString()), (Condition)pop())));
+ }
Rule keyword() {
return Sequence(value(), push(new Keyword(removeQuote(match()))));
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -22,6 +22,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -126,6 +127,25 @@
* @param o
* @return True if we want visit sub-element, otherwize false
*/
+ /**
+ * True if we want visit sub-element, otherwize false
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
+ abstract public boolean visitEnter(Select o);
+ /**
+ * Leave method is alway called, but evaluation of enter is passed in
+ * arguement
+ *
+ * @param o
+ * @param enterOrMiddleResult result returned by visitEnter method
+ */
+ abstract public void visitLeave(Select o, boolean enterOrMiddleResult);
+ /**
+ * True if we want visit sub-element, otherwize false
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
abstract public boolean visitEnter(Not o);
/**
* Leave method is alway called, but evaluation of enter is passed in
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -23,6 +23,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -71,7 +72,6 @@
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
q.setName(o.getName());
- q.setSelect(o.getSelect());
q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
@@ -121,6 +121,17 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ getQueryMaker().select(o.getElement());
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
public boolean visitEnter(In o) {
getQueryMaker().in(o.getElement());
return true;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -20,6 +20,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -89,6 +90,18 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ text += WikittyQueryParser.SELECT + o.getElement().getValue()
+ + WikittyQueryParser.WHERE + WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
public boolean visitEnter(In o) {
text += o.getElement().getValue() + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN;
return true;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -1,6 +1,9 @@
package org.nuiton.wikitty.query.conditions;
import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.commons.lang.ClassUtils;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.WikittyQueryVisitor;
import org.nuiton.wikitty.query.WikittyQueryVisitorToString;
@@ -29,13 +32,57 @@
}
/**
+ * Retourne la liste des conditions qui ne peuvent pas etre ajoutee
+ * a cette condition.
+ * Lorsqu'on implante un fils il est preferable de faire une nouvelle
+ * collection dans lequel on ajout ou on retire des elements
+ * <pre>
+ * return new Set(super.rejectedCondition).add/remove(condition.class)
+ * </pre>
+ * car certain regle sont mises pour toutes
+ * les conditions comme l'interdiction d'ajouter un Select.
+ *
+ * @param c
+ */
+ public Set<Class<? extends Condition>> rejectedCondition() {
+ Set<Class<? extends Condition>> result = new HashSet<Class<? extends Condition>>();
+ result.add(Select.class);
+ return result;
+ }
+
+ public void checkAddCondition(Condition c) {
+ Class clazz = null;
+ if (c != null) {
+ clazz = c.getClass();
+ }
+
+ Set<?> rejected = rejectedCondition();
+ if (rejected == null) {
+ // tout est rejete
+ throw new WikittyException(String.format(
+ "Add condition is not allowed in this condition type '%s'",
+ getClass().getSimpleName()));
+ } else if (rejected.contains(clazz)) {
+ throw new WikittyException(String.format(
+ "Add condition '%s' is not allowed in this condition type '%s'",
+ ClassUtils.getShortCanonicalName(c, "null"),
+ getClass().getSimpleName()));
+ }
+ }
+
+ /**
* For non terminal condition this method add subCondition.
* For terminal this method must return an exception
+ *
+ * When you overriden this method, you must call {@link #checkAddCondition}
+ * in first
*
* @param c
*/
public void addCondition(Condition c) {
- throw new WikittyException("Add condition is not allowed in this condition type");
+ throw new WikittyException(String.format(
+ "Add condition is not allowed in this condition type '%s'",
+ getClass().getSimpleName()));
}
public void accept(WikittyQueryVisitor visitor) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -80,7 +80,10 @@
@Override
public void addCondition(Condition c) {
- getConditions().add(c);
+ if (c != null) {
+ checkAddCondition(c);
+ getConditions().add(c);
+ }
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -32,10 +32,13 @@
@Override
public void addCondition(Condition c) {
+ checkAddCondition(c);
if (subCondition == null) {
this.subCondition = c;
} else {
- throw new WikittyException("ConditionUnary ("+getClass().getSimpleName()+") can't have more than one condition");
+ throw new WikittyException(String.format(
+ "ConditionUnary (%s) can't have more than one condition",
+ getClass().getSimpleName()));
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -1,5 +1,7 @@
package org.nuiton.wikitty.query.conditions;
+import java.util.HashSet;
+import java.util.Set;
import org.apache.commons.lang.ObjectUtils;
/**
@@ -32,7 +34,20 @@
super(restriction);
this.element = element;
}
-
+
+ /**
+ * Le In autorise le Select
+ * @return
+ */
+ @Override
+ public Set<Class<? extends Condition>> rejectedCondition() {
+ Set<Class<? extends Condition>> result =
+ new HashSet<Class<? extends Condition>>(super.rejectedCondition());
+ // le in autorise le Select
+ result.remove(Select.class);
+ return result;
+ }
+
public Element getElement() {
return element;
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -0,0 +1,54 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Cette condition n'accept pas d'etre utilise dans une autre condition.
+ * Il sert a demander l'extraction d'un autre champs que l'id. Si la valeur
+ * du champs est retrouvee plusieurs fois, cette valeur n'apparaitra qu'une
+ * seule fois dans les resultats (comme 'DISTINCT' en SQL)
+ * <p>
+ * Il y a donc deux types d'utilisation possible
+ *
+ * <pre>
+ * SELECT extName.fieldName WHERE condition
+ * condition ... IN (SELECT extName.fieldName WHERE other condition)
+ * </pre>
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Select extends ConditionUnary {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ElementField element;
+
+ public Select(ElementField element) {
+ this.element = element;
+ }
+
+ public Select(ElementField element, Condition restriction) {
+ super(restriction);
+ this.element = element;
+ }
+
+ public ElementField getElement() {
+ return element;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ boolean result = super.equalsDeep(other);
+ if (result) {
+ In op = (In)other;
+ result = ObjectUtils.equals(this.getElement(), op.getElement());
+ }
+ return result;
+ }
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -79,7 +79,10 @@
public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
/**
- * Find all wikitties that satisfy queries constraint
+ * Find all values that satisfy queries constraint. Values is Wikitty's id
+ * if there is no Select condition, otherwize is String that represent
+ * field value and can be String representation of
+ * Wikitty, Date, Boolean, Numeric, Binary, String
*
* @param transaction
* @param queries
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -60,12 +60,12 @@
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
import org.nuiton.wikitty.query.conditions.Like;
import org.nuiton.wikitty.query.conditions.NotEquals;
import org.nuiton.wikitty.query.conditions.NotNull;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
@@ -756,13 +756,24 @@
}
@Override
- public boolean visitEnter(Join o) {
+ public boolean visitEnter(Select o) {
+ // do nothing
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ // do nothing
+ }
+
+ @Override
+ public boolean visitEnter(org.nuiton.wikitty.query.conditions.In o) {
boolean evalResult = false;
String fqfieldName = o.getElement().getValue();
-// Object fieldValue = w.getFqField(fqfieldName);
- // il faut que le champs exist et que la valeur soit un String (pas null)
- if (w.hasField(fqfieldName) && (w.getFieldType(fqfieldName).getType() == TYPE.WIKITTY)) {
+ // il faut que le champs exist, mais tout type de champs convient
+ // maintenant qu'il est possible de faire un select
+ if (w.hasField(fqfieldName)) {
//Get sub-restriction
Condition sub = o.getSubCondition();
@@ -777,7 +788,6 @@
//Check that my field is contained in the sub-restriction results.
evalResult = check(ContainsOnePredicate, o.getElement(), associatedList);
-// associatedList.contains(String.valueOf(fieldValue));
}
evalStack.push(evalResult);
@@ -787,7 +797,7 @@
}
@Override
- public void visitLeave(Join o, boolean enterOrMiddleResult) {
+ public void visitLeave(org.nuiton.wikitty.query.conditions.In o, boolean enterOrMiddleResult) {
// nothing to do
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -132,7 +132,7 @@
{ // test join
WikittyQuery q = new WikittyQueryMaker()
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
.eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
@@ -146,7 +146,8 @@
WikittyQuery q = new WikittyQueryMaker()
.or()
.ideq(g2.getWikittyId())
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS).eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
// g1, g2, g3 doivent etre retrouve (g2 via ideq, et g1, g3 via le join)
@@ -159,7 +160,8 @@
WikittyQuery q = new WikittyQueryMaker()
.and()
.not().ideq(g1.getWikittyId()).close()
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS).eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
// g3 doit etre retrouve via le join, et g1 est exclue via la not(ideq)
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -27,6 +27,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.nuiton.wikitty.services.WikittyTransaction;
@@ -128,6 +129,18 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ // nothing to do
+ // select is done in WikittySearchEngineSolr method
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ // nothing to do
+ }
+
+ @Override
public boolean visitEnter(In o) {
WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -66,6 +66,7 @@
import org.nuiton.util.TimeLog;
import org.nuiton.wikitty.WikittyConfigOption;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.query.FacetQuery;
import org.nuiton.wikitty.query.FacetTopic;
@@ -74,6 +75,7 @@
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -657,162 +659,181 @@
@Override
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
try {
- // Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
- transaction, this, elementModifier);
- query.getCondition().accept(v);
- String queryString = v.getSolrQuery();
- SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+ WikittyQueryResult<String> result;
- // Add paged
- int first = query.getFirst();
- int limit = query.getLimit();
+ if (query.getCondition() instanceof Select) {
+ // gere les conditions qui commence par select
+ // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
+ // car le select est execute via une facette, mais cette facette
+ // n'a pas les meme limites que les autres facette
- if (limit == Integer.MAX_VALUE) {
- // WARNING It is necessary to substract 'start' otherwise,
- // there is a capacity overlow in solR
- limit = Integer.MAX_VALUE - first;
- }
- querySolr.setStart(first);
- querySolr.setRows(limit);
+ Select select = (Select)query.getCondition();
+ String extName = WikittyExtension.extractExtensionName(
+ select.getElement().getValue());
+ WikittyQueryMaker newCond = new WikittyQueryMaker()
+ .and()
+ .exteq(extName)
+ .condition(select.getSubCondition());
- // Add sorting
- List<ElementField> sortAscending = query.getSortAscending();
- if(sortAscending != null) {
- for (ElementField sort : sortAscending) {
- String tranform = elementModifier.convertToSolr(transaction, sort);
- tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
- }
- }
-
- List<ElementField> sortDescending = query.getSortDescending();
- if(sortDescending != null) {
- for (ElementField sort : sortDescending) {
- String tranform = elementModifier.convertToSolr(transaction, sort);
- tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
- }
- }
+ // copy de la query pour les facettes
+ WikittyQuery queryFacet = query.copy();
+ queryFacet.setCondition(newCond.getCondition());
+ queryFacet.setLimit(0);
- // task : #1785 Add select method to allow specify wikittyId return field
- // If select is not empty, add facet on field
- String select = query.getSelect();
- boolean hasSelect = StringUtils.isNotEmpty(select);
- if (hasSelect) {
+ // copy de la query pour le select
+ // on part de facet qui a deja la bonne condition
+ WikittyQuery querySelect = queryFacet.copy();
+ querySelect.setLimit(0);
+ querySelect.setFacetMinCount(0);
+ querySelect.setFacetLimit(Integer.MAX_VALUE);
+ querySelect.setFacetQuery();
+ querySelect.setFacetField(select.getElement());
- // Limit on wikitty
- String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
- query.addFacetField(new ElementField(selectWikitty));
+ // execution des requetes
+ WikittyQueryResult<String> resultFacet = findAllByQuery(transaction, queryFacet);
+ WikittyQueryResult<String> resultSelect = findAllByQuery(transaction, querySelect);
- // We need no result, just facet
- query.setLimit(0);
- }
+ // creation des resultats via la facette select
+ List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
- // Add faceting
- boolean isFacetExtension = query.isFacetExtension();
- List<ElementField> facetField = query.getFacetField();
- List<FacetQuery> facetQuery = query.getFacetQuery();
+ List<String> selectList = new ArrayList<String>(
+ Math.min(topics.size(), query.getLimit()));
+ if (query.getFirst() < topics.size()) {
+ int first = query.getFirst();
+ int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
+ for (FacetTopic topic : topics.subList(first, last)) {
+ selectList.add(topic.getTopicName());
+ }
+ }
- // use to map query string to criteria facet name
- Map<String, String> facetQueryToName = new HashMap<String, String>();
+ // fusion des resultats
+ result = new WikittyQueryResult<String>(
+ query.getName(),
+ query.getFirst(),
+ topics.size(),
+ resultSelect.getQueryString(),
+ resultFacet.getFacets(),
+ selectList);
+ } else {
- if (isFacetExtension
- || CollectionUtils.isNotEmpty(facetField)
- || CollectionUtils.isNotEmpty(facetQuery)) {
- querySolr.setFacet(true);
- querySolr.setFacetMinCount(query.getFacetMinCount());
- querySolr.setFacetLimit(query.getFacetLimit());
+ // Create querySolr
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
+ query.getCondition().accept(v);
+ String queryString = v.getSolrQuery();
+ SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
- if (isFacetExtension) {
- querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ // Add paged
+ int first = query.getFirst();
+ int limit = query.getLimit();
+
+ if (limit == Integer.MAX_VALUE) {
+ // WARNING It is necessary to substract 'start' otherwise,
+ // there is a capacity overlow in solR
+ limit = Integer.MAX_VALUE - first;
}
+ querySolr.setStart(first);
+ querySolr.setRows(limit);
- // field facetisation
- if (facetField != null) {
- for (ElementField fqfieldName : facetField) {
- String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
- querySolr.addFacetField(tranform);
+ // Add sorting
+ List<ElementField> sortAscending = query.getSortAscending();
+ if(sortAscending != null) {
+ for (ElementField sort : sortAscending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
- // query facetisation
- if (facetQuery != null) {
- for (FacetQuery facet : facetQuery) {
- v = new WikittyQueryVisitorToSolr(
- transaction, this, elementModifier);
- facet.getCondition().accept(v);
- String queryFacet = v.getSolrQuery();
- facetQueryToName.put(queryFacet, facet.getName());
- querySolr.addFacetQuery(queryFacet);
+ List<ElementField> sortDescending = query.getSortDescending();
+ if(sortDescending != null) {
+ for (ElementField sort : sortDescending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
}
}
- }
- QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
- SolrDocumentList solrResults = resp.getResults();
+ // Add faceting
+ boolean isFacetExtension = query.isFacetExtension();
+ List<ElementField> facetField = query.getFacetField();
+ List<FacetQuery> facetQuery = query.getFacetQuery();
- Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
+ // use to map query string to criteria facet name
+ Map<String, String> facetQueryToName = new HashMap<String, String>();
- // la facet sur les extensions est directement et convenablement
- // gere comme un champs
- if (CollectionUtils.isNotEmpty(facetField)) {
- for (FacetField facet : resp.getFacetFields()) {
- String facetName = elementModifier.convertToField(facet.getName());
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- if (facet.getValues() != null) {
- for (FacetField.Count value : facet.getValues()) {
- String topicName = value.getName();
- int topicCount = (int) value.getCount();
- FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
- topics.add(topic);
+ if (isFacetExtension
+ || CollectionUtils.isNotEmpty(facetField)
+ || CollectionUtils.isNotEmpty(facetQuery)) {
+ querySolr.setFacet(true);
+ querySolr.setFacetMinCount(query.getFacetMinCount());
+ querySolr.setFacetLimit(query.getFacetLimit());
+
+ if (isFacetExtension) {
+ querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ }
+
+ // field facetisation
+ if (facetField != null) {
+ for (ElementField fqfieldName : facetField) {
+ String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
+ querySolr.addFacetField(tranform);
}
}
- facets.put(facetName, topics);
- }
- }
- if (CollectionUtils.isNotEmpty(facetQuery)) {
- for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
- String facetName = facet.getKey();
- // don't use contains because, map can have key with null value
- if (null != facetQueryToName.get(facetName)) {
- facetName = facetQueryToName.get(facetName);
+ // query facetisation
+ if (facetQuery != null) {
+ for (FacetQuery facet : facetQuery) {
+ v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
+ facet.getCondition().accept(v);
+ String queryFacet = v.getSolrQuery();
+ facetQueryToName.put(queryFacet, facet.getName());
+ querySolr.addFacetQuery(queryFacet);
+ }
}
- Integer count = facet.getValue();
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- FacetTopic topic = new FacetTopic(facetName, facetName, count);
- topics.add(topic);
- facets.put(facetName, topics);
}
- }
- List<String> ids;
- int numFound;
- if (hasSelect) {
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
+ SolrDocumentList solrResults = resp.getResults();
- // Get select facet
- List<FacetTopic> facetTopics = facets.get(select);
+ Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
- // Remove this one
- facets.remove(select);
+ // la facet sur les extensions est directement et convenablement
+ // gere comme un champs
+ if (CollectionUtils.isNotEmpty(facetField)) {
+ for (FacetField facet : resp.getFacetFields()) {
+ String facetName = elementModifier.convertToField(facet.getName());
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ if (facet.getValues() != null) {
+ for (FacetField.Count value : facet.getValues()) {
+ String topicName = value.getName();
+ int topicCount = (int) value.getCount();
+ FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
+ topics.add(topic);
+ }
+ }
+ facets.put(facetName, topics);
+ }
+ }
- // Total found
- numFound = facetTopics.size();
-
- // Extract ids starting on firstIndex
- ids = new ArrayList<String>();
-
- // If all must be return, use limit
- for (int i = first;i <= limit && i < numFound; i++) {
- FacetTopic topic = facetTopics.get(i);
- ids.add(topic.getTopicName());
+ if (CollectionUtils.isNotEmpty(facetQuery)) {
+ for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
+ String facetName = facet.getKey();
+ // don't use contains because, map can have key with null value
+ if (null != facetQueryToName.get(facetName)) {
+ facetName = facetQueryToName.get(facetName);
+ }
+ Integer count = facet.getValue();
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ FacetTopic topic = new FacetTopic(facetName, facetName, count);
+ topics.add(topic);
+ facets.put(facetName, topics);
+ }
}
- } else {
-
// Extract ids
- ids = new ArrayList<String>(solrResults.size());
+ List<String> ids = new ArrayList<String>(solrResults.size());
for (SolrDocument doc : solrResults) {
String id = SolrUtil.getStringFieldValue(doc, SOLR_ID);
@@ -820,14 +841,14 @@
}
// Get total num found
- numFound = (int)resp.getResults().getNumFound();
- }
+ int numFound = (int)resp.getResults().getNumFound();
- // Build paged result
- WikittyQueryResult<String> result = new WikittyQueryResult<String>(
- query.getName(),
- first, numFound, queryString, facets, ids);
+ // Build paged result
+ result = new WikittyQueryResult<String>(
+ query.getName(),
+ first, numFound, queryString, facets, ids);
+ }
return result;
} catch (SolrServerException eee) {
throw new WikittyException(String.format(
Added: trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java
===================================================================
--- trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java (rev 0)
+++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -0,0 +1,97 @@
+package org.nuiton.wikitty.storage.solr;
+
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyClient;
+import org.nuiton.wikitty.WikittyConfig;
+import org.nuiton.wikitty.entities.WikittyGroup;
+import org.nuiton.wikitty.entities.WikittyGroupImpl;
+import org.nuiton.wikitty.entities.WikittyImpl;
+import org.nuiton.wikitty.entities.WikittyLabel;
+import org.nuiton.wikitty.entities.WikittyLabelImpl;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Element;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineSolrForQueryTest {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineSolrForQueryTest.class);
+
+ protected static WikittyServiceSolr ws;
+
+ protected static ApplicationConfig instance =
+ WikittyConfig.getConfig("wikitty-config-sample-inmemory.properties");
+
+ protected WikittyClient client = new WikittyClient(ws);
+
+ @Before
+ public void deleteAll() throws Exception {
+ ws.clear(null);
+ }
+
+ @BeforeClass
+ public static void initTests() throws Exception {
+
+ SolrTestHelper.initTests(instance);
+
+ ws = new WikittyServiceSolr(instance);
+ }
+
+ @Test
+ public void testSelect() throws Exception {
+ // for id for easy debugging
+ WikittyImpl w = new WikittyImpl("g1");
+ WikittyGroupImpl g1 = new WikittyGroupImpl(w);
+ g1.setName("Group1");
+ w = new WikittyImpl("g2");
+ WikittyGroupImpl g2 = new WikittyGroupImpl(w);
+ g2.setName("GROUP2");
+
+ w = new WikittyImpl("l1");
+ WikittyLabelImpl l1 = new WikittyLabelImpl(w);
+ l1.addLabels(g1.getName());
+
+ client.store(g1, g2, l1);
+
+ {
+ WikittyQuery query = new WikittyQueryMaker()
+ .select(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .end();
+
+ WikittyQueryResult<String> result = client.findAllByQuery(query);
+
+ System.out.println(result.getAll());
+ Assert.assertEquals(2, result.getTotalResult());
+ }
+
+ {
+ WikittyQuery query = new WikittyQueryMaker()
+ .and()
+ .exteq(WikittyGroup.EXT_WIKITTYGROUP)
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .select(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS)
+ .end();
+
+ WikittyQueryResult<String> result = client.findAllByQuery(query);
+
+ System.out.println(result.getAll());
+ Assert.assertEquals(1, result.getTotalResult());
+ }
+ }
+}
1
0
r1270 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:50:02 +0100 (Fri, 30 Dec 2011)
New Revision: 1270
Url: http://nuiton.org/repositories/revision/wikitty/1270
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- renomage de la condition Join en In
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
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 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -27,7 +27,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -138,7 +138,7 @@
}
/**
- * Ajout d'une condition non terminal (or, and, not, join)
+ * Ajout d'une condition non terminal (or, and, not, in)
* @param c
*/
protected void addOnStack(Condition c) {
@@ -186,7 +186,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 #join()}
+ * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #in()}
* @param c la condition a ajouter
* @return {@code this} with the {@code c} restriction added.
*/
@@ -850,27 +850,27 @@
}
/**
- * Add {@link Join} to allow search on association (like sql join).
+ * 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 sub query
- * @see {@link Join}
+ * @see {@link In}
*/
- public WikittyQueryMaker join(String foreignFieldName) {
- return join(new ElementField(foreignFieldName));
+ public WikittyQueryMaker in(String foreignFieldName) {
+ return in(new ElementField(foreignFieldName));
}
/*
- * @see {@link Join}
+ * @see {@link In}
*/
- public WikittyQueryMaker join(Element element) {
- Condition child = new Join(element);
+ public WikittyQueryMaker in(Element element) {
+ Condition child = new In(element);
addOnStack(child);
return this;
}
/**
- * Close last non terminal condition (or, and, not, join).
+ * Close last non terminal condition (or, and, not, in).
* <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
* @return
*/
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -27,7 +27,7 @@
import org.nuiton.wikitty.query.conditions.Not;
import org.nuiton.wikitty.query.conditions.NotEquals;
import org.nuiton.wikitty.query.conditions.Or;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.True;
@@ -65,7 +65,7 @@
public static final String FALSE = "FALSE";
public static final String ID = "id";
- public static final String JOIN = "IN";
+ public static final String IN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
public static final String NULL = "NULL";
@@ -279,8 +279,8 @@
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
Rule associated() {
- return Sequence(field(), push(match()), space(), JOIN, space(), term(),
- push(new Join(toElement(pop().toString()), (Condition)pop())));
+ return Sequence(field(), push(match()), space(), IN, space(), term(),
+ push(new In(toElement(pop().toString()), (Condition)pop())));
}
Rule keyword() {
return Sequence(value(), push(new Keyword(removeQuote(match()))));
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -5,7 +5,7 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.conditions.And;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
@@ -112,7 +112,7 @@
* @param o
* @return True if we want visit sub-element, otherwize false
*/
- abstract public boolean visitEnter(Join o);
+ abstract public boolean visitEnter(In o);
/**
* Leave method is alway called, but evaluation of enter is passed in
* arguement
@@ -120,7 +120,7 @@
* @param o
* @param enterOrMiddleResult result returned by visitEnter method
*/
- abstract public void visitLeave(Join o, boolean enterOrMiddleResult);
+ abstract public void visitLeave(In o, boolean enterOrMiddleResult);
/**
* True if we want visit sub-element, otherwize false
* @param o
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -13,7 +13,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -121,13 +121,13 @@
}
@Override
- public boolean visitEnter(Join o) {
- getQueryMaker().join(o.getElement());
+ public boolean visitEnter(In o) {
+ getQueryMaker().in(o.getElement());
return true;
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
getQueryMaker().close();
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -3,7 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.query.conditions.And;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
@@ -89,13 +89,13 @@
}
@Override
- public boolean visitEnter(Join o) {
- text += o.getElement().getValue() + WikittyQueryParser.JOIN + WikittyQueryParser.BRACKET_OPEN;
+ public boolean visitEnter(In o) {
+ text += o.getElement().getValue() + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN;
return true;
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
text += WikittyQueryParser.BRACKET_CLOSE;
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -0,0 +1,51 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+
+/**
+ * In is used to join to Wikitty type.
+ *
+ * ex:
+ * <li> {@link WikittyQueryMaker}.in(myfield).eq(otherwikittyfield, "toto")
+ * is equivalent to
+ * <li> {@link WikittyQueryMaker}.containsOne(myfield, id1, id2, id3)
+ * where [id1, id2, id3] is id retrieved by query eq(otherwikittyfield, "toto")
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class In extends ConditionUnary {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+
+ public In(Element element) {
+ this.element = element;
+ }
+
+ public In(Element element, Condition restriction) {
+ super(restriction);
+ this.element = element;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ boolean result = super.equalsDeep(other);
+ if (result) {
+ In op = (In)other;
+ result = ObjectUtils.equals(this.getElement(), op.getElement());
+ }
+ return result;
+ }
+
+
+}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -17,7 +17,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -128,7 +128,7 @@
}
@Override
- public boolean visitEnter(Join o) {
+ public boolean visitEnter(In o) {
WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
@@ -144,7 +144,7 @@
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
// do nothing
}
1
0
r1269 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:43:37 +0100 (Fri, 30 Dec 2011)
New Revision: 1269
Url: http://nuiton.org/repositories/revision/wikitty/1269
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- Utilisation de constantes pour ElementId et ElementExtension dans Element
- Prise en compte des facets sur les extensions
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -68,7 +68,11 @@
protected List<FacetQuery> facetQuery;
/** Facet on field. */
protected List<ElementField> facetField;
- /** if true facet is done on extension name */
+ /**
+ * if true facet is done on extension name. Extention facet can be found
+ * in {@link WikittyQueryResult#getFacets()} with key
+ * {@link Element.EXTENSION.getValue()}
+ */
protected boolean facetExtension = false;
/** Sort ascending on fields. */
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 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -11,7 +11,6 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.entities.BusinessEntity;
import org.nuiton.wikitty.entities.BusinessEntityImpl;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
@@ -380,7 +379,7 @@
* @see {@link Equals}
*/
public WikittyQueryMaker exteq(String extensionName) {
- return eq(new ElementExtension(), extensionName);
+ return eq(Element.EXTENSION, extensionName);
}
/**
@@ -393,7 +392,7 @@
* @see {@link Equals}
*/
public WikittyQueryMaker ideq(Object idOrWikitty) {
- return eq(new ElementId(), idOrWikitty);
+ return eq(Element.ID, idOrWikitty);
}
/**
@@ -406,7 +405,7 @@
* @see {@link ContainsAll}
*/
public WikittyQueryMaker extContainsAll(Collection<String> extensionNames) {
- return containsAll(new ElementExtension(), extensionNames);
+ return containsAll(Element.EXTENSION, extensionNames);
}
/**
@@ -416,7 +415,7 @@
List<String> l = new LinkedList<String>();
l.add(ext1);
l.addAll(Arrays.asList(exts));
- return containsAll(new ElementExtension(), l);
+ return containsAll(Element.EXTENSION, l);
}
/**
@@ -454,7 +453,7 @@
* @see {@link NotEquals}
*/
public WikittyQueryMaker extneq(String extensionName) {
- return ne(new ElementExtension(), extensionName);
+ return ne(Element.EXTENSION, extensionName);
}
/**
@@ -467,7 +466,7 @@
* @see {@link NotEquals}
*/
public WikittyQueryMaker idneq(Object idOrWikitty) {
- return ne(new ElementId(), idOrWikitty);
+ return ne(Element.ID, idOrWikitty);
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -1,6 +1,5 @@
package org.nuiton.wikitty.query;
-import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -57,11 +56,16 @@
*/
@BuildParseTree
public class WikittyQueryParser extends BaseParser<Object> {
+ /**
+ * type de champs pour indique qu'on fait une condition sur le nom
+ * d'une extension. Ce champs est aussi utilise comme valeur pour
+ * {@link ElementExtension} et comme nom de facet pour les extensions
+ */
public static final String EXTENSION = "extension";
public static final String FALSE = "FALSE";
public static final String ID = "id";
- public static final String JOIN = "<-";
+ public static final String JOIN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
public static final String NULL = "NULL";
@@ -124,9 +128,9 @@
protected Element toElement(String v) {
Element result;
if (ID.equals(v)) {
- result = new ElementId();
+ result = Element.ID;
} else if (EXTENSION.equals(v)) {
- result = new ElementExtension();
+ result = Element.EXTENSION;
} else {
result = new ElementField(v);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -64,6 +64,7 @@
@Override
public boolean visitEnter(WikittyQuery o) {
WikittyQuery q = getQuery();
+ q.setFacetExtension(q.isFacetExtension());
q.setFacetField(new ArrayList<ElementField>(o.getFacetField()));
q.setFacetLimit(o.getFacetLimit());
q.setFacetMinCount(o.getFacetMinCount());
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -2,6 +2,7 @@
import java.io.Serializable;
import org.apache.commons.lang.ObjectUtils;
+import org.nuiton.wikitty.WikittyUtil;
/**
* Class mere qui determine sur quoi porte une condition. Les classes filles
@@ -20,6 +21,11 @@
// serialVersionUID is used for serialization.
private static final long serialVersionUID = 1L;
+ public static final ElementId ID = new ElementId();
+ public static final ElementExtension EXTENSION = new ElementExtension();
+ public static final ElementField ALL_FIELD =
+ new ElementField("*" + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + "*");
+
protected String value;
public Element() {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -5,7 +5,8 @@
import org.nuiton.wikitty.query.WikittyQueryParser;
/**
- * Un element qui represente les extensions
+ * Un element qui represente les extensions, vous devez utiliser l'instance
+ * {@link Element#EXTENSION}
*
* @author poussin
* @version $Revision$
@@ -21,7 +22,7 @@
private static final long serialVersionUID = 1L;
- public ElementExtension() {
+ protected ElementExtension() {
super(WikittyQueryParser.EXTENSION);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -2,7 +2,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.wikitty.WikittyUtil;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
@@ -24,9 +23,6 @@
private static final long serialVersionUID = 1L;
- static final public ElementField ALL_FIELD =
- new ElementField("*" + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + "*");
-
public ElementField(String value) {
super(value);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -5,7 +5,8 @@
import org.nuiton.wikitty.query.WikittyQueryParser;
/**
- * Element qui represente l'Id
+ * Element qui represente l'Id, vous devez utiliser l'instance
+ * {@link Element#ID}
*
* @author poussin
* @version $Revision$
@@ -21,7 +22,7 @@
private static final long serialVersionUID = 1L;
- public ElementId() {
+ protected ElementId() {
super(WikittyQueryParser.ID);
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -183,7 +183,7 @@
+ "|(" + SUFFIX_SORTABLE + "$)"
, "");
if (SOLR_EXTENSIONS.equals(fieldName)) {
- fieldName = new ElementExtension().getValue();
+ fieldName = Element.EXTENSION.getValue();
}
return fieldName;
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -60,6 +60,7 @@
import org.nuiton.wikitty.services.WikittyTransaction;
import java.io.File;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.nuiton.util.ApplicationConfig;
import org.nuiton.util.TimeLog;
@@ -709,18 +710,24 @@
}
// Add faceting
+ boolean isFacetExtension = query.isFacetExtension();
List<ElementField> facetField = query.getFacetField();
List<FacetQuery> facetQuery = query.getFacetQuery();
// use to map query string to criteria facet name
Map<String, String> facetQueryToName = new HashMap<String, String>();
- if ((facetField != null && !facetField.isEmpty())
- || (facetQuery != null && !facetQuery.isEmpty())) {
+ if (isFacetExtension
+ || CollectionUtils.isNotEmpty(facetField)
+ || CollectionUtils.isNotEmpty(facetQuery)) {
querySolr.setFacet(true);
querySolr.setFacetMinCount(query.getFacetMinCount());
querySolr.setFacetLimit(query.getFacetLimit());
+ if (isFacetExtension) {
+ querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ }
+
// field facetisation
if (facetField != null) {
for (ElementField fqfieldName : facetField) {
@@ -746,7 +753,10 @@
SolrDocumentList solrResults = resp.getResults();
Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
- if (facetField != null && !facetField.isEmpty()) {
+
+ // la facet sur les extensions est directement et convenablement
+ // gere comme un champs
+ if (CollectionUtils.isNotEmpty(facetField)) {
for (FacetField facet : resp.getFacetFields()) {
String facetName = elementModifier.convertToField(facet.getName());
List<FacetTopic> topics = new ArrayList<FacetTopic>();
@@ -761,7 +771,8 @@
facets.put(facetName, topics);
}
}
- if (facetQuery != null && !facetQuery.isEmpty()) {
+
+ if (CollectionUtils.isNotEmpty(facetQuery)) {
for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
String facetName = facet.getKey();
// don't use contains because, map can have key with null value
1
0
r1268 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-generators/src/main/java/org/nuiton/wikitty/generator wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:12:58 +0100 (Fri, 30 Dec 2011)
New Revision: 1268
Url: http://nuiton.org/repositories/revision/wikitty/1268
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Generation dans les interfaces d'objet ElementField pour chaque champs
Utilisation du ElementField au lieu d'une String pour les sort et les facetField
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -38,6 +38,7 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+import org.nuiton.wikitty.query.conditions.ElementField;
/**
* Wikitty client is object used in client side to access WikittyService.
@@ -486,7 +487,7 @@
* @return
*/
public <E extends BusinessEntityImpl> WikittyQueryResult<E> findAllByExample(E e,
- int first, int limit, String ... fieldFacet ) {
+ int first, int limit, ElementField ... fieldFacet ) {
long start = TimeLog.getTime();
WikittyQuery query = new WikittyQueryMaker().wikitty(e).end()
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -8,6 +8,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ElementField;
/**
* Classe permettant de faire des recherches dans les données.
@@ -66,14 +67,14 @@
/** Facet on condition. */
protected List<FacetQuery> facetQuery;
/** Facet on field. */
- protected List<String> facetField;
+ protected List<ElementField> facetField;
/** if true facet is done on extension name */
protected boolean facetExtension = false;
/** Sort ascending on fields. */
- protected List<String> sortAscending;
+ protected List<ElementField> sortAscending;
/** Sort descending on fields. */
- protected List<String> sortDescending;
+ protected List<ElementField> sortDescending;
/** create anonymous query */
@@ -232,24 +233,24 @@
return this;
}
- public List<String> getFacetField() {
+ public List<ElementField> getFacetField() {
if (facetField == null) {
- facetField = new LinkedList<String>();
+ facetField = new LinkedList<ElementField>();
}
return facetField;
}
- public WikittyQuery addFacetField(String field) {
+ public WikittyQuery addFacetField(ElementField field) {
getFacetField().add(field);
return this;
}
- public WikittyQuery setFacetField(String ... facetField) {
- this.facetField = new LinkedList<String>(Arrays.asList(facetField));
+ public WikittyQuery setFacetField(ElementField ... facetField) {
+ this.facetField = new LinkedList<ElementField>(Arrays.asList(facetField));
return this;
}
- public WikittyQuery setFacetField(List<String> facetField) {
+ public WikittyQuery setFacetField(List<ElementField> facetField) {
this.facetField = facetField;
return this;
}
@@ -269,24 +270,24 @@
*
* @return field names
*/
- public List<String> getSortAscending() {
+ public List<ElementField> getSortAscending() {
if (sortAscending == null) {
- sortAscending = new LinkedList<String>();
+ sortAscending = new LinkedList<ElementField>();
}
return sortAscending;
}
- public WikittyQuery addSortAscending(String ... field) {
+ public WikittyQuery addSortAscending(ElementField ... field) {
getSortAscending().addAll(Arrays.asList(field));
return this;
}
- public WikittyQuery setSortAscending(String ... sortAscending) {
- this.sortAscending = new LinkedList<String>(Arrays.asList(sortAscending));
+ public WikittyQuery setSortAscending(ElementField ... sortAscending) {
+ this.sortAscending = new LinkedList<ElementField>(Arrays.asList(sortAscending));
return this;
}
- public WikittyQuery setSortAscending(List<String> sortAscending) {
+ public WikittyQuery setSortAscending(List<ElementField> sortAscending) {
this.sortAscending = sortAscending;
return this;
}
@@ -296,24 +297,24 @@
*
* @return field names
*/
- public List<String> getSortDescending() {
+ public List<ElementField> getSortDescending() {
if (sortDescending == null) {
- sortDescending = new LinkedList<String>();
+ sortDescending = new LinkedList<ElementField>();
}
return sortDescending;
}
- public WikittyQuery addSortDescending(String ... field) {
+ public WikittyQuery addSortDescending(ElementField ... field) {
getSortDescending().addAll(Arrays.asList(field));
return this;
}
- public WikittyQuery setSortDescending(String ... sortDescending) {
- this.sortDescending = new LinkedList<String>(Arrays.asList(sortDescending));
+ public WikittyQuery setSortDescending(ElementField ... sortDescending) {
+ this.sortDescending = new LinkedList<ElementField>(Arrays.asList(sortDescending));
return this;
}
- public WikittyQuery setSortDescending(List<String> sortDescending) {
+ public WikittyQuery setSortDescending(List<ElementField> sortDescending) {
this.sortDescending = sortDescending;
return this;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -8,6 +8,7 @@
import org.nuiton.wikitty.query.conditions.Condition;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -63,15 +64,15 @@
@Override
public boolean visitEnter(WikittyQuery o) {
WikittyQuery q = getQuery();
- q.setFacetField(new ArrayList<String>(o.getFacetField()));
+ q.setFacetField(new ArrayList<ElementField>(o.getFacetField()));
q.setFacetLimit(o.getFacetLimit());
q.setFacetMinCount(o.getFacetMinCount());
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
q.setName(o.getName());
q.setSelect(o.getSelect());
- q.setSortAscending(new ArrayList<String>(o.getSortAscending()));
- q.setSortDescending(new ArrayList<String>(o.getSortDescending()));
+ q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
+ q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
for (FacetQuery c : o.getFacetQuery()) {
WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy();
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -115,6 +115,7 @@
addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyExtension");
+ addImport(contract, "org.nuiton.wikitty.query.conditions.ElementField");
addImport(contract, "org.nuiton.wikitty.WikittyUtil");
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUser");
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUserAbstract");
@@ -202,7 +203,14 @@
"FQ_" + fieldVariableName,
"String",
extensionVariableName + " + \"." + name + "\"",
- ObjectModelModifier.PUBLIC);
+ ObjectModelModifier.PUBLIC);
+
+ // adding public static final String ELEMENT_FIELD_CLIENT_NAME = new ElementField(EXT_CLIENT + ".name");
+ addConstant(contract,
+ "ELEMENT_" + fieldVariableName,
+ "ElementField",
+ "new ElementField(FQ_" +fieldVariableName + ")",
+ ObjectModelModifier.PUBLIC);
}
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -50,6 +50,7 @@
* final 'monfield' n'est pas de ce type alors on ne retrouvera rien car
* on recherchera sur un champs inexistant
* <li> *.* ou * = recherche fulltext
+ * <li> #..... = un champs special force par l'utilisateur
*
* @param tx
* @param element
@@ -62,88 +63,105 @@
} else if (element instanceof ElementExtension) {
result = SOLR_EXTENSIONS;
} else if (element instanceof ElementField) {
- String[] searchField =
- element.getValue().split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
+ String fieldValue = element.getValue();
+ if (StringUtils.startsWith(fieldValue, WikittySolrConstant.SOLR_WIKITTY_PREFIX)) {
+ // c'est un champs specifique a l'indexation, un utilisateur
+ // avance a du l'utiliser directement, on lui fait confiance
+ // et on le laisse comme ca
+ result = fieldValue;
+ } else {
+ String[] searchField = fieldValue.split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
- if (searchField.length >= 2) {
- String extName = searchField[0];
- String fieldName = searchField[1];
+ if (searchField.length >= 2) {
+ String extName = searchField[0];
+ String fieldName = searchField[1];
- if ("*".equals(extName) && "*".equals(fieldName)) {
- result = SOLR_FULLTEXT;
- } else if ("*".equals(extName)) {
- result = SOLR_ALL_EXTENSIONS
- + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ if ("*".equals(extName) && "*".equals(fieldName)) {
+ result = SOLR_FULLTEXT;
+ } else if ("*".equals(extName)) {
+ result = SOLR_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- String modifier = "";
- // on recherche si le type a ete force
- if (searchField.length >= 3) {
- // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
- // utile pour force la recherche sur les bons champs lorsqu'on
- // demande une recherche sur * == #all
- String fieldNameType = searchField[2];
- TYPE type = FieldType.TYPE.valueOf(fieldNameType);
- // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
- modifier = SolrUtil.getSolrFieldName("", type);
- }
+ String modifier = "";
+ // on recherche si le type a ete force
+ if (searchField.length >= 3) {
+ // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
+ // utile pour force la recherche sur les bons champs lorsqu'on
+ // demande une recherche sur * == #all
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
+ modifier = SolrUtil.getSolrFieldName("", type);
+ }
- if (StringUtils.isEmpty(modifier)) {
- // si on arrive ici, c'est qu'on a pas reussi a calculer le
- // modifier cela peut arriver par exemple pour
- // #all ou le seul moyen d'avoir le type est qu'il soit donne
- // dans le champs, sinon on ne peut pas le trouver
- if (log.isDebugEnabled()) {
- log.debug("Search on multi extentions (*) without field"
- + " type, fallback search in fulltext");
+ if (StringUtils.isEmpty(modifier)) {
+ // si on arrive ici, c'est qu'on a pas reussi a calculer le
+ // modifier cela peut arriver par exemple pour
+ // #all ou le seul moyen d'avoir le type est qu'il soit donne
+ // dans le champs, sinon on ne peut pas le trouver
+ if (log.isDebugEnabled()) {
+ log.debug("Search on multi extentions (*) without field"
+ + " type, fallback search in fulltext");
+ }
+ result = SOLR_FULLTEXT_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ } else {
+ result += modifier;
}
- result = SOLR_FULLTEXT_ALL_EXTENSIONS
- + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ } else if ("*".equals(fieldName)) {
+ // on doit recherche sur tout les champs de cette extension
+ // en fait cela revient a faire une recherche fulltext avec
+ // une 2eme condition sur le type d'extension
+ // Il ne faut donc pas le gere comme ca, on previent via
+ // une exception qui l'explique
+ throw new WikittyException(
+ "To search on all field of one extension, you must"
+ + " use two condition, one on extension type, other"
+ + " in fulltext '*.*' with the wanted constraint");
} else {
- result += modifier;
- }
+ result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- } else if ("*".equals(fieldName)) {
- // on doit recherche sur tout les champs de cette extension
- // en fait cela revient a faire une recherche fulltext avec
- // une 2eme condition sur le type d'extension
- // Il ne faut donc pas le gere comme ca, on previent via
- // une exception qui l'explique
- throw new WikittyException(
- "To search on all field of one extension, you must"
- + " use to condition, one on extension type, other"
- + " in fulltext '*.*' with the wanted constraint");
- } else {
- result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
-
- // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
- // Search type of field in extension
- String version =
- extensionStorage.getLastVersion(tx, extName);
- if (version != null) { // not valid extension if version == null
- WikittyExtension ext = extensionStorage.restore(
- tx, extName, version);
- FieldType fieldType = ext.getFieldType(fieldName);
- if (log.isDebugEnabled()) {
- log.debug(ext.toDefinition() + " for " + fieldName);
- }
- if (fieldType != null) { // type can be null if extension version differ
- TYPE type = fieldType.getType();
- result = SolrUtil.getSolrFieldName(result, type);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ // Search type of field in extension
+ String version =
+ extensionStorage.getLastVersion(tx, extName);
+ if (version == null) {
+ // not valid extension if version == null
+ // cela arrive si le framework genere des requetes
+ // si des extensions non enregistrer en base
+ // cela est possible par exemple sur les WikittyTreeNode
+ log.info(String.format(
+ "Can't find extension '%s'", extName));
} else {
- throw new WikittyException(String.format(
- "Can't find field '%s' in extension '%s'"
- + " with definition: %s",
- fieldName, ext.getId(), ext.toDefinition()));
+ WikittyExtension ext = extensionStorage.restore(
+ tx, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ if (log.isDebugEnabled()) {
+ log.debug(ext.toDefinition() + " for " + fieldName);
+ }
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ result = SolrUtil.getSolrFieldName(result, type);
+ } else {
+ // on ne retrouve pas le champs, on le laisse comme il est
+ // mais normalement rien ne matchera avec
+ // TODO poussin 20111230 peut-etre transforme
+ // le champs en une recherche fulltext ???
+ // mais c peut-etre dangereux car ce n'est pas
+ // ce qu'a demande l'utilisateur
+ log.info(String.format(
+ "Can't find field '%s' in extension '%s'"
+ + " with definition: %s",
+ fieldName, ext.getId(), ext.toDefinition()));
+ }
}
- } else {
- throw new WikittyException(String.format(
- "Can't find extension '%s'", extName));
}
+ } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
+ result = SOLR_FULLTEXT;
+ } else {
+ throw new WikittyException("Empty field name is unsupported");
}
- } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
- result = SOLR_FULLTEXT;
- } else {
- throw new WikittyException("Empty field name is unsupported");
}
} else {
throw new WikittyException(String.format(
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -72,6 +72,7 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -675,19 +676,19 @@
querySolr.setRows(limit);
// Add sorting
- List<String> sortAscending = query.getSortAscending();
+ List<ElementField> sortAscending = query.getSortAscending();
if(sortAscending != null) {
- for (String sort : sortAscending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
+ for (ElementField sort : sortAscending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
- List<String> sortDescending = query.getSortDescending();
+ List<ElementField> sortDescending = query.getSortDescending();
if(sortDescending != null) {
- for (String sort : sortDescending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
+ for (ElementField sort : sortDescending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
}
@@ -701,14 +702,14 @@
// Limit on wikitty
String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
- query.addFacetField(selectWikitty);
+ query.addFacetField(new ElementField(selectWikitty));
// We need no result, just facet
query.setLimit(0);
}
// Add faceting
- List<String> facetField = query.getFacetField();
+ List<ElementField> facetField = query.getFacetField();
List<FacetQuery> facetQuery = query.getFacetQuery();
// use to map query string to criteria facet name
@@ -722,8 +723,8 @@
// field facetisation
if (facetField != null) {
- for (String fqfieldName : facetField) {
- String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
+ for (ElementField fqfieldName : facetField) {
+ String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
querySolr.addFacetField(tranform);
}
}
@@ -747,7 +748,7 @@
Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
if (facetField != null && !facetField.isEmpty()) {
for (FacetField facet : resp.getFacetFields()) {
- String facetName = fieldModifier.convertToField(transaction, facet.getName());
+ String facetName = elementModifier.convertToField(facet.getName());
List<FacetTopic> topics = new ArrayList<FacetTopic>();
if (facet.getValues() != null) {
for (FacetField.Count value : facet.getValues()) {
@@ -876,7 +877,7 @@
.and().condition(filter.getCondition())
.eq(TREENODE_ATTACHED_ALL, wikittyId).end()
.setFirst(0).setLimit(0)
- .addFacetField(TREENODE_ATTACHED_ALL)
+ .addFacetField(new ElementField(TREENODE_ATTACHED_ALL))
// l'arbre peut avoir beaucoup de branche, il
// faut que toutes les branches aient un count
// des attachments
1
0
r1267 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 15:32:17 +0100 (Fri, 30 Dec 2011)
New Revision: 1267
Url: http://nuiton.org/repositories/revision/wikitty/1267
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Implantation du WikittyQueryVisitorToSolr
Tout compile et tous les tests repassent, mais il reste encore du travail :)
Added:
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -45,7 +45,10 @@
* into business objects used by applications.
*
* It also manage {@link #securityToken} for {@link org.nuiton.wikitty.services.WikittyServiceSecurity}.
- *
+ *
+ * All method that need {@link #securityToken} and {@link org.nuiton.wikitty.services.WikittyServiceSecurity}
+ * must be in this class and not in {@link WikittyUtil}
+ *
* @author poussin
* @version $Revision$
* @since 3.3
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -35,8 +35,10 @@
* q.accept(v);
* v.getXXXX()
* </pre>
- *
*
+ * ATTENTION les sous classes doivent avoir une visibilite public car sinon
+ * l'introspection n'arrive pas a executer les methods
+ *
* @author poussin
* @version $Revision$
* @since 3.3
@@ -201,7 +203,9 @@
try {
downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -222,7 +226,9 @@
try {
result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -245,7 +251,9 @@
try {
result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -267,7 +275,9 @@
try {
downPolymorphic.invoke(this, new Object[] {object, enterOrMiddleResult});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
Added: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java (rev 0)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -0,0 +1,172 @@
+package org.nuiton.wikitty.storage.solr;
+
+import org.apache.commons.lang.ClassUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.FieldType.TYPE;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.conditions.Element;
+import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.ElementId;
+import org.nuiton.wikitty.services.WikittyTransaction;
+import org.nuiton.wikitty.storage.WikittyExtensionStorage;
+
+import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.*;
+
+/**
+ * Converti la valeur des objects de type {@link Element} pour etre utilisable
+ * dans Solr
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ElementModifier {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ElementModifier.class);
+
+ protected WikittyExtensionStorage extensionStorage;
+
+ public ElementModifier(WikittyExtensionStorage extensionStorage) {
+ this.extensionStorage = extensionStorage;
+ }
+
+ /**
+ * Different cas d'entree
+ * <li> monext.monfield on recherche sur un champs, son type est retrouve dans la base
+ * <li> monext.monfield.NUMERIC le type n'est pas pris en compte, car le champs
+ * est complement renseigne et donc on va recherche dans la base son type
+ * <li> *.monfield = recherche fulltext car aucun type n'est indique
+ * <li> *.monfield.NUMERIC recheche en utilise le type demande si on
+ * final 'monfield' n'est pas de ce type alors on ne retrouvera rien car
+ * on recherchera sur un champs inexistant
+ * <li> *.* ou * = recherche fulltext
+ *
+ * @param tx
+ * @param element
+ * @return
+ */
+ public String convertToSolr(WikittyTransaction tx, Element element) {
+ String result;
+ if (element instanceof ElementId) {
+ result = SOLR_ID;
+ } else if (element instanceof ElementExtension) {
+ result = SOLR_EXTENSIONS;
+ } else if (element instanceof ElementField) {
+ String[] searchField =
+ element.getValue().split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
+
+ if (searchField.length >= 2) {
+ String extName = searchField[0];
+ String fieldName = searchField[1];
+
+ if ("*".equals(extName) && "*".equals(fieldName)) {
+ result = SOLR_FULLTEXT;
+ } else if ("*".equals(extName)) {
+ result = SOLR_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ String modifier = "";
+ // on recherche si le type a ete force
+ if (searchField.length >= 3) {
+ // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
+ // utile pour force la recherche sur les bons champs lorsqu'on
+ // demande une recherche sur * == #all
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
+ modifier = SolrUtil.getSolrFieldName("", type);
+ }
+
+ if (StringUtils.isEmpty(modifier)) {
+ // si on arrive ici, c'est qu'on a pas reussi a calculer le
+ // modifier cela peut arriver par exemple pour
+ // #all ou le seul moyen d'avoir le type est qu'il soit donne
+ // dans le champs, sinon on ne peut pas le trouver
+ if (log.isDebugEnabled()) {
+ log.debug("Search on multi extentions (*) without field"
+ + " type, fallback search in fulltext");
+ }
+ result = SOLR_FULLTEXT_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ } else {
+ result += modifier;
+ }
+
+ } else if ("*".equals(fieldName)) {
+ // on doit recherche sur tout les champs de cette extension
+ // en fait cela revient a faire une recherche fulltext avec
+ // une 2eme condition sur le type d'extension
+ // Il ne faut donc pas le gere comme ca, on previent via
+ // une exception qui l'explique
+ throw new WikittyException(
+ "To search on all field of one extension, you must"
+ + " use to condition, one on extension type, other"
+ + " in fulltext '*.*' with the wanted constraint");
+ } else {
+ result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ // Search type of field in extension
+ String version =
+ extensionStorage.getLastVersion(tx, extName);
+ if (version != null) { // not valid extension if version == null
+ WikittyExtension ext = extensionStorage.restore(
+ tx, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ if (log.isDebugEnabled()) {
+ log.debug(ext.toDefinition() + " for " + fieldName);
+ }
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ result = SolrUtil.getSolrFieldName(result, type);
+ } else {
+ throw new WikittyException(String.format(
+ "Can't find field '%s' in extension '%s'"
+ + " with definition: %s",
+ fieldName, ext.getId(), ext.toDefinition()));
+ }
+ } else {
+ throw new WikittyException(String.format(
+ "Can't find extension '%s'", extName));
+ }
+ }
+ } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
+ result = SOLR_FULLTEXT;
+ } else {
+ throw new WikittyException("Empty field name is unsupported");
+ }
+ } else {
+ throw new WikittyException(String.format(
+ "Unsupported Element type '%s'",
+ ClassUtils.getShortCanonicalName(element, "null")));
+ }
+
+ return result;
+ }
+
+ public String convertToField(String solrName) {
+ String fieldName = solrName.replaceAll(
+ "(" + SUFFIX_BINARY + "$)"
+ + "|(" + SUFFIX_BOOLEAN + "$)"
+ + "|(" + SUFFIX_DATE + "$)"
+ + "|(" + SUFFIX_STRING + "$)"
+ + "|(" + SUFFIX_WIKITTY + "$)"
+ + "|(" + SUFFIX_NUMERIC + "$)"
+ + "|(" + SUFFIX_SORTABLE + "$)"
+ , "");
+ if (SOLR_EXTENSIONS.equals(fieldName)) {
+ fieldName = new ElementExtension().getValue();
+ }
+ return fieldName;
+ }
+}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -44,7 +44,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new {@link ElementModifier} with new query API
*/
+@Deprecated
public class FieldModifier {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -1,15 +1,18 @@
package org.nuiton.wikitty.storage.solr;
+import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.solr.client.solrj.SolrServer;
+import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryVisitor;
import org.nuiton.wikitty.query.conditions.And;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.Condition;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.Element;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -26,6 +29,7 @@
import org.nuiton.wikitty.query.conditions.Or;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
+import org.nuiton.wikitty.services.WikittyTransaction;
/**
* Converti une {@link Condition} en une requete Solr, une fois la condition
@@ -41,13 +45,14 @@
* Last update: $Date$
* by : $Author$
*/
-class WikittyQueryVisitorToSolr extends WikittyQueryVisitor {
+public class WikittyQueryVisitorToSolr extends WikittyQueryVisitor {
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(WikittyQueryVisitorToSolr.class);
- protected SolrServer solrServer;
- protected FieldModifier fieldModifier;
+ protected WikittyTransaction tx;
+ protected WikittySearchEngineSolr solrServer;
+ protected ElementModifier elementModifier;
protected String solrQuery = "";
@@ -55,168 +60,237 @@
return solrQuery;
}
- public WikittyQueryVisitorToSolr(SolrServer solrServer, FieldModifier fieldModifier) {
+ public WikittyQueryVisitorToSolr(WikittyTransaction tx,
+ WikittySearchEngineSolr solrServer, ElementModifier elementModifier) {
+ this.tx = tx;
this.solrServer = solrServer;
- this.fieldModifier = fieldModifier;
+ this.elementModifier = elementModifier;
}
+ private String element2solr(Element element) {
+ String result = elementModifier.convertToSolr(tx, element);
+ return result;
+ }
+
+ private String value2solr(String value) {
+ String result;
+ if (value != null) {
+ result = "\"" + StringEscapeUtils.escapeJava(value) + "\"";
+ } else {
+ throw new WikittyException("Parse error, value must be not empty");
+ }
+ return result;
+ }
+
@Override
public boolean visitEnter(WikittyQuery o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ // do nothing
+ return true;
}
@Override
public void visitLeave(WikittyQuery o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ // do nothing
}
@Override
public boolean visitEnter(And o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "(";
+ return true;
}
@Override
public boolean visitMiddle(And o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += " AND ";
+ return true;
}
@Override
- public void visitLeave(And o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(And o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public boolean visitEnter(Or o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "(";
+ return true;
}
@Override
public boolean visitMiddle(Or o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += " OR ";
+ return true;
}
@Override
- public void visitLeave(Or o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Or o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public boolean visitEnter(Join o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
+ WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
+
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : result) {
+ solrQuery += sep + value2solr(e);
+ sep = " OR ";
+ }
+ solrQuery += ")";
+ return false;
}
@Override
- public void visitLeave(Join o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Join o, boolean enterResult) {
+ // do nothing
}
@Override
public boolean visitEnter(Not o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "NOT(";
+ return true;
}
@Override
- public void visitLeave(Not o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Not o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public void visit(Between o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[" + value2solr(o.getMin()) + " TO " + value2solr(o.getMax()) + "]";
}
@Override
public void visit(ContainsAll o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : o.getValues()) {
+ solrQuery += sep + value2solr(e);
+ sep = " AND ";
+ }
+ solrQuery += ")";
}
@Override
public void visit(ContainsOne o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : o.getValues()) {
+ solrQuery += sep + value2solr(e);
+ sep = " OR ";
+ }
+ solrQuery += ")";
}
@Override
public void visit(Equals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":" + value2solr(o.getValue());
}
@Override
public void visit(NotEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "-" + element2solr(o.getElement())
+ + ":" + value2solr(o.getValue());
}
@Override
- public void visit(False o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visit(True o) {
+ solrQuery += "( *:* )";
}
@Override
- public void visit(True o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visit(False o) {
+ solrQuery += "( *:* - *:* )";
}
@Override
public void visit(Greater o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":{" + value2solr(o.getValue()) + " TO *}";
}
@Override
public void visit(GreaterOrEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[" + value2solr(o.getValue()) + " TO *]";
}
@Override
public void visit(Keyword o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += value2solr(o.getValue());
}
@Override
public void visit(Less o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":{* TO " + value2solr(o.getValue()) + "}";
}
@Override
public void visit(LessOrEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[* TO " + value2solr(o.getValue()) + "]";
}
@Override
public void visit(Like o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ String element2solr = element2solr(o.getElement());
+ if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string
+ // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ?
+ element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT;
+ }
+
+ solrQuery += element2solr + ":" + value2solr(o.getValue());
}
@Override
public void visit(Unlike o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ String element2solr = element2solr(o.getElement());
+ if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string
+ // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ?
+ element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT;
+ }
+
+ solrQuery += "-" + element2solr + ":" + value2solr(o.getValue());
}
@Override
public void visit(Null o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += WikittySolrConstant.SOLR_NULL_FIELD
+ + o.getElement().getValue() + ":true";
}
@Override
public void visit(NotNull o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += WikittySolrConstant.SOLR_NULL_FIELD
+ + o.getElement().getValue() + ":false";
}
@Override
public void defaultVisit(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
public boolean defaultVisitEnter(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
public boolean defaultVisitMiddle(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
- public void defaultVisitLeave(Object o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void defaultVisitLeave(Object o, boolean enterResult) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -93,8 +93,12 @@
protected SolrServer solrServer;
/** Field modifier use to transform to solr format */
+ @Deprecated
protected FieldModifier fieldModifier;
+ /** Field modifier use to transform to solr format */
+ protected ElementModifier elementModifier;
+
/** JTA resource */
protected SolrResource solrResource;
@@ -144,6 +148,7 @@
solrServer = new EmbeddedSolrServer(solrCore, "");
fieldModifier = new FieldModifier(extensionStorage);
+ elementModifier = new ElementModifier(extensionStorage);
solrResource = new SolrResource(solrServer);
} catch (Exception eee) {
@@ -651,7 +656,8 @@
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
try {
// Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
query.getCondition().accept(v);
String queryString = v.getSolrQuery();
SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
@@ -725,7 +731,8 @@
// query facetisation
if (facetQuery != null) {
for (FacetQuery facet : facetQuery) {
- v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
facet.getCondition().accept(v);
String queryFacet = v.getSolrQuery();
facetQueryToName.put(queryFacet, facet.getName());
@@ -850,7 +857,8 @@
// on a dans treeSearch uniquement le noeud passe en parametre
// et ses enfants jusqu'a la profondeur demandee
// Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
treeQuery.getCondition().accept(v);
String queryString = v.getSolrQuery();
SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
Modified: trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java
===================================================================
--- trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -198,7 +198,7 @@
TreeNodeResult<String> treeNodeResult =
ws.getSearchEngine().findAllChildrenCount(
- null, root.getId(), 0, true, null);
+ null, root.getId(), 0, true, (Criteria)null);
int val = treeNodeResult.getAttCount();
// Integer val = ws.getSearchEngine().findNodeCount(null, root, null);
Assert.assertEquals(12, val);
@@ -207,7 +207,7 @@
// Map<String, Integer> children = ws.getSearchEngine().findAllChildrenCount(null, root, null);
TreeNodeResult<String> children =
ws.getSearchEngine().findAllChildrenCount(
- null, root.getId(), 1, true, null);
+ null, root.getId(), 1, true, (Criteria)null);
if (log.isDebugEnabled()) {
log.debug("Children : " + children);
}
1
0