r1293 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/entities wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions wikitty-api/src/main/java/org/nuiton/wikitty/storage wikitty-api/src/test/java/org/nuiton/wikitty/query wikitty-api/src/test/java/org/nuiton/wikitty/storage wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr
Author: bpoussin Date: 2012-01-07 13:01:56 +0100 (Sat, 07 Jan 2012) New Revision: 1293 Url: http://nuiton.org/repositories/revision/wikitty/1293 Log: Evolution #1883: Change Query API to permit use of Select as Value of Terminal condition (reste a mettre a jour la doc) Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/AbstractCondition.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValue.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValueString.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerNaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerUnaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalNaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalUnaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/package-info.java Removed: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.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/And.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.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/ContainsAll.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.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/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/WikittySearchEngineSolrForQueryTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -238,6 +238,12 @@ return result; } + static public boolean isFqField(String fieldName) { + int i = fieldName.indexOf(WikittyUtil.FQ_FIELD_NAME_SEPARATOR); + boolean result = i > 0; + return result; + } + /** * Extract extension name from fully qualified field name * Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -50,6 +50,7 @@ import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.generator.WikittyTransformerUtil; +import org.nuiton.wikitty.query.conditions.Element; /** * Wikitty implementation. @@ -906,7 +907,15 @@ */ @Override public Object getFqField(String fqFieldName) { - return fieldValue.get(fqFieldName); + Object result; + if (Element.ID.getValue().equalsIgnoreCase(fqFieldName)) { + result = getId(); + } else if (Element.ID.getValue().equalsIgnoreCase(fqFieldName)) { + result = getExtensionNames(); + } else { + result = fieldValue.get(fqFieldName); + } + 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -32,6 +32,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.Element; import org.nuiton.wikitty.query.conditions.ElementField; /** @@ -87,7 +88,7 @@ /** Facet on condition. */ protected List<FacetQuery> facetQuery; /** Facet on field. */ - protected List<ElementField> facetField; + protected List<Element> facetField; /** * if true facet is done on extension name. Extention facet can be found * in {@link WikittyQueryResult#getFacets()} with key @@ -96,9 +97,9 @@ protected boolean facetExtension = false; /** Sort ascending on fields. */ - protected List<ElementField> sortAscending; + protected List<Element> sortAscending; /** Sort descending on fields. */ - protected List<ElementField> sortDescending; + protected List<Element> sortDescending; /** create anonymous query */ @@ -257,9 +258,9 @@ return this; } - public List<ElementField> getFacetField() { + public List<Element> getFacetField() { if (facetField == null) { - facetField = new LinkedList<ElementField>(); + facetField = new LinkedList<Element>(); } return facetField; } @@ -269,12 +270,12 @@ return this; } - public WikittyQuery setFacetField(ElementField ... facetField) { - this.facetField = new LinkedList<ElementField>(Arrays.asList(facetField)); + public WikittyQuery setFacetField(Element ... facetField) { + this.facetField = new LinkedList<Element>(Arrays.asList(facetField)); return this; } - public WikittyQuery setFacetField(List<ElementField> facetField) { + public WikittyQuery setFacetField(List<Element> facetField) { this.facetField = facetField; return this; } @@ -294,9 +295,9 @@ * * @return field names */ - public List<ElementField> getSortAscending() { + public List<Element> getSortAscending() { if (sortAscending == null) { - sortAscending = new LinkedList<ElementField>(); + sortAscending = new LinkedList<Element>(); } return sortAscending; } @@ -306,12 +307,12 @@ return this; } - public WikittyQuery setSortAscending(ElementField ... sortAscending) { - this.sortAscending = new LinkedList<ElementField>(Arrays.asList(sortAscending)); + public WikittyQuery setSortAscending(Element ... sortAscending) { + this.sortAscending = new LinkedList<Element>(Arrays.asList(sortAscending)); return this; } - public WikittyQuery setSortAscending(List<ElementField> sortAscending) { + public WikittyQuery setSortAscending(List<Element> sortAscending) { this.sortAscending = sortAscending; return this; } @@ -321,24 +322,24 @@ * * @return field names */ - public List<ElementField> getSortDescending() { + public List<Element> getSortDescending() { if (sortDescending == null) { - sortDescending = new LinkedList<ElementField>(); + sortDescending = new LinkedList<Element>(); } return sortDescending; } - public WikittyQuery addSortDescending(ElementField ... field) { + public WikittyQuery addSortDescending(Element ... field) { getSortDescending().addAll(Arrays.asList(field)); return this; } - public WikittyQuery setSortDescending(ElementField ... sortDescending) { - this.sortDescending = new LinkedList<ElementField>(Arrays.asList(sortDescending)); + public WikittyQuery setSortDescending(Element ... sortDescending) { + this.sortDescending = new LinkedList<Element>(Arrays.asList(sortDescending)); return this; } - public WikittyQuery setSortDescending(List<ElementField> sortDescending) { + public WikittyQuery setSortDescending(List<Element> sortDescending) { this.sortDescending = sortDescending; return this; } 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-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -24,10 +24,8 @@ */ package org.nuiton.wikitty.query; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Deque; import java.util.LinkedList; import java.util.List; @@ -41,18 +39,17 @@ import org.nuiton.wikitty.query.conditions.Aggregate; import org.nuiton.wikitty.query.conditions.And; import org.nuiton.wikitty.query.conditions.Between; +import org.nuiton.wikitty.query.conditions.ConditionValue; import org.nuiton.wikitty.query.conditions.Condition; +import org.nuiton.wikitty.query.conditions.ConditionValueString; 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.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.False; import org.nuiton.wikitty.query.conditions.Greater; import org.nuiton.wikitty.query.conditions.GreaterOrEquals; -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; @@ -145,41 +142,58 @@ return openStack; } - /** Ajout une condition terminal */ + /** + * Ajout une condition + * + */ protected void addCondition(Condition c) { + addCondition(c, false); + } + /** + * Ajout une condition. Si terminal est true, alors quelque soit le type de + * cette condition la stack restera inchange apres l'ajout. Cela permet + * d'ajouter des conditions non terminale comme des terminales + */ + protected void addCondition(Condition c, boolean terminal) { Condition parent = getOpenStack().peek(); - - if (parent == null) { - // il n'y a rien dans la stack donc rien dans condition, il faut - // mettre cette condition dedans - condition = c; - // on ne met les conditions terminal dans le stack, que lorsque - // c'est la premiere (cela permet d'indiquer a l'utilisateur + if (!terminal) { + // on ne met les conditions toujours dans le stack (meme les terminales) + // si c'est la premiere cela permet d'indiquer a l'utilisateur // qu'il faut commencer par un or, and, not car une exception sera - // levee + // levee car non supprimer par le while dans lequel on ne passe pas + // car on passe dans le if et non le else (parent == null) getOpenStack().push(c); - } else { - parent.addCondition(c); } - } - /** - * Ajout d'une condition non terminal (or, and, not, in) - * @param c - */ - protected void addOnStack(Condition c) { - Condition parent = getOpenStack().peek(); - getOpenStack().push(c); - if (parent == null) { // il n'y a rien dans la stack donc rien dans condition, il faut // mettre cette condition dedans condition = c; + // et on ne depile pas le stack } else { + // se add peut lever une exception si parent n'accepte pas cet enfant parent.addCondition(c); + // on depile toutes les conditions qui n'ont plus besoin de renseignement + // sauf si l'ajout a ete force en terminal + if (!terminal) { + closeIfNecessary(); + } } } + protected void closeIfNecessary() { + // on depile toutes les conditions qui n'ont plus besoin de renseignement + while (getOpenStack().peek() != null + && !getOpenStack().peek().waitCondition()) { + getOpenStack().poll(); + } + if (getOpenStack().size() == 0) { + // we just close last open condition, set stack to null, to prevent + // next condition add that is mistake + openStack = null; + } + } + /////////////////////////////////////////////////////////////////////////// // // Q U E R Y F L O W C R E A T I O N @@ -188,27 +202,23 @@ // eq(Wikitty|Date|Number|Boolean|String) - /** - * Convertie une liste d'objet en une liste de String representant - * les objets - * - * @param l - * @return - */ - static public List<String> convertToQueryStringList(Collection l) { - List<String> result; - if (l == null) { - result = Collections.emptyList(); + static protected ConditionValue convertToConditionValue(Object o) { + ConditionValue result; + if (o instanceof ConditionValue) { + result = (ConditionValue)o; } else { - result = new ArrayList<String>(l.size()); - for (Object o : l) { - String s = WikittyUtil.toString(o); - result.add(s); - } + String s = WikittyUtil.toString(o); + result = new ConditionValueString(s); } return result; } + public WikittyQueryMaker value(Object value) { + ConditionValue v = convertToConditionValue(value); + addCondition(v); + return this; + } + /** * Ajoute une condition, cette condition est prise comme une condition terminal * Si l'on veut continuer a construire la requete, il faut avoir ajouter @@ -217,7 +227,7 @@ * @return {@code this} with the {@code c} restriction added. */ public WikittyQueryMaker condition(Condition c) { - addCondition(c); + addCondition(c, true); return this; } @@ -265,6 +275,21 @@ } /** + * @see {@link ContainsAll} + */ + public WikittyQueryMaker containsAll(Element element) { + addCondition(new ContainsAll(element)); + return this; + } + + /** + * @see {@link ContainsAll} + */ + public WikittyQueryMaker containsAll(String element) { + return containsAll(new ElementField(element)); + } + + /** * Contains. * * Search on lists (multivalued fields) that a field contains all the values @@ -273,6 +298,9 @@ * Ex : The field with value [toto,titi,tutu] contains [titi,tutu] but not * [titi,tutu,tata] * + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} + * * @param element the element on which the restriction is put * @param values the values to search in the element * @return {@code this} with the {@code contains} restriction added. @@ -283,15 +311,17 @@ } /** + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} * - * @param element - * @param values - * @return * @see {@link ContainsAll} */ public <E> WikittyQueryMaker containsAll(Element element, Collection<E> values) { - addCondition(new ContainsAll(element, - convertToQueryStringList(values))); + containsAll(element); + for (E e : values) { + value(e); + } + close(); return this; } @@ -304,6 +334,9 @@ * * Ps : Use wildcards if you search for substrings. * + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} + * * @param element the element on which the restriction is put * @param value1 first value to search in the field * @param values list of values to search in the field @@ -318,11 +351,29 @@ } /** + * @see {@link ContainsOne} + */ + public WikittyQueryMaker containsOne(Element element) { + addCondition(new ContainsOne(element)); + return this; + } + + /** + * @see {@link ContainsOne} + */ + public WikittyQueryMaker containsOne(String element) { + return containsOne(new ElementField(element)); + } + + /** * Search if a field is contained in the list of values in parameter * * Ex : The field with value titi is in [titi,tutu] but not in * [tutu,tata] * + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} + * * @param element the element on which the restriction is put * @param values list of values the field must be in * @return {@code this} with the {@code in} restriction added. @@ -333,15 +384,17 @@ } /** + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} * - * @param element - * @param values - * @return * @see {@link ContainsOne} */ public <E> WikittyQueryMaker containsOne(Element element, Collection<E> values) { - addCondition(new ContainsOne(element, - convertToQueryStringList(values))); + containsOne(element); + for (E e : values) { + value(e); + } + close(); return this; } @@ -353,6 +406,9 @@ * * Ps : Use wildcards in the values if you search for substrings. * + * Force l'ajout du containsAll en terminal (il n'y a pas besoin de faire + * de {@link #close()} + * * @param element the element on which the restriction is put * @param value1 first value the field must be in * @param values list of values the field must be in @@ -367,6 +423,14 @@ } /** + * @see {@link Equals} + */ + public WikittyQueryMaker eq(Element element) { + addCondition(new Equals(element)); + return this; + } + + /** * Equals. * * Restrict search so that the field value equals the parameter. @@ -383,14 +447,10 @@ } /** - * - * @param element - * @param value - * @return * @see {@link Equals} */ public WikittyQueryMaker eq(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new Equals(element, s)); return this; } @@ -445,6 +505,14 @@ } /** + * @see {@link NotEquals} + */ + public WikittyQueryMaker ne(Element element) { + addCondition(new NotEquals(element)); + return this; + } + + /** * Not equals. * * Restrict search to elements that are not equals to the value given in @@ -463,7 +531,7 @@ * @see {@link NotEquals} */ public WikittyQueryMaker ne(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new NotEquals(element, s)); return this; } @@ -496,6 +564,14 @@ } /** + * @see {@link Greater} + */ + public WikittyQueryMaker gt(Element element) { + addCondition(new Greater(element)); + return this; + } + + /** * Greater than. * * Search if an element value is greater than the parameter. @@ -513,12 +589,20 @@ * @see {@link Greater} */ public WikittyQueryMaker gt(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new Greater(element, s)); return this; } /** + * @see {@link GreaterOrEquals} + */ + public WikittyQueryMaker ge(Element element) { + addCondition(new GreaterOrEquals(element)); + return this; + } + + /** * Greater than or equals. * * Search if an element value is greater than or equals to the parameter. @@ -536,12 +620,20 @@ * @see {@link GreaterOrEquals} */ public WikittyQueryMaker ge(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new GreaterOrEquals(element, s)); return this; } /** + * @see {@link Less} + */ + public WikittyQueryMaker lt(Element element) { + addCondition(new Less(element)); + return this; + } + + /** * Less than. * * Search if an element value is less than the parameter. @@ -559,12 +651,20 @@ * @see {@link Less} */ public WikittyQueryMaker lt(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new Less(element, s)); return this; } /** + * @see {@link LessOrEquals} + */ + public WikittyQueryMaker le(Element element) { + addCondition(new LessOrEquals(element)); + return this; + } + + /** * Less than or equals. * * Search if an element value is less than or equals to the parameter. @@ -582,12 +682,20 @@ * @see {@link LessOrEquals} */ public WikittyQueryMaker le(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); addCondition(new LessOrEquals(element, s)); return this; } /** + * @see {@link Between} + */ + public WikittyQueryMaker bw(Element element) { + addCondition(new Between(element)); + return this; + } + + /** * Between. * * Restrict search so that the element value is between the lower and upper @@ -607,8 +715,8 @@ * @see {@link Between} */ public WikittyQueryMaker bw(Element element, Object lowerValue, Object upperValue) { - String min = WikittyUtil.toString(lowerValue); - String max = WikittyUtil.toString(upperValue); + ConditionValue min = convertToConditionValue(lowerValue); + ConditionValue max = convertToConditionValue(upperValue); addCondition(new Between(element, min, max)); return this; } @@ -623,16 +731,15 @@ * @return {@code this} with the {@code sw} restriction added. * @see {@link Equals} */ - public WikittyQueryMaker sw(String fqfield, Object value) { + public WikittyQueryMaker sw(String fqfield, String value) { return sw(new ElementField(fqfield), value); } /** * @see {@link Equals} */ - public WikittyQueryMaker sw(Element element, Object value) { - String s = WikittyUtil.toString(value) + "*"; - addCondition(new Equals(element, s)); + public WikittyQueryMaker sw(Element element, String value) { + addCondition(new Equals(element, value + "*")); return this; } @@ -646,16 +753,15 @@ * @return {@code this} with the {@code nsw} restriction added. * @see {@link NotEquals} */ - public WikittyQueryMaker notsw(String fqfield, Object value) { + public WikittyQueryMaker notsw(String fqfield, String value) { return notsw(new ElementField(fqfield), value); } /** * @see {@link NotEquals} */ - public WikittyQueryMaker notsw(Element element, Object value) { - String s = WikittyUtil.toString(value) + "*"; - addCondition(new NotEquals(element, s)); + public WikittyQueryMaker notsw(Element element, String value) { + addCondition(new NotEquals(element, value + "*")); return this; } @@ -677,8 +783,7 @@ * @see {@link Equals} */ public WikittyQueryMaker ew(Element element, Object value) { - String s = "*" + WikittyUtil.toString(value); - addCondition(new Equals(element, s)); + addCondition(new Equals(element, "*" + value)); return this; } @@ -700,8 +805,7 @@ * @see {@link NotEquals} */ public WikittyQueryMaker notew(Element element, Object value) { - String s = "*" + WikittyUtil.toString(value); - addCondition(new NotEquals(element, s)); + addCondition(new NotEquals(element, "*" + value)); return this; } @@ -715,9 +819,24 @@ * @return {@code this} with the {@code keyword} restriction added. * @see {@link Keyword} */ + public WikittyQueryMaker keyword() { + addCondition(new Keyword()); + return this; + } + + /** + * Keyword. + * + * Search if the value in parameter is present in any field of any + * extension. + * + * @param value the value to find. + * @return {@code this} with the {@code keyword} restriction added. + * @see {@link Keyword} + */ public WikittyQueryMaker keyword(Object value) { - String s = WikittyUtil.toString(value); - addCondition(new Keyword(s)); + ConditionValue s = convertToConditionValue(value); + addCondition(new Keyword().addCondition(s)); return this; } @@ -790,6 +909,14 @@ } /** + * @see {@link Like} + */ + public WikittyQueryMaker like(Element element) { + addCondition(new Like(element)); + return this; + } + + /** * Like. * * Check that a string is present in a field. For example "tric" is present @@ -809,13 +936,21 @@ * @see {@link Like} */ public WikittyQueryMaker like(Element element, Object value) { - String s = WikittyUtil.toString(value); + ConditionValue s = convertToConditionValue(value); Like c = new Like(element, s); addCondition(c); return this; } /** + * @see {@link Unlike} + */ + public WikittyQueryMaker unlike(Element element) { + addCondition(new Unlike(element)); + return this; + } + + /** * Unlike. * * @param fqfield the element on which the restriction is put @@ -824,15 +959,15 @@ * @return {@code this} * @see {@link Unlike} */ - public WikittyQueryMaker unlike(String fqfield, String value) { + public WikittyQueryMaker unlike(String fqfield, Object value) { return unlike(new ElementField(fqfield), value); } /** * @see {@link Unlike} */ - public WikittyQueryMaker unlike(Element element, String value) { - String s = WikittyUtil.toString(value); + public WikittyQueryMaker unlike(Element element, Object value) { + ConditionValue s = convertToConditionValue(value); Unlike c = new Unlike(element, s); addCondition(c); return this; @@ -846,7 +981,7 @@ */ public WikittyQueryMaker not() { Condition child = new Not(); - addOnStack(child); + addCondition(child); return this; } @@ -858,7 +993,7 @@ */ public WikittyQueryMaker or() { Condition child = new Or(); - addOnStack(child); + addCondition(child); return this; } @@ -870,7 +1005,7 @@ */ public WikittyQueryMaker and() { Condition child = new And(); - addOnStack(child); + addCondition(child); return this; } @@ -898,51 +1033,48 @@ /* * @see {@link Select} */ - public WikittyQueryMaker select(ElementField element) { + public WikittyQueryMaker select(Element element) { return select(element, null); } /* * @see {@link Select} */ - public WikittyQueryMaker select(ElementField element, Aggregate aggregate) { + public WikittyQueryMaker select(Element element, Aggregate aggregate) { Condition child = new Select(element, aggregate); - addOnStack(child); + addCondition(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 {@code this} +// * @see {@link In} +// */ +// public WikittyQueryMaker in(String foreignFieldName) { +// return in(new ElementField(foreignFieldName)); +// } +// +// /* +// * @see {@link In} +// */ +// public WikittyQueryMaker in(Element element) { +// Condition child = new In(element); +// addCondition(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 {@code this} - * @see {@link In} - */ - public WikittyQueryMaker in(String foreignFieldName) { - return in(new ElementField(foreignFieldName)); - } - - /* - * @see {@link In} - */ - public WikittyQueryMaker in(Element element) { - Condition child = new In(element); - addOnStack(child); - return this; - } - - /** * Close last non terminal condition (or, and, not, in). * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close(); * @return */ public WikittyQueryMaker close() { - getOpenStack().pop(); - if (getOpenStack().size() == 0) { - // we just close last open condition, set stack to null, to prevent - // next condition add that is mistake - openStack = null; - } + getOpenStack().pop(); // on en ferme 1 obligatoirement + // on cherche a en fermer plus + closeIfNecessary(); return this; } 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -35,6 +35,8 @@ 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.ConditionValue; +import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; import org.nuiton.wikitty.query.conditions.Element; @@ -50,19 +52,20 @@ 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.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; +import org.parboiled.Context; import org.parboiled.Parboiled; import org.parboiled.Rule; import org.parboiled.annotations.BuildParseTree; import org.parboiled.errors.ErrorUtils; import org.parboiled.parserunners.RecoveringParseRunner; import org.parboiled.parserunners.ReportingParseRunner; +import org.parboiled.parserunners.TracingParseRunner; import org.parboiled.support.ParseTreeUtils; import org.parboiled.support.ParsingResult; import org.parboiled.support.Var; @@ -145,6 +148,11 @@ public WikittyQueryParser() { } + boolean debug(String text, Context context) { + System.out.println("DEBUG("+context.getCurrentIndex()+"):" + text + " nodes:" +context.getSubNodes()); + return true; + } + public Map<String, String> getAlias() { return alias; } @@ -203,8 +211,9 @@ WikittyQueryParser parser = Parboiled.createParser(WikittyQueryParser.class); -// ParsingResult<?> result = new RecoveringParseRunner(parser.start()).run(query); ParsingResult<?> result = new ReportingParseRunner(parser.start()).run(queryString); +// ParsingResult<?> result = new TracingParseRunner(parser.start()).run(queryString); +// ParsingResult<?> result = new RecoveringParseRunner(parser.start()).run(queryString); if (result.hasErrors() || !result.matched) { System.out.println("\nParse Errors:\n" + ErrorUtils.printParseErrors(result)); @@ -295,7 +304,7 @@ not(), isNull(), isNotNull(), select(), eq(), neq(), less(), lesseq(), greater(), greatereq(), like(), notlike(), between(), containsAll(), containsOne(), - in(), rTrue(), rFalse(), keyword() + rTrue(), rFalse(), keyword() ); } @@ -328,7 +337,7 @@ */ Rule eq() { return Sequence(field(), push(match()), space(), EQUALS, space(), value(), - push(new Equals(toElement(pop().toString()), removeQuote(match())))); + push(new Equals(toElement(pop(1).toString()), (ConditionValue)pop()))); } /** @@ -337,61 +346,57 @@ */ Rule neq() { return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), value(), - push(new NotEquals(toElement(pop().toString()), removeQuote(match())))); + push(new NotEquals(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule less() { return Sequence(field(), push(match()), space(), LESS, space(), value(), - push(new Less(toElement(pop().toString()), removeQuote(match())))); + push(new Less(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule lesseq() { return Sequence(field(), push(match()), space(), LESS_OR_EQUALS, space(), value(), - push(new LessOrEquals(toElement(pop().toString()), removeQuote(match())))); + push(new LessOrEquals(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule greater() { return Sequence(field(), push(match()), space(), GREATER, space(), value(), - push(new Greater(toElement(pop().toString()), removeQuote(match())))); + push(new Greater(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule greatereq() { return Sequence(field(), push(match()), space(), GREATER_OR_EQUALS, space(), value(), - push(new GreaterOrEquals(toElement(pop().toString()), removeQuote(match())))); + push(new GreaterOrEquals(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule like() { return Sequence(field(), push(match()), space(), icLIKE, space(), value(), - push(new Like(toElement(pop().toString()), removeQuote(match())))); + push(new Like(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule notlike() { return Sequence(field(), push(match()), space(), icUNLIKE, space(), value(), - push(new Unlike(toElement(pop().toString()), removeQuote(match())))); + push(new Unlike(toElement(pop(1).toString()), (ConditionValue)pop()))); } Rule between() { return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(), - value(), push(removeQuote(match())), space(), icTO, space(), - value(), push(removeQuote(match())), space(), SQUARE_BRACKET_CLOSE, - push(new Between(toElement(pop(2).toString()), pop(1).toString(), pop().toString()))); + value(), space(), icTO, space(), + value(), space(), SQUARE_BRACKET_CLOSE, + push(new Between(toElement(pop(2).toString()), (ConditionValue)pop(1), (ConditionValue)pop()))); } Rule containsAll() { - Var<List<String>> elems = new Var<List<String>>(new LinkedList<String>()); + Var<List<ConditionValue>> elems = new Var<List<ConditionValue>>(new LinkedList<ConditionValue>()); return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(), - value(), elems.get().add(removeQuote(match())), space(), ZeroOrMore(COMMA, space(), - value(), elems.get().add(removeQuote(match())), space()), SQUARE_BRACKET_CLOSE, + value(), elems.get().add((ConditionValue)pop()), space(), ZeroOrMore(COMMA, space(), + value(), elems.get().add((ConditionValue)pop()), space()), SQUARE_BRACKET_CLOSE, push(new ContainsAll(toElement(pop().toString()), elems.get()))); } Rule containsOne() { - Var<List<String>> elems = new Var<List<String>>(new LinkedList<String>()); + Var<List<ConditionValue>> elems = new Var<List<ConditionValue>>(new LinkedList<ConditionValue>()); return Sequence(field(), push(match()), space(), EQUALS, space(), CURLY_BRACKET_OPEN, space(), - value(), elems.get().add(removeQuote(match())), space(), ZeroOrMore(COMMA, space(), - value(), elems.get().add(removeQuote(match())), space()), CURLY_BRACKET_CLOSE, + value(), elems.get().add((ConditionValue)pop()), space(), ZeroOrMore(COMMA, space(), + value(), elems.get().add((ConditionValue)pop()), space()), CURLY_BRACKET_CLOSE, push(new ContainsOne(toElement(pop().toString()), elems.get()))); } - Rule in() { - return Sequence(field(), push(match()), space(), icIN, space(), term(), - push(new In(toElement(pop(1).toString()), (Condition)pop()))); - } Rule select() { Var<Aggregate> aggregate = new Var<Aggregate>(); return Sequence(icSELECT, space(), Optional(aggregate(aggregate)), space(), field(), push(match()), space(), icWHERE, space(), term(), - push(new Select(new ElementField(pop(1).toString()), aggregate.get(), (Condition)pop()))); + push(new Select(toElement(pop(1).toString()), aggregate.get(), (Condition)pop()))); } Rule aggregate(Var<Aggregate> aggregate) { return FirstOf(avg(aggregate), count(aggregate), max(aggregate), min(aggregate), sum(aggregate)); @@ -418,7 +423,7 @@ } Rule keyword() { - return Sequence(value(), push(new Keyword(removeQuote(match())))); + return Sequence(value(), push(new Keyword().addCondition((ConditionValue)pop()))); } Rule field() { @@ -434,9 +439,14 @@ } Rule value() { - return FirstOf(field(), StringLiteral()); + return FirstOf(select(), valueText()); } + Rule valueText() { + return Sequence(FirstOf(field(), StringLiteral()), + push(new ConditionValueString(removeQuote(match())))); + } + Rule StringLiteral() { return Sequence( LITERAL_OPEN, 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -25,12 +25,13 @@ package org.nuiton.wikitty.query; import java.lang.reflect.Method; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.query.conditions.And; -import org.nuiton.wikitty.query.conditions.In; import org.nuiton.wikitty.query.conditions.Between; +import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; import org.nuiton.wikitty.query.conditions.Equals; @@ -137,25 +138,11 @@ * @param o * @return True if we want visit sub-element, otherwize false */ - abstract public boolean visitEnter(In 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(In o, boolean enterOrMiddleResult); - /** * True if we want visit sub-element, otherwize false * @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 @@ -180,39 +167,41 @@ */ abstract public void visitLeave(Not o, boolean enterOrMiddleResult); - abstract public void visit(Between o); - /** - * Can be used for id, extension or field - * @param o - */ - abstract public void visit(ContainsAll o); - /** - * Can be used for id, extension or field - * @param o - */ - abstract public void visit(ContainsOne o); - /** - * Can be used for id, extension or field - * @param o - */ - abstract public void visit(Equals o); - /** - * Can be used for id, extension or field - * @param o - */ - abstract public void visit(NotEquals o); + abstract public boolean visitEnter(Between o); + abstract public boolean visitMiddle(Between o); + abstract public void visitLeave(Between o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(ContainsAll o); + abstract public boolean visitMiddle(ContainsAll o); + abstract public void visitLeave(ContainsAll o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(ContainsOne o); + abstract public boolean visitMiddle(ContainsOne o); + abstract public void visitLeave(ContainsOne o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Equals o); + abstract public void visitLeave(Equals o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(NotEquals o); + abstract public void visitLeave(NotEquals o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Greater o); + abstract public void visitLeave(Greater o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(GreaterOrEquals o); + abstract public void visitLeave(GreaterOrEquals o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Keyword o); + abstract public void visitLeave(Keyword o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Less o); + abstract public void visitLeave(Less o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(LessOrEquals o); + abstract public void visitLeave(LessOrEquals o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Like o); + abstract public void visitLeave(Like o, boolean enterOrMiddleResult); + abstract public boolean visitEnter(Unlike o); + abstract public void visitLeave(Unlike o, boolean enterOrMiddleResult); + + abstract public void visit(Null o); + abstract public void visit(NotNull o); abstract public void visit(False o); abstract public void visit(True o); - abstract public void visit(Greater o); - abstract public void visit(GreaterOrEquals o); - abstract public void visit(Keyword o); - abstract public void visit(Less o); - abstract public void visit(LessOrEquals o); - abstract public void visit(Like o); - abstract public void visit(Unlike o); - abstract public void visit(Null o); - abstract public void visit(NotNull o); + abstract public void visit(ConditionValueString o); + abstract public void defaultVisit(Object o); /** * True if we want visit sub-element, otherwize false @@ -237,6 +226,10 @@ abstract public void defaultVisitLeave(Object o, boolean enterOrMiddleResult); public void visit(Object object) { + if (log.isDebugEnabled()) { + log.debug(String.format("Visit '%s'", + ClassUtils.getShortCanonicalName(object, "null"))); + } try { Method downPolymorphic = this.getClass().getMethod("visit", new Class[] { object.getClass() }); @@ -259,6 +252,10 @@ } } public boolean visitEnter(Object object) { + if (log.isDebugEnabled()) { + log.debug(String.format("VisitEnter '%s'", + ClassUtils.getShortCanonicalName(object, "null"))); + } boolean result; try { Method downPolymorphic = this.getClass().getMethod("visitEnter", @@ -284,6 +281,10 @@ } public boolean visitMiddle(Object object) { + if (log.isDebugEnabled()) { + log.debug(String.format("VisitMiddle '%s'", + ClassUtils.getShortCanonicalName(object, "null"))); + } boolean result; try { Method downPolymorphic = this.getClass().getMethod("visitMiddle", @@ -309,6 +310,10 @@ } public void visitLeave(Object object, boolean enterOrMiddleResult) { + if (log.isDebugEnabled()) { + log.debug(String.format("VisitLeave '%s'", + ClassUtils.getShortCanonicalName(object, "null"))); + } try { Method downPolymorphic = this.getClass().getMethod("visitLeave", new Class[] { object.getClass(), Boolean.TYPE }); @@ -326,7 +331,7 @@ } } catch (NoSuchMethodException eee) { - log.debug("Can't call specific visit method, call defaultVisitLeave", eee); + log.error("Can't call specific visit method, call defaultVisitLeave", eee); this.defaultVisitLeave(object, enterOrMiddleResult); } } 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -30,14 +30,14 @@ 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.ConditionValueString; 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.Element; import org.nuiton.wikitty.query.conditions.Equals; 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.In; import org.nuiton.wikitty.query.conditions.Keyword; import org.nuiton.wikitty.query.conditions.Less; import org.nuiton.wikitty.query.conditions.LessOrEquals; @@ -90,15 +90,15 @@ public boolean visitEnter(WikittyQuery o) { WikittyQuery q = getQuery(); q.setFacetExtension(q.isFacetExtension()); - q.setFacetField(new ArrayList<ElementField>(o.getFacetField())); + q.setFacetField(new ArrayList<Element>(o.getFacetField())); q.setFacetLimit(o.getFacetLimit()); 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())); + q.setSortAscending(new ArrayList<Element>(o.getSortAscending())); + q.setSortDescending(new ArrayList<Element>(o.getSortDescending())); for (FacetQuery c : o.getFacetQuery()) { WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy(); @@ -114,6 +114,12 @@ } @Override + public void visit(ConditionValueString o) { + // not copy o, beacause o is immutable + getQueryMaker().value(o); + } + + @Override public boolean visitEnter(And o) { getQueryMaker().and(); return true; @@ -153,49 +159,91 @@ @Override public void visitLeave(Select o, boolean enterOrMiddleResult) { - getQueryMaker().close(); + // do nothing, close is automatic } @Override - public boolean visitEnter(In o) { - getQueryMaker().in(o.getElement()); + public boolean visitEnter(Not o) { + getQueryMaker().not(); return true; } @Override - public void visitLeave(In o, boolean enterResult) { + public void visitLeave(Not o, boolean enterResult) { + // do nothing, close is automatic + } + + @Override + public boolean visitEnter(Between o) { + getQueryMaker().bw(o.getElement()); + return true; + } + + @Override + public boolean visitMiddle(Between o) { + // do nothing + return true; + } + + @Override + public void visitLeave(Between o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(ContainsAll o) { + getQueryMaker().containsAll(o.getElement()); + return true; + } + + @Override + public boolean visitMiddle(ContainsAll o) { + // do nothing + return true; + } + + @Override + public void visitLeave(ContainsAll o, boolean enterOrMiddleResult) { getQueryMaker().close(); } @Override - public boolean visitEnter(Not o) { - getQueryMaker().not(); + public boolean visitEnter(ContainsOne o) { + getQueryMaker().containsOne(o.getElement()); return true; } @Override - public void visitLeave(Not o, boolean enterResult) { + public boolean visitMiddle(ContainsOne o) { + // do nothing + return true; + } + + @Override + public void visitLeave(ContainsOne o, boolean enterOrMiddleResult) { getQueryMaker().close(); } @Override - public void visit(Between o) { - getQueryMaker().bw(o.getElement(), o.getMin(), o.getMax()); + public boolean visitEnter(Equals o) { + getQueryMaker().eq(o.getElement()); + return true; } @Override - public void visit(ContainsAll o) { - getQueryMaker().containsAll(o.getElement(), new ArrayList<String>(o.getValues())); + public void visitLeave(Equals o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(ContainsOne o) { - getQueryMaker().containsOne(o.getElement(), new ArrayList<String>(o.getValues())); + public boolean visitEnter(NotEquals o) { + getQueryMaker().ne(o.getElement()); + return true; } @Override - public void visit(Equals o) { - getQueryMaker().eq(o.getElement(), o.getValue()); + public void visitLeave(NotEquals o, boolean enterOrMiddleResult) { + // do nothing } @Override @@ -204,61 +252,98 @@ } @Override - public void visit(Greater o) { - getQueryMaker().gt(o.getElement(), o.getValue()); + public void visit(True o) { + getQueryMaker().rTrue(); } @Override - public void visit(GreaterOrEquals o) { - getQueryMaker().ge(o.getElement(), o.getValue()); + public boolean visitEnter(Greater o) { + getQueryMaker().gt(o.getElement()); + return true; } @Override - public void visit(Keyword o) { - getQueryMaker().keyword(o.getValue()); + public void visitLeave(Greater o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(Less o) { - getQueryMaker().lt(o.getElement(), o.getValue()); + public boolean visitEnter(GreaterOrEquals o) { + getQueryMaker().ge(o.getElement()); + return true; } @Override - public void visit(LessOrEquals o) { - getQueryMaker().le(o.getElement(), o.getValue()); + public void visitLeave(GreaterOrEquals o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(Like o) { - getQueryMaker().like(o.getElement(), o.getValue()); + public boolean visitEnter(Keyword o) { + getQueryMaker().keyword(); + return true; } @Override - public void visit(NotEquals o) { - getQueryMaker().ne(o.getElement(), o.getValue()); + public void visitLeave(Keyword o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(Null o) { - getQueryMaker().isNull(o.getElement()); + public boolean visitEnter(Less o) { + getQueryMaker().lt(o.getElement()); + return true; } @Override - public void visit(NotNull o) { - getQueryMaker().isNotNull(o.getElement()); + public void visitLeave(Less o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(True o) { - getQueryMaker().rTrue(); + public boolean visitEnter(LessOrEquals o) { + getQueryMaker().le(o.getElement()); + return true; } @Override - public void visit(Unlike o) { - getQueryMaker().unlike(o.getElement(), o.getValue()); + public void visitLeave(LessOrEquals o, boolean enterOrMiddleResult) { + // do nothing } @Override + public boolean visitEnter(Like o) { + getQueryMaker().like(o.getElement()); + return true; + } + + @Override + public void visitLeave(Like o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Unlike o) { + getQueryMaker().unlike(o.getElement()); + return true; + } + + @Override + public void visitLeave(Unlike o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public void visit(Null o) { + getQueryMaker().isNull(o.getElement()); + } + + @Override + public void visit(NotNull o) { + getQueryMaker().isNotNull(o.getElement()); + } + + @Override public void defaultVisit(Object o) { throw new UnsupportedOperationException( "Not supported (" + o.getClass().getSimpleName() + ")."); 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -27,8 +27,8 @@ 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.In; import org.nuiton.wikitty.query.conditions.Between; +import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; import org.nuiton.wikitty.query.conditions.Equals; @@ -68,6 +68,7 @@ public String getText() { return text; } + @Override public boolean visitEnter(WikittyQuery o) { text += o.getName() + "("; @@ -130,134 +131,188 @@ } @Override - public boolean visitEnter(In o) { - text += o.getElement().getValue() + " " + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN; + public boolean visitEnter(Not o) { + text += WikittyQueryParser.NOT + WikittyQueryParser.BRACKET_OPEN; return true; } @Override - public void visitLeave(In o, boolean enterResult) { + public void visitLeave(Not o, boolean enterResult) { text += WikittyQueryParser.BRACKET_CLOSE; } @Override - public boolean visitEnter(Not o) { - text += WikittyQueryParser.NOT + WikittyQueryParser.BRACKET_OPEN; + public boolean visitEnter(Between o) { + text += o.getElement().getValue() + + WikittyQueryParser.EQUALS + WikittyQueryParser.SQUARE_BRACKET_OPEN; return true; } @Override - public void visitLeave(Not o, boolean enterResult) { - text += WikittyQueryParser.BRACKET_CLOSE; + public boolean visitMiddle(Between o) { + text += " " + WikittyQueryParser.TO + " "; + return true; } @Override - public void visit(Between o) { - text += o.getElement().getValue() - + WikittyQueryParser.EQUALS + WikittyQueryParser.SQUARE_BRACKET_OPEN - + WikittyQueryParser.LITERAL_OPEN - + o.getMin() - + WikittyQueryParser.LITERAL_CLOSE - + " " + WikittyQueryParser.TO + " " - + WikittyQueryParser.LITERAL_OPEN - + o.getMax() - + WikittyQueryParser.LITERAL_CLOSE - + WikittyQueryParser.SQUARE_BRACKET_CLOSE; + public void visitLeave(Between o, boolean enterOrMiddleResult) { + text += WikittyQueryParser.SQUARE_BRACKET_CLOSE; } @Override - public void visit(ContainsAll o) { + public void visit(ConditionValueString o) { + text += WikittyQueryParser.LITERAL_OPEN + o.getValue() + WikittyQueryParser.LITERAL_CLOSE; + } + + @Override + public boolean visitEnter(ContainsAll o) { text += o.getElement().getValue() + WikittyQueryParser.EQUALS + WikittyQueryParser.SQUARE_BRACKET_OPEN; - String sep = ""; - for(String e : o.getValues()) { - text += sep + WikittyQueryParser.LITERAL_OPEN + e + WikittyQueryParser.LITERAL_CLOSE; - sep = WikittyQueryParser.COMMA; - } + return true; + } + + @Override + public boolean visitMiddle(ContainsAll o) { + text += WikittyQueryParser.COMMA; + return true; + } + + @Override + public void visitLeave(ContainsAll o, boolean enterOrMiddleResult) { text += WikittyQueryParser.SQUARE_BRACKET_CLOSE; } @Override - public void visit(ContainsOne o) { + public boolean visitEnter(ContainsOne o) { text += o.getElement().getValue() + WikittyQueryParser.EQUALS + WikittyQueryParser.CURLY_BRACKET_OPEN; - String sep = ""; - for(String e : o.getValues()) { - text += sep + WikittyQueryParser.LITERAL_OPEN + e + WikittyQueryParser.LITERAL_CLOSE; - sep = WikittyQueryParser.COMMA; - } + return true; + } + + @Override + public boolean visitMiddle(ContainsOne o) { + text += WikittyQueryParser.COMMA; + return true; + } + + @Override + public void visitLeave(ContainsOne o, boolean enterOrMiddleResult) { text += WikittyQueryParser.CURLY_BRACKET_CLOSE; } @Override - public void visit(Equals o) { + public boolean visitEnter(Equals o) { text += o.getElement().getValue() - + WikittyQueryParser.EQUALS + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + WikittyQueryParser.EQUALS; + return true; } @Override + public void visitLeave(Equals o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override public void visit(False o) { text += WikittyQueryParser.FALSE; } @Override - public void visit(Greater o) { + public boolean visitEnter(Greater o) { text += o.getElement().getValue() - + WikittyQueryParser.GREATER + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + WikittyQueryParser.GREATER; + return true; } @Override - public void visit(GreaterOrEquals o) { + public void visitLeave(Greater o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(GreaterOrEquals o) { text += o.getElement().getValue() - + WikittyQueryParser.GREATER_OR_EQUALS + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + WikittyQueryParser.GREATER_OR_EQUALS; + return true; } @Override - public void visit(Keyword o) { - text += WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + public void visitLeave(GreaterOrEquals o, boolean enterOrMiddleResult) { + // nothing to do } @Override - public void visit(Less o) { + public boolean visitEnter(Keyword o) { + // nothing to do + return true; + } + + @Override + public void visitLeave(Keyword o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(Less o) { text += o.getElement().getValue() - + WikittyQueryParser.LESS + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + WikittyQueryParser.LESS; + return true; } @Override - public void visit(LessOrEquals o) { + public void visitLeave(Less o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(LessOrEquals o) { text += o.getElement().getValue() - + WikittyQueryParser.LESS_OR_EQUALS + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + WikittyQueryParser.LESS_OR_EQUALS; + return true; } @Override - public void visit(Like o) { + public void visitLeave(LessOrEquals o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(Like o) { text += o.getElement().getValue() - + " " + WikittyQueryParser.LIKE + " " + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + " " + WikittyQueryParser.LIKE + " "; + return true; } @Override - public void visit(NotEquals o) { + public void visitLeave(Like o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(Unlike o) { text += o.getElement().getValue() - + WikittyQueryParser.NOT_EQUALS + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; + + " " + WikittyQueryParser.UNLIKE + " "; + return true; } @Override + public void visitLeave(Unlike o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override + public boolean visitEnter(NotEquals o) { + text += o.getElement().getValue() + + WikittyQueryParser.NOT_EQUALS; + return true; + } + + @Override + public void visitLeave(NotEquals o, boolean enterOrMiddleResult) { + // nothing to do + } + + @Override public void visit(Null o) { text += o.getElement().getValue() + WikittyQueryParser.EQUALS + WikittyQueryParser.NULL; @@ -275,14 +330,6 @@ } @Override - public void visit(Unlike o) { - text += o.getElement().getValue() - + " " + WikittyQueryParser.UNLIKE + " " + WikittyQueryParser.LITERAL_OPEN - + o.getValue() - + WikittyQueryParser.LITERAL_CLOSE; - } - - @Override public void defaultVisit(Object o) { throw new UnsupportedOperationException("Not supported:" + o.getClass()); } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/AbstractCondition.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/AbstractCondition.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/AbstractCondition.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,108 @@ +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.WikittyQueryVisitorCopy; +import org.nuiton.wikitty.query.WikittyQueryVisitorToString; + +/** + * This element is a symbolic interface implemented by all operators used to + * request contents (And, Or, Not, Equals, NotEquals, EndsWith, ...). + * + * @author poussin + * @version $Revision$ + * @since 3.3 + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class AbstractCondition implements Condition { + + // serialVersionUID is used for serialization. + private static final long serialVersionUID = 1L; + + /** + * Default constructor + */ + public AbstractCondition() { + super(); + } + + @Override + public Condition copy() { + WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy(); + accept(v); + return v.getCondition(); + } + + /** + * 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 + */ + @Override + public Condition addCondition(Condition c) { + throw new WikittyException(String.format( + "Add condition is not allowed in this condition type '%s'", + getClass().getSimpleName())); + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + visitor.visit(this); + } + + /** + * Equality test based on class equality + * + * @param other Value to compare + */ + @Override + public boolean equals(Object other) { + boolean result; + if (other == null) { + result = false; + } else if (this == other) { + result = true; + }else if (this.getClass().equals(other.getClass())) { + result = equalsDeep(other); + } else { + return false; + } + return result; + } + + /** + * Sub class must override this method to check if internal state is same + * in two object (this and other) + * + * @param other other parameter is same type that this object + * @return true if other and this are equals + */ + abstract boolean equalsDeep(Object other); + + @Override + public int hashCode() { + // equals use objects that are not constant through time + // then, unable to create hashCode from those objects + // returning a constant hash-code + return this.getClass().hashCode(); + } + + @Override + public String toString() { + WikittyQueryVisitorToString v = new WikittyQueryVisitorToString(); + accept(v); + String result = v.getText(); + return result; + } + +} \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -45,7 +45,7 @@ * Last update: $Date$ * by : $Author$ */ -public class And extends ConditionNary { +public class And extends ContainerNaryOperator { private static final long serialVersionUID = 1L; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -44,13 +44,35 @@ /** * Constructor with all parameters initialized - * + * * @param element * @param min * @param max */ + public Between(Element element) { + super(element); + } + + /** + * Constructor with all parameters initialized + * + * @param element + * @param min + * @param max + */ public Between(Element element, String min, String max) { super(element, min, max); } + /** + * Constructor with all parameters initialized + * + * @param element + * @param min + * @param max + */ + public Between(Element element, ConditionValue min, ConditionValue max) { + super(element, min, max); + } + } \ No newline at end of file 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -25,166 +25,31 @@ 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; /** - * This element is a symbolic interface implemented by all operators used to - * request contents (And, Or, Not, Equals, NotEquals, EndsWith, ...). * * @author poussin * @version $Revision$ - * @since 3.3 * * Last update: $Date$ * by : $Author$ */ -public abstract class Condition implements Serializable { +public interface Condition extends Serializable { - // serialVersionUID is used for serialization. - private static final long serialVersionUID = 1L; + void accept(WikittyQueryVisitor visitor); /** - * Default constructor - */ - public Condition() { - super(); - } - - /** - * 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 + * For terminal this method must accept only {@link ConditionValue} * - * When you overriden this method, you must call {@link #checkAddCondition} - * in first - * * @param c + * @return this */ - public void addCondition(Condition c) { - throw new WikittyException(String.format( - "Add condition is not allowed in this condition type '%s'", - getClass().getSimpleName())); - } + Condition addCondition(Condition c); - public void accept(WikittyQueryVisitor visitor) { - visitor.visit(this); - } + Condition copy(); + boolean waitCondition(); -// /** -// * Constructor with all parameters initialized -// * -// * @param name -// */ -// public Restriction(RestrictionName name) { -// this(); -// this.name = name; -// } - -// /** -// * Return name -// * -// * @return -// */ -// public RestrictionName getName() { -// return name; -// } -// -// /** -// * Set a value to parameter name. -// * -// * @param name -// */ -// public void setName(RestrictionName name) { -// this.name = name; -// } - - /** - * Equality test based on class equality - * - * @param other Value to compare - */ - @Override - public boolean equals(Object other) { - boolean result; - if (other == null) { - result = false; - } else if (this == other) { - result = true; - }else if (this.getClass().equals(other.getClass())) { - result = equalsDeep(other); - } else { - return false; - } - return result; - } - - /** - * Sub class must override this method to check if internal state is same - * in two object (this and other) - * - * @param other other parameter is same type that this object - * @return true if other and this are equals - */ - abstract boolean equalsDeep(Object other); - - @Override - public int hashCode() { - // equals use objects that are not constant through time - // then, unable to create hashCode from those objects - // returning a constant hash-code - return this.getClass().hashCode(); - } - - @Override - public String toString() { - WikittyQueryVisitorToString v = new WikittyQueryVisitorToString(); - accept(v); - String result = v.getText(); - return result; - } - -} \ No newline at end of file +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValue.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValue.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValue.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,14 @@ +package org.nuiton.wikitty.query.conditions; + +/** + * Permet de marker les classes utilisable comme valeur pour une condition terminal + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public interface ConditionValue extends Condition { + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValueString.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValueString.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionValueString.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,44 @@ +package org.nuiton.wikitty.query.conditions; + +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ConditionValueString extends AbstractCondition implements ConditionValue { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ConditionValueString.class); + + private static final long serialVersionUID = 1L; + + protected String value; + + public ConditionValueString(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + @Override + public boolean waitCondition() { + return false; + } + + @Override + boolean equalsDeep(Object other) { + ConditionValueString o = (ConditionValueString)other; + boolean result = ObjectUtils.equals(this.getValue(), o.getValue()); + return result; + } + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerNaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerNaryOperator.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerNaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,105 @@ +package org.nuiton.wikitty.query.conditions; + +import java.util.LinkedList; +import java.util.List; +import org.apache.commons.lang.ClassUtils; +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.query.WikittyQueryVisitor; + +/** + * Cette classe est la classe parente de tous les objets ayant en interne + * une liste de restrictions non terminale (ex: And, Or) + * + * @author poussin + * @version $Revision$ + * @since 3.3 + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class ContainerNaryOperator extends ContainerOperator { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ContainerNaryOperator.class); + + protected List<Condition> conditions; + + public ContainerNaryOperator() { + } + + /** + * Initialyse condition with list passed in argument, parameter list is + * copied internaly to prevent extern modification + * + * @param c + */ + public ContainerNaryOperator(List<Condition> c) { + this.conditions = new LinkedList<Condition>(c); + } + + @Override + public boolean waitCondition() { + // nary allways wait condition + return true; + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + boolean walk = visitor.visitEnter(this); + if (walk && conditions != null) { + boolean notFirst = false; + for (Condition r : conditions) { + if (notFirst) { + walk = visitor.visitMiddle(this); + if (!walk) { + // le visiteur demande l'arret de la visite + break; + } + } else { + notFirst = true; + } + r.accept(visitor); + } + } + visitor.visitLeave(this, walk); + } + + @Override + boolean equalsDeep(Object other) { + ContainerNaryOperator op = (ContainerNaryOperator)other; + boolean result = ObjectUtils.equals( + this.getConditions(), op.getConditions()); + return result; + } + + /** + * Return Restriction list. This list is never null, but can be empty + * @return + */ + public List<Condition> getConditions() { + if (conditions == null) { + conditions = new LinkedList<Condition>(); + } + return conditions; + } + + @Override + public Condition addCondition(Condition c) { + if (c != null) { + if (c instanceof ConditionValue) { + throw new WikittyException(String.format( + "Condition (%s) can't have condition '%s' as child", + getClass().getSimpleName(), + ClassUtils.getShortCanonicalName(c, "null"))); + } else { + getConditions().add(c); + } + } + return this; + } + + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerOperator.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,21 @@ +package org.nuiton.wikitty.query.conditions; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Permet de marker touts les containers (autorise autre chose qu'un ConditionValue + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class ContainerOperator extends AbstractCondition { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ContainerOperator.class); + + private static final long serialVersionUID = 1L; + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerUnaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerUnaryOperator.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainerUnaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,80 @@ +package org.nuiton.wikitty.query.conditions; + +import org.apache.commons.lang.ClassUtils; +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.query.WikittyQueryVisitor; + +/** + * Cette classe est la classe parente de tous les objets ayant en interne + * une restriction non terminale (ex: Not) + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class ContainerUnaryOperator extends ContainerOperator { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ContainerUnaryOperator.class); + + protected Condition subCondition; + + public ContainerUnaryOperator() { + } + + public ContainerUnaryOperator(Condition restriction) { + this.subCondition = restriction; + } + + @Override + public boolean waitCondition() { + boolean result = subCondition == null; + return result; + } + + @Override + public Condition addCondition(Condition c) { + if (c instanceof ConditionValue) { + throw new WikittyException(String.format( + "Condition (%s) can't have condition '%s' as child", + getClass().getSimpleName(), + ClassUtils.getShortCanonicalName(c, "null"))); + } else { + if (subCondition == null) { + this.subCondition = c; + } else { + throw new WikittyException(String.format( + "Condition (%s) can't have more than one condition", + getClass().getSimpleName())); + } + } + return this; + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + boolean walk = visitor.visitEnter(this); + if (walk && subCondition != null) { + subCondition.accept(visitor); + } + visitor.visitLeave(this, walk); + } + + @Override + boolean equalsDeep(Object other) { + ContainerUnaryOperator op = (ContainerUnaryOperator)other; + boolean result = ObjectUtils.equals( + this.getSubCondition(), op.getSubCondition()); + return result; + } + + public Condition getSubCondition() { + return subCondition; + } + +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -47,7 +47,7 @@ * Last update: $Date$ * by : $Author$ */ -public class ContainsAll extends TerminalBinaryListOperator { +public class ContainsAll extends TerminalNaryOperator { // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; @@ -58,8 +58,13 @@ * @param element * @param value */ - public ContainsAll(Element element, Collection<String> values) { + public ContainsAll(Element element, Collection<ConditionValue> values) { super(element, values); } + public ContainsAll(Element element) { + super(element); + } + + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -30,14 +30,6 @@ * ContainsOne permet de definir qu'un champs doit avoir au moins une des valeurs * d'une serie de valeurs. Si cette condition est utilisee avec une seul valeur, * cela revient a faire un {@link Equals}) - * <p> - * For example, use: - * <ul> - * <li>RestrictionHelper.containsOne( myElement , "value1" )</li> - * <li>RestrictionHelper.containsOne( myElement , "value1", "value2", ... )</li> - * <li>RestrictionHelper.containsOne( myElement , - * a_list_containing_at_least_one_string )</li> - * </ul> * * @author poussin * @version $Revision$ @@ -46,7 +38,7 @@ * Last update: $Date$ * by : $Author$ */ -public class ContainsOne extends TerminalBinaryListOperator { +public class ContainsOne extends TerminalNaryOperator { // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; @@ -57,9 +49,12 @@ * @param element * @param value */ - public ContainsOne(Element element, Collection<String> values) { + public ContainsOne(Element element, Collection<ConditionValue> values) { super(element, values); } + public ContainsOne(Element element) { + super(element); + } } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -49,8 +49,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public Equals(Element element) { + super(element); + } + public Equals(Element element, String value) { super(element, value); } + public Equals(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -44,8 +44,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public Greater(Element element) { + super(element); + } + public Greater(Element element, String value) { super(element, value); } + public Greater(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -44,8 +44,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public GreaterOrEquals(Element element) { + super(element); + } + public GreaterOrEquals(Element element, String value) { super(element, value); } + public GreaterOrEquals(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -24,6 +24,9 @@ */ package org.nuiton.wikitty.query.conditions; +import org.apache.commons.lang.ClassUtils; +import org.nuiton.wikitty.WikittyException; + /** * Search keyword in all wikitty. All field is converted to String * representation and comparaison is done in ignore case mode, if one field @@ -46,8 +49,34 @@ private static final long serialVersionUID = 1L; + public Keyword() { + super(ElementField.ALL_FIELD); + } + public Keyword(String value) { super(ElementField.ALL_FIELD, value); } + public Keyword(ConditionValueString value) { + super(ElementField.ALL_FIELD, value); + } + + @Override + public Condition addCondition(Condition c) { + if (waitCondition()) { + if (c instanceof ConditionValueString) { + value = (ConditionValueString)c; + } else { + throw new WikittyException( + "Only ConditionValueString can be add to Keyword," + + " but you try to add: " + + ClassUtils.getShortCanonicalName(c, "null")); + } + } else { + throw new WikittyException( + "Keyword has already value"); + } + return this; + } + } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -44,8 +44,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public Less(Element element) { + super(element); + } + public Less(Element element, String value) { super(element, value); } + public Less(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -42,8 +42,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public LessOrEquals(Element element) { + super(element); + } + public LessOrEquals(Element element, String value) { super(element, value); } + public LessOrEquals(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -45,7 +45,15 @@ private static final long serialVersionUID = 1L; + public Like(Element element) { + super(element); + } + public Like(Element element, String value) { super(element, value); } + + public Like(Element element, ConditionValue value) { + super(element, value); + } } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -34,7 +34,7 @@ * Last update: $Date$ * by : $Author$ */ -public class Not extends ConditionUnary { +public class Not extends ContainerUnaryOperator { // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -48,8 +48,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public NotEquals(Element element) { + super(element); + } + public NotEquals(Element element, String value) { super(element, value); } + public NotEquals(Element element, ConditionValue value) { + super(element, value); + } + } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -34,12 +34,12 @@ * Last update: $Date$ * by : $Author$ */ -public class NotNull extends TerminalBinaryOperator { +public class NotNull extends TerminalUnaryOperator { private static final long serialVersionUID = 1L; public NotNull(Element element) { - super(element, null); + super(element); } } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -34,12 +34,12 @@ * Last update: $Date$ * by : $Author$ */ -public class Null extends TerminalBinaryOperator { +public class Null extends TerminalUnaryOperator { private static final long serialVersionUID = 1L; public Null(Element element) { - super(element, null); + super(element); } } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -45,7 +45,7 @@ * Last update: $Date$ * by : $Author$ */ -public class Or extends ConditionNary { +public class Or extends ContainerNaryOperator { // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; Modified: 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -45,28 +45,28 @@ * Last update: $Date$ * by : $Author$ */ -public class Select extends ConditionUnary { +public class Select extends ContainerUnaryOperator implements ConditionValue{ private static final long serialVersionUID = 1L; protected Aggregate aggregate; - protected ElementField element; + protected Element element; - public Select(ElementField element) { + public Select(Element element) { this.element = element; } - public Select(ElementField element, Aggregate aggregate) { + public Select(Element element, Aggregate aggregate) { this.element = element; this.aggregate = aggregate; } - public Select(ElementField element, Condition restriction) { + public Select(Element element, Condition restriction) { super(restriction); this.element = element; } - public Select(ElementField element, Aggregate aggregate, Condition restriction) { + public Select(Element element, Aggregate aggregate, Condition restriction) { super(restriction); this.element = element; this.aggregate = aggregate; @@ -76,7 +76,7 @@ return aggregate; } - public ElementField getElement() { + public Element getElement() { return element; } Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -1,74 +0,0 @@ -/* - * #%L - * Wikitty :: api - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 CodeLutin, Benjamin Poussin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ -package org.nuiton.wikitty.query.conditions; - -import java.util.Collection; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Classe mere des des operateurs binaire prenant une liste comme valeur possible - * (ex: ContainsAll, ContainsOne) - * - * @author poussin - * @version $Revision$ - * @since 3.3 - * - * Last update: $Date$ - * by : $Author$ - */ -public abstract class TerminalBinaryListOperator extends TerminalOperator{ - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(TerminalBinaryListOperator.class); - - private static final long serialVersionUID = 1L; - - protected Element element; - protected Collection<String> values; - - public TerminalBinaryListOperator(Element element, Collection<String> values) { - this.element = element; - this.values = values; - } - - public Element getElement() { - return element; - } - - public Collection<String> getValues() { - return values; - } - - @Override - boolean equalsDeep(Object other) { - TerminalBinaryListOperator op = (TerminalBinaryListOperator)other; - boolean result = ObjectUtils.equals(this.getElement(), op.getElement()) - && ObjectUtils.equals(this.getValues(), op.getValues()); - return result; - } - -} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -24,7 +24,10 @@ */ package org.nuiton.wikitty.query.conditions; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.ObjectUtils; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.query.WikittyQueryVisitor; /** * classe mere des operateurs unaire et binaire. Lorsqu'on l'utilise pour un @@ -44,7 +47,7 @@ private static final long serialVersionUID = 1L; protected Element element; - protected String value; + protected ConditionValue value; /** * Constructor with all parameters initialized @@ -52,16 +55,70 @@ * @param element * @param value */ + public TerminalBinaryOperator(Element element) { + this(element, (ConditionValue)null); + } + + /** + * Constructor with all parameters initialized + * + * @param element + * @param value + */ public TerminalBinaryOperator(Element element, String value) { + this(element, new ConditionValueString(value)); + } + + /** + * Constructor with all parameters initialized + * + * @param element + * @param value value is internaly copied to prevent external modification + */ + public TerminalBinaryOperator(Element element, ConditionValue value) { this.element = element; this.value = value; } + @Override + public boolean waitCondition() { + boolean result = value == null; + return result; + } + + @Override + public Condition addCondition(Condition c) { + if (waitCondition()) { + if (c instanceof ConditionValue) { + value = (ConditionValue)c; + } else { + throw new WikittyException( + "Only ConditionValue can be add to TerminalBinaryOperator," + + " but you try to add: " + + ClassUtils.getShortCanonicalName(c, "null")); + } + } else { + throw new WikittyException(String.format( + "Operator (%s) has already value", + getClass().getSimpleName())); + } + return this; + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + boolean walk = visitor.visitEnter(this); + if (walk) { + value.accept(visitor); + } + visitor.visitLeave(this, walk); + } + public Element getElement() { return element; } - public String getValue() { + public ConditionValue getValue() { return value; } @@ -73,5 +130,4 @@ return result; } - } \ No newline at end of file Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalNaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalNaryOperator.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalNaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,112 @@ +package org.nuiton.wikitty.query.conditions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.commons.lang.ClassUtils; +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.query.WikittyQueryVisitor; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class TerminalNaryOperator extends TerminalOperator { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(TerminalNaryOperator.class); + + // serialVersionUID is used for serialization. + private static final long serialVersionUID = 1L; + + protected Element element; + protected List<ConditionValue> values; + + /** + * Constructor with all parameters initialized + * + * @param element + * @param value + */ + public TerminalNaryOperator(Element element) { + this(element, (Collection<ConditionValue>)null); + } + + /** + * Constructor with all parameters initialized + * + * @param element + * @param value value is internaly copied to prevent external modification + */ + public TerminalNaryOperator(Element element, Collection<ConditionValue> values) { + this.element = element; + if (values != null) { + this.values = new ArrayList<ConditionValue>(values); + } + } + + @Override + public boolean waitCondition() { + return true; + } + + @Override + public Condition addCondition(Condition c) { + if (c instanceof ConditionValue) { + getValues().add((ConditionValue)c); + } else { + throw new WikittyException(String.format( + "Only ConditionValue can be add to %s, but you try to add: %s", + this.getClass().getSimpleName(), + ClassUtils.getShortCanonicalName(c, "null"))); + } + return this; + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + boolean walk = visitor.visitEnter(this); + if (walk && values != null) { + boolean notFirst = false; + for (Condition r : values) { + if (notFirst) { + walk = visitor.visitMiddle(this); + if (!walk) { + // le visiteur demande l'arret de la visite + break; + } + } else { + notFirst = true; + } + r.accept(visitor); + } + } + visitor.visitLeave(this, walk); + } + + public Element getElement() { + return element; + } + + public List<ConditionValue> getValues() { + if (values == null) { + values = new ArrayList<ConditionValue>(); + } + return values; + } + + @Override + boolean equalsDeep(Object other) { + TerminalNaryOperator op = (TerminalNaryOperator)other; + boolean result = ObjectUtils.equals(this.getElement(), op.getElement()) + && ObjectUtils.equals(this.getValues(), op.getValues()); + return result; + } +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -26,6 +26,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; /** * Class mere de tous les operateurs terminaux sans parametre @@ -38,7 +39,7 @@ * Last update: $Date$ * by : $Author$ */ -public abstract class TerminalOperator extends Condition { +public abstract class TerminalOperator extends AbstractCondition { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(TerminalOperator.class); @@ -46,6 +47,11 @@ public TerminalOperator() { } + @Override + public boolean waitCondition() { + return false; + } + /** * Pour les operateurs sans paramatre, le {@link Restriction#equals} est * suffisant car il verifie deja que les classes des objets sont idendiques Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -24,9 +24,12 @@ */ package org.nuiton.wikitty.query.conditions; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.query.WikittyQueryVisitor; /** * Classe mere des operateurs ternaire (ex: Between) @@ -46,24 +49,73 @@ private static final long serialVersionUID = 1L; protected Element element; - protected String min; - protected String max; + protected ConditionValue min; + protected ConditionValue max; + public TerminalTernaryOperator(Element element) { + this(element, (ConditionValue)null, (ConditionValue)null); + } + public TerminalTernaryOperator(Element element, String min, String max) { + this(element, new ConditionValueString(min), new ConditionValueString(max)); + } + + public TerminalTernaryOperator(Element element, ConditionValue min, ConditionValue max) { this.element = element; this.min = min; this.max = max; } + @Override + public boolean waitCondition() { + boolean result = min == null || max == null; + return result; + } + + @Override + public Condition addCondition(Condition c) { + if (waitCondition()) { + if (c instanceof ConditionValue) { + if (min == null) { + min = (ConditionValue)c; + } else { + max = (ConditionValue)c; + } + } else { + throw new WikittyException( + "Only ConditionValue can be add to TerminalTernaryOperator," + + " but you try to add: " + + ClassUtils.getShortCanonicalName(c, "null")); + } + } else { + throw new WikittyException( + "TerminalTernaryOperator has already min and max value"); + } + return this; + } + + @Override + public void accept(WikittyQueryVisitor visitor) { + boolean walk = visitor.visitEnter(this); + if (walk) { + min.accept(visitor); + walk = visitor.visitMiddle(this); + if (walk) { + max.accept(visitor); + } + } + visitor.visitLeave(this, walk); + } + public Element getElement() { return element; } - public String getMin() { + public ConditionValue getMin() { return min; } - public String getMax() { + public ConditionValue getMax() { return max; } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalUnaryOperator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalUnaryOperator.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalUnaryOperator.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,51 @@ +package org.nuiton.wikitty.query.conditions; + +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class TerminalUnaryOperator extends TerminalOperator { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(TerminalUnaryOperator.class); + + // serialVersionUID is used for serialization. + private static final long serialVersionUID = 1L; + + protected Element element; + + /** + * Constructor with all parameters initialized + * + * @param element + * @param value value is internaly copied to prevent external modification + */ + public TerminalUnaryOperator(Element element) { + this.element = element; + } + + @Override + public boolean waitCondition() { + // unary don't has value, then never wait for condition + return false; + } + + public Element getElement() { + return element; + } + + @Override + boolean equalsDeep(Object other) { + TerminalUnaryOperator op = (TerminalUnaryOperator)other; + boolean result = ObjectUtils.equals(this.getElement(), op.getElement()); + return result; + } +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -40,8 +40,16 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + public Unlike(Element element) { + super(element); + } + public Unlike(Element element, String value) { super(element, value); } - + + public Unlike(Element element, ConditionValue value) { + super(element, value); + } + } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/package-info.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/package-info.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/package-info.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -0,0 +1,65 @@ +/** + * Hierarchie + * <ul> + * <li> {@link Condition} + * <ul> + * <li> {@link ContainerOperator} les operateurs qui contiennent d'autre operateur + * <ul> + * <li> {@link ContainerUnaryOperator} ne contient qu'un fils + * <ul> + * <li> {@link Not} + * <li> {@link Select} + * </ul> + * <li> {@link ContainerNaryOperator} contient N fils, et doivent + * explicitement etre ferme via un close dans + * {@link org.nuiton.wikitty.query.WikittyQueryMaker#close} + * <ul> + * <li> {@link And} + * <li> {@link Or} + * </ul> + * </ul> + * </ul> + * </ul> + * <ul> + * <li> {@link TerminalOperator} ni champs, ni valeur + * <li> {@link True} + * <li> {@link False} + * <li> {@link TerminalUnaryOperator} un champs seulement + * <ul> + * <li> {@link Null} + * <li> {@link NotNull} + * </ul> + * <li> {@link TerminalBinaryOperator} un champs et une valeur + * <ul> + * <li> {@link Equals} + * <li> {@link Greater} + * <li> {@link GreaterOrEquals} + * <li> {@link Keyword} binary car automatiquement sur tous les champs + * <li> {@link Less} + * <li> {@link LessOrEquals} + * <li> {@link Like} + * <li> {@link NotEquals} + * </ul> + * <li> {@link TerminalTernaryOperator} un champs, et deux valeur + * <ul> + * <li> {@link Between} + * </ul> + * <li> {@link TerminalNaryOperator} un champs et N valeurs, et doivent + * explicitement etre ferme via un close dans + * {@link org.nuiton.wikitty.query.WikittyQueryMaker#close} si les + * valeur ne sont pas passee au moment de la construction + * <ul> + * <li> {@link ContainsAll} + * <li> {@link ContainsOne} + * </ul> + * </ul> + * <ul> + * <li> {@link ConditionValue} les valeurs possibles pour un champs + * <ul> + * <li> {@link ConditionValueString} + * <li> {@link Select} + * </ul> + * </ul> + * </ul> + */ +package org.nuiton.wikitty.query.conditions; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.swing.text.html.parser.DTDConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyException; @@ -39,6 +40,8 @@ import org.nuiton.wikitty.query.WikittyQuery; import org.nuiton.wikitty.query.WikittyQueryMaker; import org.nuiton.wikitty.query.WikittyQueryResult; +import org.nuiton.wikitty.query.conditions.Condition; +import org.nuiton.wikitty.query.conditions.Element; import org.nuiton.wikitty.query.conditions.Select; import org.nuiton.wikitty.services.WikittyTransaction; @@ -78,16 +81,22 @@ // 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()); + Condition newCond; + if(WikittyExtension.isFqField(select.getElement().getValue())) { + String extName = WikittyExtension.extractExtensionName( + select.getElement().getValue()); + newCond = new WikittyQueryMaker() + .and() + .exteq(extName) + .condition(select.getSubCondition()) + .getCondition(); + } else { + newCond = select.getSubCondition(); + } // copy de la query pour les facettes WikittyQuery queryFacet = query.copy(); - queryFacet.setCondition(newCond.getCondition()); + queryFacet.setCondition(newCond); queryFacet.setLimit(0); // copy de la query pour le select 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -39,15 +39,11 @@ 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.ClassUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -64,10 +60,11 @@ import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; import org.nuiton.wikitty.query.WikittyQueryVisitor; import org.nuiton.wikitty.query.conditions.Condition; +import org.nuiton.wikitty.query.conditions.ConditionValue; +import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; import org.nuiton.wikitty.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; @@ -191,7 +188,7 @@ } // create facet field - for (ElementField e : query.getFacetField()) { + for (org.nuiton.wikitty.query.conditions.Element e : query.getFacetField()) { String fqf = e.getValue(); Object value = w.getFqField(fqf); topic.get(fqf).add(value); @@ -241,6 +238,8 @@ } } + // TODO poussin 20120106 faire le tri des resultats en fonction de ce qui est demande + result = new WikittyQueryResult<String>(query.getName(), first, totalResult, query.getCondition().toString(), facets.getFacets(), ids); } @@ -281,7 +280,7 @@ this.w = w; } - /** + /** * Interface permettant de verifier une condition sur deux collections */ static private interface Predicate { @@ -765,6 +764,10 @@ return result; } + @Override + public void visit(ConditionValueString o) { + // do nothing + } @Override public boolean visitEnter(WikittyQuery o) { @@ -866,39 +869,62 @@ // do nothing } - @Override - public boolean visitEnter(org.nuiton.wikitty.query.conditions.In o) { - boolean evalResult = false; - String fqfieldName = o.getElement().getValue(); + protected List<String> evalConditionValueAsList(List<ConditionValue> o) { + List<String> result = new ArrayList<String>(o.size()); + for (ConditionValue c : o) { + result.addAll(evalConditionValueAsList(c)); + } + return result; + } - // 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(); - - WikittyQuery query = new WikittyQuery(sub); - - //find everything that validate the sub-restriction - WikittyQueryResult<String> associatedResult = + protected List<String> evalConditionValueAsList(ConditionValue o) { + List<String> result = new ArrayList<String>(); + if (o instanceof Select) { + WikittyQuery query = new WikittyQuery(o); + // eval select + WikittyQueryResult<String> selectResult = searchEngine.findAllByQuery(tx, query); - - List<String> associatedList = associatedResult.getAll(); - - //Check that my field is contained in the sub-restriction results. - evalResult = check(ContainsOnePredicate, o.getElement(), associatedList); + result.addAll(selectResult.getAll()); + } else if (o instanceof ConditionValueString) { + result.add(((ConditionValueString)o).getValue()); + } else { + throw new WikittyException(String.format( + "ConditionValue type unsupported %s", + ClassUtils.getShortCanonicalName(o, "null"))); } - - evalStack.push(evalResult); + return result; - // on ne parcours pas la sous requete - return false; } - - @Override - public void visitLeave(org.nuiton.wikitty.query.conditions.In o, boolean enterOrMiddleResult) { - // nothing to do + protected String evalConditionValue(ConditionValue o) { + String result; + if (o instanceof Select) { + WikittyQuery query = new WikittyQuery(o); + // eval select + WikittyQueryResult<String> selectResult = + searchEngine.findAllByQuery(tx, query); + if (selectResult.size() == 0) { + throw new WikittyException(String.format( + "Select return no result query was '%s' transformed to '%s'", + o.toString(), + selectResult.getQueryString())); + } else if (selectResult.size() > 1) { + if (log.isWarnEnabled()) { + log.warn(String.format( + "Select return more than one result, only first" + + " is used. Query was '%s' transformed to '%s'", + o.toString(), + selectResult.getQueryString())); + } + } + result = selectResult.peek(); + } else if (o instanceof ConditionValueString) { + result = ((ConditionValueString)o).getValue(); + } else { + throw new WikittyException(String.format( + "ConditionValue type unsupported %s", + ClassUtils.getShortCanonicalName(o, "null"))); + } + return result; } @Override @@ -915,53 +941,105 @@ } @Override - public void visit(org.nuiton.wikitty.query.conditions.Between o) { + public boolean visitEnter(org.nuiton.wikitty.query.conditions.Between o) { boolean result = false; Collection expected = new ArrayList(2); - expected.add(o.getMin()); - expected.add(o.getMax()); + expected.add(evalConditionValue(o.getMin())); + expected.add(evalConditionValue(o.getMax())); result = check(BetweenPredicate, o.getElement(), expected); evalStack.push(result); + return false; } @Override - public void visit(ContainsAll o) { + public boolean visitMiddle(org.nuiton.wikitty.query.conditions.Between o) { + // do nothing + return false; + } + + @Override + public void visitLeave(org.nuiton.wikitty.query.conditions.Between o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(ContainsAll o) { boolean result = false; - result = check(ContainsAllPredicate, o.getElement(), o.getValues()); + result = check(ContainsAllPredicate, o.getElement(), + evalConditionValueAsList(o.getValues())); evalStack.push(result); + return false; } @Override - public void visit(ContainsOne o) { + public boolean visitMiddle(ContainsAll o) { + // do nothing + return false; + } + + @Override + public void visitLeave(ContainsAll o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(ContainsOne o) { boolean result = false; - result = check(ContainsOnePredicate, o.getElement(), o.getValues()); + result = check(ContainsOnePredicate, o.getElement(), + evalConditionValueAsList(o.getValues())); evalStack.push(result); + return false; } @Override - public void visit(Equals o) { + public boolean visitMiddle(ContainsOne o) { + // do nothing + return false; + } + + @Override + public void visitLeave(ContainsOne o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Equals o) { boolean result = false; - result = check(EqualsPredicate, o.getElement(), o.getValue()); + result = check(EqualsPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(NotEquals o) { + public void visitLeave(Equals o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(NotEquals o) { boolean result = false; - result = check(NotEqualsPredicate, o.getElement(), o.getValue()); + result = check(NotEqualsPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override + public void visitLeave(NotEquals o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override public void visit(org.nuiton.wikitty.query.conditions.False o) { evalStack.push(Boolean.FALSE); } @@ -972,73 +1050,127 @@ } @Override - public void visit(Greater o) { + public boolean visitEnter(Greater o) { boolean result = false; - result = check(GreaterPredicate, o.getElement(), o.getValue()); + result = check(GreaterPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(GreaterOrEquals o) { + public void visitLeave(Greater o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(GreaterOrEquals o) { boolean result = false; - result = check(GreaterOrEqualsPredicate, o.getElement(), o.getValue()); + result = check(GreaterOrEqualsPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(org.nuiton.wikitty.query.conditions.Keyword o) { + public void visitLeave(GreaterOrEquals o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(org.nuiton.wikitty.query.conditions.Keyword o) { boolean result = false; - result = check(KeywordPredicate, o.getElement(), o.getValue()); + result = check(KeywordPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(Less o) { + public void visitLeave(org.nuiton.wikitty.query.conditions.Keyword o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Less o) { boolean result = false; - result = check(LessPredicate, o.getElement(), o.getValue()); + result = check(LessPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(LessOrEquals o) { + public void visitLeave(Less o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(LessOrEquals o) { boolean result = false; - result = check(LessOrEqualsPredicate, o.getElement(), o.getValue()); + result = check(LessOrEqualsPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } @Override - public void visit(Like o) { + public void visitLeave(LessOrEquals o, boolean enterOrMiddleResult) { boolean result = false; - result = check(LikePredicate, o.getElement(), o.getValue()); + result = check(LessOrEqualsPredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); } @Override - public void visit(Unlike o) { + public boolean visitEnter(Like o) { boolean result = false; - result = check(UnlikePredicate, o.getElement(), o.getValue()); + result = check(LikePredicate, o.getElement(), + evalConditionValue(o.getValue())); evalStack.push(result); + return false; } + @Override + public void visitLeave(Like o, boolean enterOrMiddleResult) { + // do nothing + } + @Override + public boolean visitEnter(Unlike o) { + boolean result = false; + + result = check(UnlikePredicate, o.getElement(), + evalConditionValue(o.getValue())); + + evalStack.push(result); + return false; + } + + @Override + public void visitLeave(Unlike o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override public void visit(org.nuiton.wikitty.query.conditions.Null o) { boolean result = false; - result = check(NullPredicate, o.getElement(), o.getValue()); + result = check(NullPredicate, o.getElement(), null); evalStack.push(result); } @@ -1047,7 +1179,7 @@ public void visit(NotNull o) { boolean result = false; - result = check(NotNullPredicate, o.getElement(), o.getValue()); + result = check(NotNullPredicate, o.getElement(), null); evalStack.push(result); } Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -51,17 +51,20 @@ public void testParseAliasAndTree() throws Exception { WikittyQueryParser parser = new WikittyQueryParser(); parser.addAlias("MyAlias\\((.*), (.*)\\)", - "id IN (SELECT WikittyTreeNode.attachment" - + " WHERE rootNode IN (WikittyTreeNode.name=$1)" - + " AND pathNode IN (WikittyTreeNode.name=$2))"); + "id={SELECT WikittyTreeNode.attachment" + + " WHERE (rootNode={SELECT ID WHERE (WikittyTreeNode.name=$1)}" + + " AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=$2)})}"); + WikittyQueryParser.parse("WikittyGroup.name=Group*"); + WikittyQueryParser.parse("WikittyGroup.name=Group* AND id=toto"); + WikittyQuery q1 = parser.parseQuery( "WikittyGroup.name=Group* AND MyAlias(OtherTree, OtherBranch)"); WikittyQuery q2 = parser.parseQuery( - "WikittyGroup.name=Group* AND id IN (SELECT WikittyTreeNode.attachment" - + " WHERE rootNode IN (WikittyTreeNode.name=OtherTree)" - + " AND pathNode IN (WikittyTreeNode.name=OtherBranch))"); + "WikittyGroup.name=Group* AND id={SELECT WikittyTreeNode.attachment" + + " WHERE (rootNode={SELECT ID WHERE (WikittyTreeNode.name=OtherTree)}" + + " AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=OtherBranch)})}"); System.out.println("Q1:" + q1); System.out.println("Q2:" + q2); @@ -86,9 +89,9 @@ { WikittyQuery query = new WikittyQueryMaker().bw("ext.field", 0, 10).end(); String queryString = query.getCondition().toString(); + System.out.println("queryString:" + queryString); WikittyQuery queryParsed = WikittyQueryParser.parse(queryString); String queryParsedString = queryParsed.getCondition().toString(); - System.out.println("queryString:" + queryString); System.out.println("queryParsed:" + queryParsedString); Assert.assertEquals(query, queryParsed); Assert.assertEquals(queryString, queryParsedString); @@ -334,7 +337,13 @@ Assert.assertEquals(queryString, queryParsedString); } { - WikittyQuery query = new WikittyQueryMaker().not().and().eq("ext.field", 1).eq("ext.field", 2).close().close().end(); + WikittyQuery query = new WikittyQueryMaker() + .not() + .and() + .eq("ext.field", 1) + .eq("ext.field", 2) + .close() + .end(); String queryString = query.getCondition().toString(); WikittyQuery queryParsed = WikittyQueryParser.parse(queryString); String queryParsedString = queryParsed.getCondition().toString(); @@ -387,12 +396,15 @@ cc.notsw("ext.field", "pasdebut"); cc.notew("ext.field", "pasfin"); cc.not(); - cc.rFalse(); - cc.close(); + cc.rFalse(); cc.or(); - cc.eq("ext.field", w); - cc.not().and().eq("ext.field", 1).eq("ext.field", 2).close().close(); - cc.eq("ext.field", "truc"); + cc.eq("ext.field", w); + cc.not() + .and() + .eq("ext.field", 1) + .eq("ext.field", 2) + .close(); + cc.eq("ext.field", "truc"); cc.close(); WikittyQuery query = cc.end(); 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -40,6 +40,7 @@ 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; /** * @@ -96,7 +97,8 @@ { // recherche des labels - WikittyQuery q = new WikittyQueryMaker().eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "toutou").end(); + WikittyQuery q = new WikittyQueryMaker() + .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "toutou").end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // seul l1 doit etre retrouve Assert.assertEquals(1, result.size()); @@ -124,7 +126,8 @@ { // recherche des du keyword 'ou' - WikittyQuery q = new WikittyQueryMaker().and().exteq(WikittyGroup.EXT_WIKITTYGROUP).keyword("ou").end(); + WikittyQuery q = new WikittyQueryMaker() + .and().exteq(WikittyGroup.EXT_WIKITTYGROUP).keyword("ou").end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // g1, g2, g3 doivent etre retrouve mais pas l1 (pas la bonne extension) Assert.assertEquals(3, result.size()); @@ -134,7 +137,8 @@ { // recherche des labels - WikittyQuery q = new WikittyQueryMaker().isNull(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS).end(); + WikittyQuery q = new WikittyQueryMaker() + .isNull(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS).end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // seul l2 doit etre retrouve Assert.assertEquals(1, result.size()); @@ -142,7 +146,8 @@ } { - WikittyQuery q = new WikittyQueryMaker().like(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "*P2").end(); + WikittyQuery q = new WikittyQueryMaker() + .like(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "*P2").end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // seul g2 doit etre retrouve Assert.assertEquals(1, result.size()); @@ -150,7 +155,8 @@ } { - WikittyQuery q = new WikittyQueryMaker().ew(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "p2").end(); + WikittyQuery q = new WikittyQueryMaker() + .ew(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "p2").end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // seul g2 doit etre retrouve Assert.assertEquals(1, result.size()); @@ -159,8 +165,9 @@ { // test join WikittyQuery q = new WikittyQueryMaker() - .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) - .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi") + .containsOne(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) + .select(Element.ID) + .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi") .end(); WikittyQueryResult<String> result = se.findAllByQuery(null, q); // g1, g3 doivent etre retrouve via le join @@ -172,9 +179,10 @@ { // test join WikittyQuery q = new WikittyQueryMaker() .or() - .ideq(g2.getWikittyId()) - .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) - .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi") + .ideq(g2.getWikittyId()) + .containsOne(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) + .select(Element.ID) + .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) @@ -186,9 +194,11 @@ { // test join WikittyQuery q = new WikittyQueryMaker() .and() - .not().ideq(g1.getWikittyId()).close() - .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) - .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi") + .not() + .ideq(g1.getWikittyId()) + .containsOne(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS) + .select(Element.ID) + .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/ElementModifier.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -67,6 +67,7 @@ if (log.isDebugEnabled()) { log.debug("Element: " + element.getValue() + "(" + element.getClass() + ")"); } + System.out.println("XXXXXElement: " + element.getValue() + "(" + element.getClass() + ")"); String result; if (element instanceof ElementId) { result = SOLR_ID; 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -1,7 +1,8 @@ package org.nuiton.wikitty.storage.solr; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.lang.StringUtils; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyException; @@ -11,6 +12,8 @@ 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.ConditionValue; +import org.nuiton.wikitty.query.conditions.ConditionValueString; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; import org.nuiton.wikitty.query.conditions.Element; @@ -53,7 +56,7 @@ static private Log log = LogFactory.getLog(WikittyQueryVisitorToSolr.class); protected WikittyTransaction tx; - protected WikittySearchEngineSolr solrServer; + protected WikittySearchEngineSolr searchEngine; protected ElementModifier elementModifier; protected String solrQuery = ""; @@ -65,7 +68,7 @@ public WikittyQueryVisitorToSolr(WikittyTransaction tx, WikittySearchEngineSolr solrServer, ElementModifier elementModifier) { this.tx = tx; - this.solrServer = solrServer; + this.searchEngine = solrServer; this.elementModifier = elementModifier; } @@ -74,7 +77,7 @@ return result; } - private String value2solr(String value) { + private String escape2solr(String value) { String result; if (value != null) { final String LUCENE_REPLACE_PATTERN = "\\+" + "|-" + "|&&" + "|\\|" @@ -90,7 +93,73 @@ return result; } + protected List<String> evalConditionValueAsList(List<ConditionValue> o) { + List<String> result = new ArrayList<String>(o.size()); + for (ConditionValue c : o) { + result.addAll(evalConditionValueAsList(c)); + } + return result; + } + + protected List<String> evalConditionValueAsList(ConditionValue o) { + List<String> result = new ArrayList<String>(); + if (o instanceof Select) { + WikittyQuery query = new WikittyQuery(o); + // eval select + WikittyQueryResult<String> selectResult = + searchEngine.findAllByQuery(tx, query); + for (String s : selectResult) { + result.add(escape2solr(s)); + } + } else if (o instanceof ConditionValueString) { + result.add(escape2solr(((ConditionValueString)o).getValue())); + } else { + throw new WikittyException(String.format( + "ConditionValue type unsupported %s", + ClassUtils.getShortCanonicalName(o, "null"))); + } + return result; + + } + protected String evalConditionValue(ConditionValue o) { + String result; + if (o instanceof Select) { + WikittyQuery query = new WikittyQuery(o); + // eval select + WikittyQueryResult<String> selectResult = + searchEngine.findAllByQuery(tx, query); + if (selectResult.size() == 0) { + throw new WikittyException(String.format( + "Select return no result query was '%s' transformed to '%s'", + o.toString(), + selectResult.getQueryString())); + } else if (selectResult.size() > 1) { + if (log.isWarnEnabled()) { + log.warn(String.format( + "Select return more than one result, only first" + + " is used. Query was '%s' transformed to '%s'", + o.toString(), + selectResult.getQueryString())); + } + } + result = selectResult.peek(); + } else if (o instanceof ConditionValueString) { + result = ((ConditionValueString)o).getValue(); + } else { + throw new WikittyException(String.format( + "ConditionValue type unsupported %s", + ClassUtils.getShortCanonicalName(o, "null"))); + } + result = escape2solr(result); + return result; + } + @Override + public void visit(ConditionValueString o) { + // do nothing + } + + @Override public boolean visitEnter(WikittyQuery o) { // do nothing return true; @@ -147,40 +216,40 @@ // 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); +// @Override +// public boolean visitEnter(In o) { +// WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE); +// WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q); +// +// if (log.isDebugEnabled()) { +// log.debug("In result: " + result); +// } +// if (result.size() == 0) { +// // si on a pas de resultat, on met false +// solrQuery += "( *:* - *:* )"; +// } else if (result.size() == 1) { +// // si on a qu'un resultat sans parenthese +// solrQuery += +// element2solr(o.getElement()) + ":" + value2solr(result.peek()); +// } else { +// solrQuery += element2solr(o.getElement()) +// + ":("; +// String sep = ""; +// for(String e : result) { +// solrQuery += sep + value2solr(e); +// sep = " OR "; +// } +// solrQuery += ")"; +// } +// return false; +// } +// +// @Override +// public void visitLeave(In o, boolean enterResult) { +// // do nothing +// } - if (log.isDebugEnabled()) { - log.debug("In result: " + result); - } - if (result.size() == 0) { - // si on a pas de resultat, on met false - solrQuery += "( *:* - *:* )"; - } else if (result.size() == 1) { - // si on a qu'un resultat sans parenthese - solrQuery += - element2solr(o.getElement()) + ":" + value2solr(result.peek()); - } else { - solrQuery += element2solr(o.getElement()) - + ":("; - String sep = ""; - for(String e : result) { - solrQuery += sep + value2solr(e); - sep = " OR "; - } - solrQuery += ")"; - } - return false; - } - @Override - public void visitLeave(In o, boolean enterResult) { - // do nothing - } - - @Override public boolean visitEnter(Not o) { solrQuery += "NOT("; return true; @@ -192,109 +261,189 @@ } @Override - public void visit(Between o) { + public boolean visitEnter(Between o) { solrQuery += element2solr(o.getElement()) - + ":[" + value2solr(o.getMin()) + " TO " + value2solr(o.getMax()) + "]"; + + ":[" + evalConditionValue(o.getMin()) + " TO " + evalConditionValue(o.getMax()) + "]"; + return false; } @Override - public void visit(ContainsAll o) { + public boolean visitMiddle(Between o) { + // to nothing + return true; + } + + @Override + public void visitLeave(Between o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(ContainsAll o) { solrQuery += element2solr(o.getElement()) + ":("; String sep = ""; - for(String e : o.getValues()) { - solrQuery += sep + value2solr(e); + for(String e : evalConditionValueAsList(o.getValues())) { + solrQuery += sep + e; sep = " AND "; } solrQuery += ")"; + return false; } @Override - public void visit(ContainsOne o) { + public boolean visitMiddle(ContainsAll o) { + // do nothing + return false; + } + + @Override + public void visitLeave(ContainsAll o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(ContainsOne o) { solrQuery += element2solr(o.getElement()) + ":("; String sep = ""; - for(String e : o.getValues()) { - solrQuery += sep + value2solr(e); + for(String e : evalConditionValueAsList(o.getValues())) { + solrQuery += sep + e; sep = " OR "; } solrQuery += ")"; + return false; } @Override - public void visit(Equals o) { + public boolean visitMiddle(ContainsOne o) { + // do nothing + return false; + } + + @Override + public void visitLeave(ContainsOne o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Equals o) { solrQuery += element2solr(o.getElement()) - + ":" + value2solr(o.getValue()); + + ":" + evalConditionValue(o.getValue()); + return false; } @Override - public void visit(NotEquals o) { - solrQuery += "-" + element2solr(o.getElement()) - + ":" + value2solr(o.getValue()); + public void visitLeave(Equals o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(True o) { - solrQuery += "( *:* )"; + public boolean visitEnter(NotEquals o) { + solrQuery += "-" + element2solr(o.getElement()) + + ":" + evalConditionValue(o.getValue()); + return false; } @Override - public void visit(False o) { - solrQuery += "( *:* - *:* )"; + public void visitLeave(NotEquals o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(Greater o) { + public boolean visitEnter(Greater o) { solrQuery += element2solr(o.getElement()) - + ":{" + value2solr(o.getValue()) + " TO *}"; + + ":{" + evalConditionValue(o.getValue()) + " TO *}"; + return false; } @Override - public void visit(GreaterOrEquals o) { + public void visitLeave(Greater o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(GreaterOrEquals o) { solrQuery += element2solr(o.getElement()) - + ":[" + value2solr(o.getValue()) + " TO *]"; + + ":[" + evalConditionValue(o.getValue()) + " TO *]"; + return false; } @Override - public void visit(Keyword o) { - solrQuery += value2solr(o.getValue()); + public void visitLeave(GreaterOrEquals o, boolean enterOrMiddleResult) { + // do nothing } @Override - public void visit(Less o) { + public boolean visitEnter(Keyword o) { + solrQuery += evalConditionValue(o.getValue()); + return false; + } + + @Override + public void visitLeave(Keyword o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Less o) { solrQuery += element2solr(o.getElement()) - + ":{* TO " + value2solr(o.getValue()) + "}"; + + ":{* TO " + evalConditionValue(o.getValue()) + "}"; + return false; } @Override - public void visit(LessOrEquals o) { + public void visitLeave(Less o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(LessOrEquals o) { solrQuery += element2solr(o.getElement()) - + ":[* TO " + value2solr(o.getValue()) + "]"; + + ":[* TO " + evalConditionValue(o.getValue()) + "]"; + return false; } @Override - public void visit(Like o) { + public void visitLeave(LessOrEquals o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Like o) { 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()); + solrQuery += element2solr + ":" + evalConditionValue(o.getValue()); + return false; } @Override - public void visit(Unlike o) { + public void visitLeave(Like o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override + public boolean visitEnter(Unlike o) { 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()); + solrQuery += "-" + element2solr + ":" + evalConditionValue(o.getValue()); + return false; } @Override + public void visitLeave(Unlike o, boolean enterOrMiddleResult) { + // do nothing + } + + @Override public void visit(Null o) { solrQuery += WikittySolrConstant.SOLR_NULL_FIELD + o.getElement().getValue() + ":true"; @@ -307,6 +456,16 @@ } @Override + public void visit(True o) { + solrQuery += "( *:* )"; + } + + @Override + public void visit(False o) { + solrQuery += "( *:* - *:* )"; + } + + @Override public void defaultVisit(Object o) { 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -75,6 +75,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.Element; import org.nuiton.wikitty.query.conditions.ElementField; import org.nuiton.wikitty.query.conditions.Select; import org.nuiton.wikitty.search.Search; @@ -688,18 +689,18 @@ querySolr.setRows(limit); // Add sorting - List<ElementField> sortAscending = query.getSortAscending(); + List<Element> sortAscending = query.getSortAscending(); if(sortAscending != null) { - for (ElementField sort : sortAscending) { + for (Element sort : sortAscending) { String tranform = elementModifier.convertToSolr(transaction, sort); tranform += WikittySolrConstant.SUFFIX_SORTABLE; querySolr.addSortField(tranform, SolrQuery.ORDER.asc); } } - List<ElementField> sortDescending = query.getSortDescending(); + List<Element> sortDescending = query.getSortDescending(); if(sortDescending != null) { - for (ElementField sort : sortDescending) { + for (Element sort : sortDescending) { String tranform = elementModifier.convertToSolr(transaction, sort); tranform += WikittySolrConstant.SUFFIX_SORTABLE; querySolr.addSortField(tranform, SolrQuery.ORDER.desc); @@ -708,7 +709,7 @@ // Add faceting boolean isFacetExtension = query.isFacetExtension(); - List<ElementField> facetField = query.getFacetField(); + List<Element> facetField = query.getFacetField(); List<FacetQuery> facetQuery = query.getFacetQuery(); // use to map query string to criteria facet name @@ -728,7 +729,7 @@ // field facetisation if (facetField != null) { - for (ElementField fqfieldName : facetField) { + for (Element fqfieldName : facetField) { String tranform = elementModifier.convertToSolr(transaction, fqfieldName); querySolr.addFacetField(tranform); } Modified: 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 2012-01-07 10:37:00 UTC (rev 1292) +++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java 2012-01-07 12:01:56 UTC (rev 1293) @@ -305,7 +305,7 @@ WikittyQuery query = new WikittyQueryMaker() .and() .exteq(WikittyGroup.EXT_WIKITTYGROUP) - .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME) + .containsOne(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME) .select(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS) .end(); @@ -320,17 +320,17 @@ public void testQueryOnTree() throws Exception { WikittyQueryParser parser = new WikittyQueryParser(); parser.addAlias("MyAlias\\((.*), (.*)\\)", - "id IN (SELECT WikittyTreeNode.attachment" - + " WHERE (rootNode IN (WikittyTreeNode.name=$1)" - + " AND pathNode IN (WikittyTreeNode.name=$2)))"); + "id={SELECT WikittyTreeNode.attachment" + + " WHERE (rootNode={SELECT ID WHERE (WikittyTreeNode.name=$1)}" + + " AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=$2)})}"); WikittyQuery q1 = parser.parseQuery( "WikittyGroup.name=Group* AND MyAlias(OtherTree, OtherBranch)"); WikittyQuery q2 = parser.parseQuery( - "WikittyGroup.name=Group* AND id IN (SELECT WikittyTreeNode.attachment" - + " WHERE (rootNode IN (WikittyTreeNode.name=OtherTree)" - + " AND pathNode IN (WikittyTreeNode.name=OtherBranch)))"); + "WikittyGroup.name=Group* AND id={SELECT WikittyTreeNode.attachment" + + " WHERE (rootNode={SELECT ID WHERE (WikittyTreeNode.name=OtherTree)}" + + " AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=OtherBranch)})}"); System.out.println("Q1:" + q1); System.out.println("Q2:" + q2); @@ -366,14 +366,14 @@ { WikittyQuery q0 = parser.parseQuery( - "rootNode IN (WikittyTreeNode.name=OtherTree) AND pathNode IN (WikittyTreeNode.name=OtherBranch)"); + "rootNode={SELECT ID WHERE (WikittyTreeNode.name=OtherTree)} AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=OtherBranch)}"); System.out.println("qO: " + q0); WikittyQueryResult<String> q0Result = client.findAllByQuery(q0); System.out.println("q0Result:" + q0Result); } { WikittyQuery q0 = parser.parseQuery( - "SELECT WikittyTreeNode.attachment WHERE (rootNode IN (WikittyTreeNode.name=OtherTree) AND pathNode IN (WikittyTreeNode.name=OtherBranch))") + "SELECT WikittyTreeNode.attachment WHERE (rootNode={SELECT ID WHERE (WikittyTreeNode.name=OtherTree)} AND pathNode={SELECT ID WHERE (WikittyTreeNode.name=OtherBranch)})") .addFacetField(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT); System.out.println("qO: " + q0); WikittyQueryResult<String> q0Result = client.findAllByQuery(q0); @@ -381,14 +381,6 @@ } { WikittyQuery q0 = parser.parseQuery( - "rootNode IN (WikittyTreeNode.name=OtherTree) AND pathNode IN (WikittyTreeNode.name=OtherBranch)") - .addFacetField(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT); - System.out.println("qO: " + q0); - WikittyQueryResult<String> q0Result = client.findAllByQuery(q0); - System.out.println("q0Result:" + q0Result); - } - { - WikittyQuery q0 = parser.parseQuery( "SELECT WikittyTreeNode.attachment WHERE (ID={branch, leaf})") .addFacetField(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT); System.out.println("qO: " + q0);
participants (1)
-
bpoussin@users.nuiton.org