r1281 - in trunk: src/site/rst/user wikitty-api/src/main/java/org/nuiton/wikitty 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 wikitty-api/src/test/java/org/nuiton/wikitty/query wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr wikitty-solr/src/main/resources wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr w
Author: bpoussin Date: 2012-01-05 02:39:15 +0100 (Thu, 05 Jan 2012) New Revision: 1281 Url: http://nuiton.org/repositories/revision/wikitty/1281 Log: - ajout d'element pour permettre la recherche dans les arbres - ajout du support des alias dans le Parser - maj documentation query - quelques tests sur solr pour l'api query - suppression des log solr inferieur a warn dans les tests Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementNode.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrQueryParser.java Modified: trunk/src/site/rst/user/query.rst trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.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/Element.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.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/WikittySolrConstant.java trunk/wikitty-solr/src/main/resources/solrconfig.xml trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java trunk/wikitty-solr/src/test/resources/log4j.properties Modified: trunk/src/site/rst/user/query.rst =================================================================== --- trunk/src/site/rst/user/query.rst 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/src/site/rst/user/query.rst 2012-01-05 01:39:15 UTC (rev 1281) @@ -344,6 +344,66 @@ WikittyQuery q = WikittyQueryParser.parse( "Person.birthday IN (SELECT Event.date WHERE Event.country LIKE france)"); +Recherche sur les arbres +------------------------ + +Pour la recherche sur les arbres 3 pseudos champs sont utilisables + +- rootNode: champs contenant l'id de la racinde du nom +- pathNode: champs contenant tous les id de noeuds pour atteindre un noeud (du root au noeud lui même inclus) +- depthNode: entier indiquant la profondeur d'un noeud (root=1) + +* Pour avoir tous les attachments de tous les noeuds de tous les arbres:: + + WikittyQuery q = new WikittyQueryMaker() + .in(Element.ID) + .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT).end(); + + WikittyQuery q = WikittyQueryParser.parse( + "id IN (SELECT WikittyTreeNode.attachment)"); + +* Pour avoir tous les attachments de tous les noeuds d'un arbre ayant le nom 'MyTree':: + + WikittyQuery q = new WikittyQueryMaker() + .in(Element.ID) + .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) + .in(Element.ROOT_NODE) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree").end(); + + WikittyQuery q = WikittyQueryParser.parse( + "id IN (SELECT WikittyTreeNode.attachment WHERE rootNode IN (WikittyTreeNode.name=MyTree))"); + +* Pour avoir tous les attachments d'un sous arbre commencant à un noeud ayant + le nom "MyBranch" d'un arbre ayant le nom 'MyTree':: + + WikittyQuery q = new WikittyQueryMaker() + .in(Element.ID) + .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) + .and() + .in(Element.ROOT_NODE) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree") + .close(); + .in(Element.PATH_NODE) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyBranch").end(); + + WikittyQuery q = WikittyQueryParser.parse("id IN (SELECT WikittyTreeNode.attachment WHERE + + " rootNode IN (WikittyTreeNode.name=MyTree) AND pathNode IN (WikittyTreeNode.name=MyBranch))"); + +* Pour avoir tous les attachments d'un arbre ayant le nom 'MyTree' jusqu'à une + profondeur de 3 (root, fils, sous fils):: + + WikittyQuery q = new WikittyQueryMaker() + .in(Element.ID) + .select(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_ATTACHMENT) + .and() + .in(Element.ROOT_NODE) + .eq(WikittyTreeNode.ELEMENT_FIELD_WIKITTYTREENODE_NAME, "MyTree") + .close(); + .le(Element.PATH_NODE, 3).end(); + + WikittyQuery q = WikittyQueryParser.parse("id IN (SELECT WikittyTreeNode.attachment WHERE + + " rootNode IN (WikittyTreeNode.name=MyTree) AND pathNode<=3)"); + Spécificité de WikittyQueryMaker -------------------------------- @@ -378,6 +438,57 @@ WikittyQuery q = new WikittyQueryMaker() .and().condition(qold).eq(...).end(); +Spécificité de WikittyQueryParser +--------------------------------- + +Vous pouvez ajouter des alias pour simplifier l'écriture de certain requête. + +Par exemple si vous utilisez souvent une longue requête comme:: + + WikittyQuery q = WikittyQueryParser.parse( + "id IN (SELECT WikittyTreeNode.attachment WHERE" + + " rootNode IN (WikittyTreeNode.name=MyTree)" + + " AND pathNode IN (WikittyTreeNode.name=MyBranch))"); + +Vous pouvez faire:: + + WikittyQueryParser parser = new WikittyQueryParser(); + parser.addAlias("MyAlias", "id IN (SELECT WikittyTreeNode.attachment WHERE" + + " rootNode IN (WikittyTreeNode.name=MyTree) AND" + + " pathNode IN (WikittyTreeNode.name=MyBranch))"); + +Si maintenant votre requête est:: + + WikittyQuery q = parser.parseQuery( + "MyExt.field=toto AND MyAlias"); + +Elle sera transformée avant d'être parser en:: + + WikittyQuery q = parser.parseQuery( + "MyExt.field=toto AND id IN (SELECT WikittyTreeNode.attachment" + + " WHERE rootNode IN (WikittyTreeNode.name=MyTree)" + + " AND pathNode IN (WikittyTreeNode.name=MyBranch))"); + +Vous pouvez aussi paramètrer vos alias, par exemple si le nom de l'arbre et de +la branche doivent varier vous pouvez faire:: + + WikittyQueryParser parser = new WikittyQueryParser(); + parser.addAlias("MyAlias\(.*, .*\)", "id IN (SELECT WikittyTreeNode.attachment" + + " WHERE rootNode IN (WikittyTreeNode.name=$1)" + + " AND pathNode IN (WikittyTreeNode.name=$2))"); + +Vous pourrez donc ensuite écrire:: + + WikittyQuery q = parser.parseQuery( + "MyExt.field=toto AND MyAlias(OtherTree, OtherBranch)"); + +Elle sera transformée avant d'être parser en:: + + WikittyQuery q = parser.parseQuery( + "MyExt.field=toto AND id IN (SELECT WikittyTreeNode.attachment" + + " WHERE rootNode IN (WikittyTreeNode.name=OtherTree)" + + " AND pathNode IN (WikittyTreeNode.name=OtherBranch))"); + Recherche avancée ----------------- @@ -416,8 +527,8 @@ WikittyQuery q = WikittyQueryParser.parse("*=poussin"); -Les autres valeurs d'une requête --------------------------------- +Les autres paramètres d'une requête +----------------------------------- * Nom : name - Nommage de la requêtes. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -99,14 +99,6 @@ // #1386 sletellier 20110309 : solr date is return like 2011-03-09T08:06:27.593Z public static final String SOLR_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - public static final String[] DATE_FORMAT_ALLOWED = { - DATE_FORMAT, - SOLR_DATE_FORMAT, - new SimpleDateFormat().toPattern(), - "dd/MM/yy", - "dd/MM/yy hh:mm", - }; - /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyUtil.class); @@ -118,6 +110,15 @@ static final protected FastDateFormat solrDateFormat = FastDateFormat.getInstance( DATE_FORMAT, CANONICAL_TZ, CANONICAL_LOCALE); + public static final String[] DATE_FORMAT_ALLOWED = { + solrDateFormat.getPattern(), + DATE_FORMAT, + SOLR_DATE_FORMAT, + new SimpleDateFormat().toPattern(), + "dd/MM/yy", + "dd/MM/yy hh:mm", + }; + public static final String FQ_FIELD_NAME_SEPARATOR = "."; public static final String FQ_FIELD_NAME_SEPARATOR_REGEX = "\\."; public static final String FQ_META_EXTENSION_SEPARATOR = ":"; 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -1,6 +1,6 @@ package org.nuiton.wikitty.query; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -15,7 +15,6 @@ 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; @@ -48,6 +47,9 @@ * Cette classe permet d'interpreter une requete faite textuellement en la * convertisant en sa representation objet. * + * Pour plus d'information reportez-vous à la + * <a href="http://maven-site.nuiton.org/wikitty/user/query.html">documentation</a> + * * @author poussin * @version $Revision$ * @since 3.3 @@ -57,14 +59,6 @@ */ @BuildParseTree public class WikittyQueryParser extends BaseParser<Object> { - /** - * type de champs pour indique qu'on fait une condition sur le nom - * d'une extension. Ce champs est aussi utilise comme valeur pour - * {@link ElementExtension} et comme nom de facet pour les extensions - */ - public static final String EXTENSION = "extension"; - public static final String FALSE = "FALSE"; - public static final String ID = "id"; public static final String SELECT = "SELECT"; public static final String WHERE = "WHERE"; @@ -73,6 +67,7 @@ public static final String LITERAL_OPEN = "\""; public static final String NULL = "NULL"; public static final String TO = "TO"; + public static final String FALSE = "FALSE"; public static final String TRUE = "TRUE"; public static final String UNLIKE = "UNLIKE"; public static final String AND = "AND"; @@ -93,8 +88,8 @@ public static final String SQUARE_BRACKET_CLOSE = "]"; public static final String SQUARE_BRACKET_OPEN = "["; - public Rule icEXTENSION = IgnoreCase(EXTENSION); - public Rule icID = IgnoreCase(ID); + public Rule icEXTENSION = IgnoreCase(Element.EXTENSION.getValue()); + public Rule icID = IgnoreCase(Element.ID.getValue()); public Rule icNOT = IgnoreCase(NOT); public Rule icAND = IgnoreCase(AND); public Rule icOR = IgnoreCase(OR); @@ -111,13 +106,67 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyQueryParser.class); - protected Map<String, String> fieldAlias = new HashMap<String, String>(); - protected Map<String, String> valueAlias = new HashMap<String, String>(); + protected Map<String, String> alias = new LinkedHashMap<String, String>(); public WikittyQueryParser() { } + public Map<String, String> getAlias() { + return alias; + } + + public WikittyQueryParser setAlias(Map<String, String> alias) { + this.alias = alias; + return this; + } + + public WikittyQueryParser addAlias(String aliasName, String aliasValue) { + alias.put(aliasName, aliasValue); + return this; + } + + /** + * Parse query and use alias added with {@link #addAlias} or {@link #setAlias} + * + * @param queryString query to parse + * @return + */ + public WikittyQuery parseQuery(String queryString) { + WikittyQuery result = parse(queryString, alias); + return result; + } + + /** + * Parse query without alias + * + * @param queryString query to parse + * @return + */ static public WikittyQuery parse(String queryString) { + WikittyQuery result = parse(queryString, null); + return result; + } + + /** + * Parse query and use alias in argument + * + * @param queryString query to parse + * @param alias alias to used to change query + * @return + */ + static public WikittyQuery parse(String queryString, Map<String, String> alias) { + if (alias != null) { + String queryStringInit = queryString; + // first replace alias in queryString + for (Map.Entry<String, String> a : alias.entrySet()) { + queryString = queryString.replaceAll(a.getKey(), a.getValue()); + } + if (log.isDebugEnabled()) { + log.debug(String.format("QueryString \n'%s' become after alias \n'%s'\naliases are %s", + queryStringInit, queryString, alias)); + } + } + WikittyQueryParser parser = Parboiled.createParser(WikittyQueryParser.class); // ParsingResult<?> result = new RecoveringParseRunner(parser.start()).run(query); @@ -145,10 +194,16 @@ */ protected Element toElement(String v) { Element result; - if (ID.equals(v)) { + if (Element.ID.getValue().equalsIgnoreCase(v)) { result = Element.ID; - } else if (EXTENSION.equals(v)) { + } else if (Element.EXTENSION.getValue().equalsIgnoreCase(v)) { result = Element.EXTENSION; + } else if (Element.NODE_ROOT.getValue().equalsIgnoreCase(v)) { + result = Element.NODE_ROOT; + } else if (Element.NODE_PATH.getValue().equalsIgnoreCase(v)) { + result = Element.NODE_PATH; + } else if (Element.NODE_DEPTH.getValue().equalsIgnoreCase(v)) { + result = Element.NODE_DEPTH; } else { result = new ElementField(v); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -219,4 +219,14 @@ Iterator<T> result = getAll().iterator(); return result; } + + @Override + public String toString() { + String result = getQueryString() + " results " + getAll(); + if (!getFacetNames().isEmpty()) { + result += "\nfacets " + getFacets(); + } + return result; + } + } 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -91,8 +91,8 @@ @Override public boolean visitEnter(Select o) { - text += WikittyQueryParser.SELECT + o.getElement().getValue() - + WikittyQueryParser.WHERE + WikittyQueryParser.BRACKET_OPEN; + text += WikittyQueryParser.SELECT + " " + o.getElement().getValue() + + " " + WikittyQueryParser.WHERE + " " + WikittyQueryParser.BRACKET_OPEN; return true; } @@ -103,7 +103,7 @@ @Override public boolean visitEnter(In o) { - text += o.getElement().getValue() + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN; + text += o.getElement().getValue() + " " + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN; return true; } @@ -152,7 +152,7 @@ @Override public void visit(ContainsOne o) { text += o.getElement().getValue() - + WikittyQueryParser.EQUALS + WikittyQueryParser.CURLY_BRACKET_CLOSE; + + WikittyQueryParser.EQUALS + WikittyQueryParser.CURLY_BRACKET_OPEN; String sep = ""; for(String e : o.getValues()) { text += sep + WikittyQueryParser.LITERAL_OPEN + e + WikittyQueryParser.LITERAL_CLOSE; 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -21,7 +21,7 @@ * Last update: $Date$ * by : $Author$ */ -public class And extends ConditionNary{ +public class And extends ConditionNary { private static final long serialVersionUID = 1L; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -21,6 +21,13 @@ // serialVersionUID is used for serialization. private static final long serialVersionUID = 1L; + /** utilise pour creer une condition sur le noeud root de l'arbre */ + public static final ElementNode NODE_ROOT = new ElementNode(ElementNode.FIELD_NODE_ROOT); + /** utilise pour creer une condition sur un noeud ou un de ses peres (le chemin d'acces a un noeud)*/ + public static final ElementNode NODE_PATH = new ElementNode(ElementNode.FIELD_NODE_PATH); + /** utilise pour creer une condition sur la profondeur d'un noeud (root=1) */ + public static final ElementNode NODE_DEPTH = new ElementNode(ElementNode.FIELD_NODE_DEPTH); + public static final ElementId ID = new ElementId(); public static final ElementExtension EXTENSION = new ElementExtension(); public static final ElementField ALL_FIELD = Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -2,7 +2,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.wikitty.query.WikittyQueryParser; /** * Un element qui represente les extensions, vous devez utiliser l'instance @@ -22,8 +21,10 @@ private static final long serialVersionUID = 1L; + public static final String FIELD_EXTENSION = "EXTENSION"; + protected ElementExtension() { - super(WikittyQueryParser.EXTENSION); + super(FIELD_EXTENSION); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -2,7 +2,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.wikitty.query.WikittyQueryParser; /** * Element qui represente l'Id, vous devez utiliser l'instance @@ -22,8 +21,10 @@ private static final long serialVersionUID = 1L; + public static final String FIELD_ID = "ID"; + protected ElementId() { - super(WikittyQueryParser.ID); + super(FIELD_ID); } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementNode.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementNode.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementNode.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -0,0 +1,36 @@ +package org.nuiton.wikitty.query.conditions; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Represente un element pour les recherches sur les arbres. Vous devez utiliser + * <li> {@link Element#NODE_BRANCH} utilise pour savoir si un objet est attache a un noeud ou un sous noeud + * <li> {@link Element#NODE_ROOT} utilise pour creer une condition sur le noeud root de l'arbre + * <li> {@link Element#NODE_PARENTS} utilise pour creer une condition sur un noeud ou un de ses peres + * <li> {@link Element#NODE_DEPTH} utilise pour creer une condition sur la profondeur d'un noeud (root=1) + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ElementNode extends Element { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ElementNode.class); + + private static final long serialVersionUID = 1L; + + public static final String FIELD_NODE_ROOT = "rootNode"; + public static final String FIELD_NODE_PATH = "pathNode"; + public static final String FIELD_NODE_DEPTH = "depthNode"; + + + /** protected because you must used constant defined in {@link Element} */ + protected ElementNode(String v) { + super(v); + } + + +} 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -46,7 +46,7 @@ boolean equalsDeep(Object other) { boolean result = super.equalsDeep(other); if (result) { - In op = (In)other; + Select op = (Select)other; result = ObjectUtils.equals(this.getElement(), op.getElement()); } return result; 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -66,7 +66,7 @@ // on part de facet qui a deja la bonne condition WikittyQuery querySelect = queryFacet.copy(); querySelect.setLimit(0); - querySelect.setFacetMinCount(0); + querySelect.setFacetMinCount(1); querySelect.setFacetLimit(Integer.MAX_VALUE); // on force le sort pour toujours utiliser le meme querySelect.setFacetSort(FacetSortType.count); Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java (rev 0) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -0,0 +1,32 @@ +package org.nuiton.wikitty; + +import java.util.Date; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Test; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyUtilTest { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyUtilTest.class); + + @Test + public void testToDate() throws Exception { + Date d = new Date(); + System.out.println("Date: " + d); + String ds = WikittyUtil.toString(d); + System.out.println("Date format: " + ds); + Date d2 = WikittyUtil.toDate(ds); + System.out.println("Date parsed: " + d2); + Assert.assertEquals(d, d2); + } +} 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -22,7 +22,29 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyQueryTest.class); + @Test + 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))"); + + 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))"); + + System.out.println("Q1:" + q1); + System.out.println("Q2:" + q2); + Assert.assertEquals(q2, q1); + } + + @Test public void testParseEachElement() throws Exception { Wikitty w = new WikittyImpl(); 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -13,6 +13,7 @@ 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.ElementNode; import org.nuiton.wikitty.services.WikittyTransaction; import org.nuiton.wikitty.storage.WikittyExtensionStorage; @@ -50,6 +51,12 @@ * final 'monfield' n'est pas de ce type alors on ne retrouvera rien car * on recherchera sur un champs inexistant * <li> *.* ou * = recherche fulltext + * <li> id = recherche sur les id + * <li> extension = recherche sur les extensions + * <li> node = recherche sur les attachment d'un noeud + * <li> nodeOrSubNode = recherche sur les attachment d'un noeud ou sous noeud + * <li> root = recherche sur les noeud root + * <li> parents = recherche sur un noeud ou ses parents * <li> #..... = un champs special force par l'utilisateur * * @param tx @@ -57,11 +64,24 @@ * @return */ public String convertToSolr(WikittyTransaction tx, Element element) { + if (log.isDebugEnabled()) { + log.debug("Element: " + element.getValue() + "(" + element.getClass() + ")"); + } String result; if (element instanceof ElementId) { result = SOLR_ID; } else if (element instanceof ElementExtension) { result = SOLR_EXTENSIONS; + } else if (element instanceof ElementNode) { + if (element.equals(Element.NODE_ROOT)) { + result = TREENODE_ROOT; + } else if (element.equals(Element.NODE_PATH)) { + result = TREENODE_PARENTS; + } else if (element.equals(Element.NODE_DEPTH)) { + result = TREENODE_DEPTH; + } else { + throw new WikittyException("Unknow ElementNode: " + element.getValue()); + } } else if (element instanceof ElementField) { String fieldValue = element.getValue(); if (StringUtils.startsWith(fieldValue, WikittySolrConstant.SOLR_WIKITTY_PREFIX)) { @@ -131,8 +151,13 @@ // cela arrive si le framework genere des requetes // si des extensions non enregistrer en base // cela est possible par exemple sur les WikittyTreeNode - log.info(String.format( - "Can't find extension '%s'", extName)); + // S'il ne sont pas en base, c'est qu'aucun objet + // ne les utilisent, et donc leur absence n'est pas + // grave + if (log.isDebugEnabled()) { + log.debug(String.format( + "Can't find extension '%s'", extName)); + } } else { WikittyExtension ext = extensionStorage.restore( tx, extName, version); @@ -182,8 +207,16 @@ + "|(" + SUFFIX_NUMERIC + "$)" + "|(" + SUFFIX_SORTABLE + "$)" , ""); - if (SOLR_EXTENSIONS.equals(fieldName)) { + if (SOLR_ID.equals(fieldName)) { + fieldName = Element.ID.getValue(); + } else if (SOLR_EXTENSIONS.equals(fieldName)) { fieldName = Element.EXTENSION.getValue(); + } else if (TREENODE_ROOT.equals(fieldName)) { + fieldName = Element.NODE_ROOT.getValue(); + } else if (TREENODE_PARENTS.equals(fieldName)) { + fieldName = Element.NODE_PATH.getValue(); + } else if (TREENODE_DEPTH.equals(fieldName)) { + fieldName = Element.NODE_DEPTH.getValue(); } return fieldName; } 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -1,6 +1,7 @@ package org.nuiton.wikitty.storage.solr; import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyException; @@ -76,10 +77,16 @@ private String value2solr(String value) { String result; if (value != null) { - result = "\"" + StringEscapeUtils.escapeJava(value) + "\""; + final String LUCENE_REPLACE_PATTERN = "\\+" + "|-" + "|&&" + "|\\|" + + "|!" + "|\\(|\\)" + "|\\[|\\]" + "|\\{|\\}" + "|\"" + "|:"; + result = value.replaceAll(LUCENE_REPLACE_PATTERN, "\\\\$0"); } else { throw new WikittyException("Parse error, value must be not empty"); } + + if (result.contains(" ")) { + result = "\"" + result + "\""; + } return result; } @@ -145,14 +152,26 @@ WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE); WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q); - solrQuery += element2solr(o.getElement()) - + ":("; - String sep = ""; - for(String e : result) { - solrQuery += sep + value2solr(e); - sep = " OR "; + if (log.isDebugEnabled()) { + log.debug("In result: " + result); } - solrQuery += ")"; + 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; } Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -77,7 +77,7 @@ /** Use as field on Wikitty object attached on TreeNode, TreeNodeId is added at end */ static final public String TREENODE_ATTACHED = TREENODE_PREFIX + "attached."; /** Use as field on Wikitty object attached on TreeNode, TreeNodeId is added at end - used for facetisation */ + used for facetisation. Le champs est cree dynamiquement par solr via schema.xml */ static final public String TREENODE_ATTACHED_ALL = TREENODE_PREFIX + "attached-all"; static final public String SUFFIX_BINARY = "_bi"; Added: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrQueryParser.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrQueryParser.java (rev 0) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrQueryParser.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -0,0 +1,102 @@ +/* + * #%L + * Wikitty :: wikitty-solr-impl + * + * $Id: WikittyQueryParser.java 1136 2011-08-12 14:24:03Z tchemit $ + * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-solr/src/main/java/org/nuito... $ + * %% + * Copyright (C) 2009 - 2010 CodeLutin + * %% + * 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.storage.solr; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.lucene.queryParser.ParseException; +import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.Query; +import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.SolrParams; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.search.LuceneQParserPlugin; +import org.apache.solr.search.QParser; +import org.apache.solr.search.QueryParsing; +import org.apache.solr.search.SolrQueryParser; + +/** + * Add allow leading wildcard + * setAllowLeadingWildcard(true); + * <br>Example: <code>{!wikitty q.op=AND df=text sort='price asc'}myfield:foo +bar -baz</code> + * More information @see LuceneQParserPlugin + */ +public class WikittySolrQueryParser extends LuceneQParserPlugin { + + public static String NAME = "wikitty"; + + @Override + public void init(NamedList args) { + } + + @Override + public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + return new SolrQParser(qstr, localParams, params, req); + } + + static public class SolrQParser extends QParser { + + static private Log log = LogFactory.getLog(SolrQParser.class); + String sortStr; + SolrQueryParser lparser; + + public SolrQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + super(qstr, localParams, params, req); + } + + @Override + public Query parse() throws ParseException { + + String defaultField = getParam(CommonParams.DF); + if (defaultField == null) { + // TODO poussin 20101216 normalement on devrait retrouver cette + // valeur dans la config. Mais en fait a chaque fois on passe + // ici car defaultField est null :( alors que dans schema.xml + // on a bien defini le defaultField :( + defaultField = WikittySolrConstant.SOLR_FULLTEXT; + } + + lparser = new SolrQueryParser(this, defaultField); + lparser.setAllowLeadingWildcard(true); + + String opParam = getParam(QueryParsing.OP); + if (opParam != null) { + lparser.setDefaultOperator("AND".equals(opParam) ? QueryParser.Operator.AND : QueryParser.Operator.OR); + } + + String qstr = getString(); + if (log.isDebugEnabled()) { + log.debug("Query parse : " + qstr); + } + return lparser.parse(qstr); + } + + @Override + public String[] getDefaultHighlightFields() { + return new String[]{lparser.getField()}; + } + } +} Modified: trunk/wikitty-solr/src/main/resources/solrconfig.xml =================================================================== --- trunk/wikitty-solr/src/main/resources/solrconfig.xml 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/main/resources/solrconfig.xml 2012-01-05 01:39:15 UTC (rev 1281) @@ -542,8 +542,8 @@ </fragmenter> </highlighting>--> - <queryParser name="lucene" class="org.nuiton.wikitty.storage.solr.WikittyQueryParser"/> - <queryParser name="wikitty" class="org.nuiton.wikitty.storage.solr.WikittyQueryParser"/> + <queryParser name="lucene" class="org.nuiton.wikitty.storage.solr.WikittySolrQueryParser"/> + <queryParser name="wikitty" class="org.nuiton.wikitty.storage.solr.WikittySolrQueryParser"/> <!-- example of registering a query parser <queryParser name="lucene" class="org.apache.solr.search.LuceneQParserPlugin"/> 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-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java 2012-01-05 01:39:15 UTC (rev 1281) @@ -1,6 +1,6 @@ package org.nuiton.wikitty.storage.solr; -import java.util.List; +import java.util.Collections; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; @@ -15,8 +15,11 @@ import org.nuiton.wikitty.entities.WikittyImpl; import org.nuiton.wikitty.entities.WikittyLabel; import org.nuiton.wikitty.entities.WikittyLabelImpl; +import org.nuiton.wikitty.entities.WikittyTreeNode; +import org.nuiton.wikitty.entities.WikittyTreeNodeImpl; import org.nuiton.wikitty.query.WikittyQuery; import org.nuiton.wikitty.query.WikittyQueryMaker; +import org.nuiton.wikitty.query.WikittyQueryParser; import org.nuiton.wikitty.query.WikittyQueryResult; import org.nuiton.wikitty.query.conditions.Element; @@ -54,6 +57,107 @@ } @Test + public void testFacet() throws Exception { + // for id for easy debugging + WikittyGroupImpl g1 = new WikittyGroupImpl(new WikittyImpl("g1")); + g1.setName("Group1"); + WikittyGroupImpl g2 = new WikittyGroupImpl(new WikittyImpl("g2")); + g2.setName("GROUP"); + WikittyGroupImpl g3 = new WikittyGroupImpl(new WikittyImpl("g3")); + g3.setName("Group3"); + WikittyGroupImpl g4 = new WikittyGroupImpl(new WikittyImpl("g4")); + g4.setName("GROUP"); + + client.store(g1, g2, g3, g4); + + { + WikittyQuery query = new WikittyQueryMaker() + .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "Group*") + .end().addFacetField(WikittyGroup.ELEMENT_FIELD_WIKITTYGROUP_NAME); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testFacet" + result); + Assert.assertEquals(2, result.size()); + Assert.assertEquals(2, result.getFacets().get(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME).size()); + } + { + WikittyQuery query = new WikittyQueryMaker() + .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "GROUP") + .end().addFacetField(WikittyGroup.ELEMENT_FIELD_WIKITTYGROUP_NAME); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testFacet" + result); + Assert.assertEquals(2, result.size()); + Assert.assertEquals(1, result.getFacets().get(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME).size()); + Assert.assertEquals(2, result.getFacets().get(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME).get(0).getCount()); + } + { + WikittyQuery query = new WikittyQueryMaker() + .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "GROUP") + .end().addFacetField(WikittyGroup.ELEMENT_FIELD_WIKITTYGROUP_NAME) + .setLimit(0); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testFacet" + result); + Assert.assertEquals(0, result.size()); + Assert.assertEquals(1, result.getFacets().get(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME).size()); + Assert.assertEquals(2, result.getFacets().get(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME).get(0).getCount()); + } + } + + @Test + public void testEq() throws Exception { + // for id for easy debugging + WikittyGroupImpl g1 = new WikittyGroupImpl(new WikittyImpl("g1")); + g1.setName("Group1"); + WikittyGroupImpl g2 = new WikittyGroupImpl(new WikittyImpl("g2")); + g2.setName("GROUP2"); + + client.store(g1, g2); + + { + WikittyQuery query = new WikittyQueryMaker() + .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "Group1") + .end(); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testEq" + result.getAll()); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(g1.getWikittyId(), result.peek()); + } + + { + WikittyQuery query = new WikittyQueryMaker() + .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "Group*") + .end(); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testEq" + result.getAll()); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(g1.getWikittyId(), result.peek()); + } + + { + WikittyQuery query = new WikittyQueryMaker() + .like(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "Group*") + .end(); + + WikittyQueryResult<String> result = client.findAllByQuery(query); + + System.out.println("testEq" + result.getAll()); + // FIXME test fail :(. But solr request look like good + // WikittyGroup.name_s_t:Group* +// Assert.assertEquals(2, result.size()); + } + + } + + @Test public void testSelect() throws Exception { // for id for easy debugging WikittyImpl w = new WikittyImpl("g1"); @@ -94,4 +198,108 @@ Assert.assertEquals(1, result.getTotalResult()); } } + + @Test + 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)))"); + + 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)))"); + + System.out.println("Q1:" + q1); + System.out.println("Q2:" + q2); + Assert.assertEquals(q2, q1); + + WikittyGroupImpl g1 = new WikittyGroupImpl(new WikittyImpl("g1")); + g1.setName("Group1"); + WikittyGroupImpl g2 = new WikittyGroupImpl(new WikittyImpl("g2")); + g2.setName("GROUP2"); + WikittyGroupImpl g3 = new WikittyGroupImpl(new WikittyImpl("g3")); + g3.setName("Group3"); + WikittyGroupImpl g4 = new WikittyGroupImpl(new WikittyImpl("g4")); + g4.setName("group4"); + + WikittyTreeNode root = new WikittyTreeNodeImpl(new WikittyImpl("root")); + root.setName("OtherTree"); + + WikittyTreeNode node = new WikittyTreeNodeImpl(new WikittyImpl("node1")); + node.setName("node1"); + node.setParent(root.getWikittyId()); + node.addAttachment(g1.getWikittyId(), g2.getWikittyId()); + + WikittyTreeNode branch = new WikittyTreeNodeImpl(new WikittyImpl("branch")); + branch.setName("OtherBranch"); + branch.setParent(node.getWikittyId()); + + WikittyTreeNode leaf = new WikittyTreeNodeImpl(new WikittyImpl("leaf")); + leaf.setName("leaf"); + leaf.setParent(branch.getWikittyId()); + leaf.addAttachment(g3.getWikittyId(), g4.getWikittyId()); + + client.store(g1, g2, g3, g4, root, node, branch, leaf); + + { + WikittyQuery q0 = parser.parseQuery( + "rootNode IN (WikittyTreeNode.name=OtherTree) AND pathNode IN (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))") + .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( + "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); + WikittyQueryResult<String> q0Result = client.findAllByQuery(q0); + System.out.println("q0Result:" + q0Result); + } + { + WikittyQuery q0 = parser.parseQuery( + "ID={branch, leaf}").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( + "WikittyGroup.name=Group*"); + System.out.println("q0: " + q0); + WikittyQueryResult<String> q0Result = client.findAllByQuery(q0); + System.out.println("q0Result:" + q0Result); + } + + WikittyQueryResult<String> q1Result = client.findAllByQuery(q1); + WikittyQueryResult<String> q2Result = client.findAllByQuery(q2); + + System.out.println("q2Result: " + q2Result); + + Assert.assertEquals(q2Result.getAll(), q1Result.getAll()); + Assert.assertEquals(1, q2Result.size()); + Assert.assertEquals(Collections.singletonList(g3.getWikittyId()), q2Result.getAll()); + } } Modified: trunk/wikitty-solr/src/test/resources/log4j.properties =================================================================== --- trunk/wikitty-solr/src/test/resources/log4j.properties 2012-01-04 17:20:23 UTC (rev 1280) +++ trunk/wikitty-solr/src/test/resources/log4j.properties 2012-01-05 01:39:15 UTC (rev 1281) @@ -28,6 +28,6 @@ log4j.appender.logConsole.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n # Configuration by components -log4j.rootLogger=WARN, logConsole -log4j.category.org.nuiton.wikitty=WARN -#log4j.category.org.apache.solr=DEBUG +log4j.rootLogger=INFO, logConsole +log4j.category.org.nuiton.wikitty.solr=DEBUG +log4j.category.org.apache.solr=WARN
participants (1)
-
bpoussin@users.nuiton.org