Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- 1653 discussions
Author: bpoussin
Date: 2012-01-05 17:56:09 +0100 (Thu, 05 Jan 2012)
New Revision: 1286
Url: http://nuiton.org/repositories/revision/wikitty/1286
Log:
ajout de la documentation sur les d'agregats dans le select (AVG, COUNT, MAX, MIN, SUM)
Modified:
trunk/src/site/rst/user/query.rst
Modified: trunk/src/site/rst/user/query.rst
===================================================================
--- trunk/src/site/rst/user/query.rst 2012-01-05 11:18:10 UTC (rev 1285)
+++ trunk/src/site/rst/user/query.rst 2012-01-05 16:56:09 UTC (rev 1286)
@@ -326,7 +326,7 @@
lieu de l'id. Le select doit toujours être le premier élément de la condition
ou du in. Dans l'exemple suivant au lieu de retourner l'id des employés
en CDI, on retourne leur nom. Si deux personnes avait le même nom, ce nom
- ne serait retourné qu'une seul fois.::
+ ne serait retourné qu'une seule fois.::
WikittyQuery q = new WikittyQueryMaker()
select("Employee.name").eq("Employee.contract", "CDI").end();
@@ -344,6 +344,57 @@
WikittyQuery q = WikittyQueryParser.parse(
"Person.birthday IN (SELECT Event.date WHERE Event.country LIKE france)");
+Il est possible d'ajouter des fonctions d'aggrégats dans le Select. Dans ce cas
+le résultat retourné ne contient qu'un seul élément. L'aggrégat est fait les élements
+retournés (de first à first+Limit)
+
+* AVG fait la moyenne des valeurs, il faut donc que le champs sélectionnés soit
+ un Numeric::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .select("Person.age", Aggregate.AVG).eq("Person.firstname", "Jean").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT AVG Person.age WHERE Person.firstname=Jean");
+
+* COUNT retourne le nombre d'élément retourné::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .select("Person.age", Aggregate.COUNT).eq("Person.firstname", "Jean").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT COUNT Person.age WHERE Person.firstname=Jean");
+
+* MAX retourne la plus grande valeur. MAX peut-etre utilisé sur tout type de champs
+ mais il est plus pertinant sur les champs: Numeric, Date, String::
+
+ // on recherche le plus jeune (plus grande date) des personnes s'appelant Jean
+ WikittyQuery q = new WikittyQueryMaker()
+ .select("Person.birthday", Aggregate.MAX).eq("Person.firstname", "Jean").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT MAX Person.birthday WHERE Person.firstname=Jean");
+
+* MIN retourne la plus petite valeur. MIN peut-etre utilisé sur tout type de champs
+ mais il est plus pertinant sur les champs: Numeric, Date, String::
+
+ // on recherche le plus agé (plus petite date) des personnes s'appelant Jean
+ WikittyQuery q = new WikittyQueryMaker()
+ .select("Person.birthday", Aggregate.MIN).eq("Person.firstname", "Jean").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT MIN Person.birthday WHERE Person.firstname=Jean");
+
+* SUM retourne la somme de tous les nombres. Il faut donc que le champs sélectionné
+ soit un Numeric::
+
+ // fait la somme des facture depuis le début d'année
+ WikittyQuery q = new WikittyQueryMaker()
+ .select("Invoice.amount", Aggregate.SUM).ge("Invoice.date", "01/01/2012").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT SUM Invoice.amount WHERE Invoice.date>=01/01/2012");
+
Recherche sur les arbres
------------------------
1
0
Author: echatellier
Date: 2012-01-05 12:18:10 +0100 (Thu, 05 Jan 2012)
New Revision: 1285
Url: http://nuiton.org/repositories/revision/wikitty/1285
Log:
Update nuiton-utils
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-01-05 11:16:22 UTC (rev 1284)
+++ trunk/pom.xml 2012-01-05 11:18:10 UTC (rev 1285)
@@ -53,7 +53,7 @@
<!-- common versions used in sub-poms -->
<eugeneVersion>2.4.2</eugeneVersion>
- <nuitonUtilsVersion>2.2</nuitonUtilsVersion>
+ <nuitonUtilsVersion>2.4.1</nuitonUtilsVersion>
<nuitonI18nVersion>2.4.1</nuitonI18nVersion>
<processPluginVersion>1.1</processPluginVersion>
<jettyVersion>7.4.2.v20110526</jettyVersion>
1
0
Author: echatellier
Date: 2012-01-05 12:16:22 +0100 (Thu, 05 Jan 2012)
New Revision: 1284
Url: http://nuiton.org/repositories/revision/wikitty/1284
Log:
Update eugene
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-01-05 11:15:51 UTC (rev 1283)
+++ trunk/pom.xml 2012-01-05 11:16:22 UTC (rev 1284)
@@ -52,7 +52,7 @@
<maven3Version>3.0.3</maven3Version>
<!-- common versions used in sub-poms -->
- <eugeneVersion>2.4.1</eugeneVersion>
+ <eugeneVersion>2.4.2</eugeneVersion>
<nuitonUtilsVersion>2.2</nuitonUtilsVersion>
<nuitonI18nVersion>2.4.1</nuitonI18nVersion>
<processPluginVersion>1.1</processPluginVersion>
1
0
Author: echatellier
Date: 2012-01-05 12:15:51 +0100 (Thu, 05 Jan 2012)
New Revision: 1283
Url: http://nuiton.org/repositories/revision/wikitty/1283
Log:
Fix eugene version in it
Modified:
trunk/wikitty-api/src/it/generation/pom.xml
Modified: trunk/wikitty-api/src/it/generation/pom.xml
===================================================================
--- trunk/wikitty-api/src/it/generation/pom.xml 2012-01-05 11:05:28 UTC (rev 1282)
+++ trunk/wikitty-api/src/it/generation/pom.xml 2012-01-05 11:15:51 UTC (rev 1283)
@@ -53,7 +53,7 @@
<properties>
- <eugeneVersion>2.3</eugeneVersion>
+ <eugeneVersion>2.4.2</eugeneVersion>
<!-- default encoding -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1
0
r1282 - in trunk: 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-solr/src/test/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 05 Jan '12
by bpoussin@users.nuiton.org 05 Jan '12
05 Jan '12
Author: bpoussin
Date: 2012-01-05 12:05:28 +0100 (Thu, 05 Jan 2012)
New Revision: 1282
Url: http://nuiton.org/repositories/revision/wikitty/1282
Log:
- ajout du support d'agregat dans le select (AVG, COUNT, MAX, MIN, SUM)
ex: select max Person.age
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Aggregate.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.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/WikittyQueryResult.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/Select.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -117,6 +117,7 @@
new SimpleDateFormat().toPattern(),
"dd/MM/yy",
"dd/MM/yy hh:mm",
+ "yyyyMMdd",
};
public static final String FQ_FIELD_NAME_SEPARATOR = ".";
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -14,6 +14,7 @@
import org.nuiton.wikitty.entities.BusinessEntityImpl;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.query.conditions.Aggregate;
import org.nuiton.wikitty.query.conditions.And;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.Condition;
@@ -851,7 +852,7 @@
}
/**
- * Add {@link Select}, this condition must be first or
+ * Add {@link Select}, this condition must be first or
* @param element le champs dont il faut extraire les donnees
* @return {@code this}
* @see {@link Select}
@@ -860,11 +861,28 @@
return select(new ElementField(element));
}
+ /**
+ * Add {@link Select}, this condition must be first or
+ * @param element le champs dont il faut extraire les donnees
+ * @return {@code this}
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(String element, Aggregate aggregate) {
+ return select(new ElementField(element), aggregate);
+ }
+
/*
* @see {@link Select}
*/
public WikittyQueryMaker select(ElementField element) {
- Condition child = new Select(element);
+ return select(element, null);
+ }
+
+ /*
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(ElementField element, Aggregate aggregate) {
+ Condition child = new Select(element, aggregate);
addOnStack(child);
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -7,13 +7,13 @@
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+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.Condition;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
import org.nuiton.wikitty.query.conditions.Element;
-import org.nuiton.wikitty.query.conditions.ElementExtension;
import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.False;
@@ -59,7 +59,12 @@
*/
@BuildParseTree
public class WikittyQueryParser extends BaseParser<Object> {
-
+
+ public static final String AVG = "AVG";
+ public static final String COUNT = "COUNT";
+ public static final String MAX = "MAX";
+ public static final String MIN = "MIN";
+ public static final String SUM = "SUM";
public static final String SELECT = "SELECT";
public static final String WHERE = "WHERE";
public static final String IN = "IN";
@@ -93,6 +98,11 @@
public Rule icNOT = IgnoreCase(NOT);
public Rule icAND = IgnoreCase(AND);
public Rule icOR = IgnoreCase(OR);
+ public Rule icAVG = IgnoreCase(AVG);
+ public Rule icCOUNT = IgnoreCase(COUNT);
+ public Rule icMAX = IgnoreCase(MAX);
+ public Rule icMIN = IgnoreCase(MIN);
+ public Rule icSUM = IgnoreCase(SUM);
public Rule icSELECT = IgnoreCase(SELECT);
public Rule icWHERE = IgnoreCase(WHERE);
public Rule icIN = IgnoreCase(IN);
@@ -355,9 +365,34 @@
push(new In(toElement(pop(1).toString()), (Condition)pop())));
}
Rule select() {
- return Sequence(icSELECT, space(), field(), push(match()), space(), icWHERE, space(), term(),
- push(new Select(new ElementField(pop(1).toString()), (Condition)pop())));
+ 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())));
}
+ Rule aggregate(Var<Aggregate> aggregate) {
+ return FirstOf(avg(aggregate), count(aggregate), max(aggregate), min(aggregate), sum(aggregate));
+ }
+
+ Rule avg(Var<Aggregate> aggregate) {
+ return Sequence(icAVG, aggregate.set(Aggregate.AVG));
+ }
+
+ Rule count(Var<Aggregate> aggregate) {
+ return Sequence(icCOUNT, aggregate.set(Aggregate.COUNT));
+ }
+
+ Rule max(Var<Aggregate> aggregate) {
+ return Sequence(icMAX, aggregate.set(Aggregate.MAX));
+ }
+
+ Rule min(Var<Aggregate> aggregate) {
+ return Sequence(icMIN, aggregate.set(Aggregate.MIN));
+ }
+
+ Rule sum(Var<Aggregate> aggregate) {
+ return Sequence(icSUM, aggregate.set(Aggregate.SUM));
+ }
+
Rule keyword() {
return Sequence(value(), push(new Keyword(removeQuote(match()))));
}
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -32,7 +32,7 @@
/** nom du critere qui a ete uitilise (peut-etre null) si le critete n'avait pas de nom */
protected String queryName;
- /** indice element in global search result */
+ /** indice of first result in global search result */
protected int first;
/** total number of result if we call the query for all possible result */
protected int totalResult;
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -123,7 +123,7 @@
@Override
public boolean visitEnter(Select o) {
- getQueryMaker().select(o.getElement());
+ getQueryMaker().select(o.getElement(), o.getAggregate());
return true;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-01-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -91,7 +91,11 @@
@Override
public boolean visitEnter(Select o) {
- text += WikittyQueryParser.SELECT + " " + o.getElement().getValue()
+ String agg = "";
+ if (o.getAggregate() != null) {
+ agg = o.getAggregate().name() + " ";
+ }
+ text += WikittyQueryParser.SELECT + " " + agg + o.getElement().getValue()
+ " " + WikittyQueryParser.WHERE + " " + WikittyQueryParser.BRACKET_OPEN;
return true;
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Aggregate.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Aggregate.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Aggregate.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -0,0 +1,14 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Use to aggregate result in Select condition.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public enum Aggregate {
+ AVG, COUNT, MAX, MIN, SUM
+}
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -1,8 +1,6 @@
package org.nuiton.wikitty.query.conditions;
import org.apache.commons.lang.ObjectUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
* Cette condition n'accept pas d'etre utilise dans une autre condition.
@@ -27,17 +25,33 @@
private static final long serialVersionUID = 1L;
+ protected Aggregate aggregate;
protected ElementField element;
public Select(ElementField element) {
this.element = element;
}
+ public Select(ElementField element, Aggregate aggregate) {
+ this.element = element;
+ this.aggregate = aggregate;
+ }
+
public Select(ElementField element, Condition restriction) {
super(restriction);
this.element = element;
}
+ public Select(ElementField element, Aggregate aggregate, Condition restriction) {
+ super(restriction);
+ this.element = element;
+ this.aggregate = aggregate;
+ }
+
+ public Aggregate getAggregate() {
+ return aggregate;
+ }
+
public ElementField getElement() {
return element;
}
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -1,10 +1,14 @@
package org.nuiton.wikitty.storage;
+import java.math.BigDecimal;
+import java.math.MathContext;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.query.FacetSortType;
import org.nuiton.wikitty.query.FacetTopic;
@@ -66,10 +70,13 @@
// on part de facet qui a deja la bonne condition
WikittyQuery querySelect = queryFacet.copy();
querySelect.setLimit(0);
+ // ne surtout pas mettre 0, sinon toutes les valeurs possibles sont
+ // retournee pas seulement celle qui satisfont la contrainte
querySelect.setFacetMinCount(1);
querySelect.setFacetLimit(Integer.MAX_VALUE);
// on force le sort pour toujours utiliser le meme
- querySelect.setFacetSort(FacetSortType.count);
+ querySelect.setFacetSort(FacetSortType.name);
+ // on supprime toutes les facettes, et on ajoute la notre
querySelect.setFacetQuery();
querySelect.setFacetField(select.getElement());
@@ -82,13 +89,89 @@
// creation des resultats via la facette select
List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
- List<String> selectList = new ArrayList<String>(
- Math.min(topics.size(), query.getLimit()));
+ List<String> selectList = new ArrayList<String>(topics.size());
if (query.getFirst() < topics.size()) {
+ // il faut que le premier demande soit inferieur a la taille,
+ // sinon on ne fait rien
+ for (FacetTopic topic : topics) {
+ selectList.add(topic.getTopicName());
+ }
+ }
+
+ boolean sortDesc = query.getSortDescending().contains(select.getElement());
+ // tri selon l'ordre demande
+ if (sortDesc) {
+ // par defaut la facette est deja trie par ordre alphabetique
+ // donc il n'y a qu'a l'inverser pour avoir l'ordre inverse
+ Collections.reverse(selectList);
+ }
+
+ // on ne garde que ce qui est demande
+ if (query.getFirst() < topics.size()) {
int first = query.getFirst();
int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
- for (FacetTopic topic : topics.subList(first, last)) {
- selectList.add(topic.getTopicName());
+ selectList = selectList.subList(first, last);
+ }
+
+ // gestion des agregats
+ if (select.getAggregate() != null) {
+ switch(select.getAggregate()) {
+ case AVG: {
+ // convert all to number
+ BigDecimal result = new BigDecimal(0);
+ for (String s : selectList) {
+ BigDecimal v = WikittyUtil.toBigDecimal(s);
+ result = result.add(v);
+ }
+ result = result.divide(new BigDecimal(selectList.size()));
+ selectList = new ArrayList<String>();
+ selectList.add(WikittyUtil.toString(result));
+ }
+ break;
+ case COUNT: {
+ // convert all to number
+ BigDecimal result = new BigDecimal(selectList.size());
+ selectList = new ArrayList<String>();
+ selectList.add(WikittyUtil.toString(result));
+ }
+ break;
+ case MAX: {
+ if (!selectList.isEmpty()) {
+ String result;
+ if (sortDesc) {
+ result = selectList.get(0);
+ } else {
+ result = selectList.get(selectList.size()-1);
+ }
+ selectList = new ArrayList<String>();
+ selectList.add(WikittyUtil.toString(result));
+ }
+ }
+ break;
+ case MIN: {
+ if (!selectList.isEmpty()) {
+ String result;
+ if (sortDesc) {
+ result = selectList.get(selectList.size()-1);
+ } else {
+ result = selectList.get(0);
+ }
+ selectList = new ArrayList<String>();
+ selectList.add(WikittyUtil.toString(result));
+ }
+ }
+ break;
+ case SUM: {
+ // convert all to number
+ BigDecimal result = new BigDecimal(0);
+ for (String s : selectList) {
+ BigDecimal v = WikittyUtil.toBigDecimal(s);
+ result = result.add(v);
+ }
+ selectList = new ArrayList<String>();
+ selectList.add(WikittyUtil.toString(result));
+ }
+ break;
}
}
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-05 01:39:15 UTC (rev 1281)
+++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java 2012-01-05 11:05:28 UTC (rev 1282)
@@ -1,6 +1,10 @@
package org.nuiton.wikitty.storage.solr;
+import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
@@ -10,6 +14,9 @@
import org.nuiton.util.ApplicationConfig;
import org.nuiton.wikitty.WikittyClient;
import org.nuiton.wikitty.WikittyConfig;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyGroup;
import org.nuiton.wikitty.entities.WikittyGroupImpl;
import org.nuiton.wikitty.entities.WikittyImpl;
@@ -21,7 +28,9 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryParser;
import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Aggregate;
import org.nuiton.wikitty.query.conditions.Element;
+import org.nuiton.wikitty.query.conditions.ElementField;
/**
*
@@ -57,8 +66,116 @@
}
@Test
+ public void testSelectSortAndAggregate() throws Exception {
+ WikittyExtension ext = new WikittyExtension("Test",
+ "1.0", // version
+ WikittyUtil.tagValuesToMap(" version=\"1.0\""), // tag/values
+ (List)null,
+ WikittyUtil.buildFieldMapExtension( // building field map
+ "Numeric number",
+ "String string",
+ "Date date"));
+ Wikitty w1 = new WikittyImpl();
+ w1.addExtension(ext);
+ w1.setField("Test", "number", 5);
+ w1.setField("Test", "date", WikittyUtil.parseDate("02/05/1975"));
+
+ Wikitty w2 = new WikittyImpl();
+ w2.addExtension(ext);
+ w2.setField("Test", "number", -4);
+ w2.setField("Test", "date", WikittyUtil.parseDate("19830606"));
+
+ Wikitty w3 = new WikittyImpl();
+ w3.addExtension(ext);
+ w3.setField("Test", "number", 10);
+ w3.setField("Test", "date", WikittyUtil.parseDate("21/05/2002"));
+
+ Wikitty w4 = new WikittyImpl();
+ w4.addExtension(ext);
+ w4.setField("Test", "number", 1);
+ w4.setField("Test", "date", WikittyUtil.parseDate("05/01/2012"));
+
+ client.store(w1, w2, w3, w4);
+
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number").end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number").end()
+ .addSortDescending(new ElementField("Test", "number"));
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.date").end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.date").end()
+ .addSortDescending(new ElementField("Test", "date"));
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ }
+
+ // test aggregate
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.AVG).end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("3.0", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.COUNT).end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("4", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.MAX).end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("10.0", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.MAX).end()
+ .addSortDescending(new ElementField("Test", "number"));
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("10.0", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.MIN).end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("-4.0", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.MIN).end()
+ .addSortDescending(new ElementField("Test", "number"));
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("-4.0", result.peek());
+ }
+ {
+ WikittyQuery q = new WikittyQueryMaker().select("Test.number", Aggregate.SUM).end();
+ WikittyQueryResult<String> result = client.findAllByQuery(q);
+ System.out.println("q: " + result);
+ Assert.assertEquals("12.0", result.peek());
+ }
+
+ }
+
+ @Test
+ public void testSelectAggregate() throws Exception {
+
+ }
+
+ @Test
public void testFacet() throws Exception {
- // for id for easy debugging
+ // for id for easy debugging
WikittyGroupImpl g1 = new WikittyGroupImpl(new WikittyImpl("g1"));
g1.setName("Group1");
WikittyGroupImpl g2 = new WikittyGroupImpl(new WikittyImpl("g2"));
1
0
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/nuit… $
+ * %%
+ * 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
1
0
Author: maven-release
Date: 2012-01-04 18:20:23 +0100 (Wed, 04 Jan 2012)
New Revision: 1280
Url: http://nuiton.org/repositories/revision/wikitty/1280
Log:
Update mavenpom4redmine to 3.0.7.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-01-03 18:04:34 UTC (rev 1279)
+++ trunk/pom.xml 2012-01-04 17:20:23 UTC (rev 1280)
@@ -6,7 +6,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.6</version>
+ <version>3.0.7</version>
</parent>
<!-- ************************************************************* -->
1
0
Author: bpoussin
Date: 2012-01-03 19:04:34 +0100 (Tue, 03 Jan 2012)
New Revision: 1279
Url: http://nuiton.org/repositories/revision/wikitty/1279
Log:
correction des urls avec des []&
Modified:
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2012-01-03 17:11:50 UTC (rev 1278)
+++ trunk/src/site/site_en.xml 2012-01-03 18:04:34 UTC (rev 1279)
@@ -48,7 +48,7 @@
<menu name="Overview">
<item name="Home" href="index.html"/>
- <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&…"/>
<item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2012-01-03 17:11:50 UTC (rev 1278)
+++ trunk/src/site/site_fr.xml 2012-01-03 18:04:34 UTC (rev 1279)
@@ -50,7 +50,7 @@
<item name="Accueil" href="index.html"/>
<item name="Fonctionnalités" href="features.html"/>
<item name="Fonctionnement" href="fonctionnement.html"/>
- <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&…"/>
<item name="Téléchargement" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
1
0
03 Jan '12
Author: bpoussin
Date: 2012-01-03 18:11:50 +0100 (Tue, 03 Jan 2012)
New Revision: 1278
Url: http://nuiton.org/repositories/revision/wikitty/1278
Log:
support Calendar as valid object to toDate method
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
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-03 16:10:28 UTC (rev 1277)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-03 17:11:50 UTC (rev 1278)
@@ -535,6 +535,8 @@
if (value != null) {
if (value instanceof Date) {
result = (Date) value;
+ } else if (value instanceof Calendar) {
+ result = ((Calendar)value).getTime();
} else {
// try to convert to Date
try {
1
0
r1277 - in trunk: src/site src/site/en/rst src/site/rst src/site/rst/devel src/site/rst/user wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query
by bpoussin@users.nuiton.org 03 Jan '12
by bpoussin@users.nuiton.org 03 Jan '12
03 Jan '12
Author: bpoussin
Date: 2012-01-03 17:10:28 +0100 (Tue, 03 Jan 2012)
New Revision: 1277
Url: http://nuiton.org/repositories/revision/wikitty/1277
Log:
documentation de l'API query fini
relecture de toute la documentation
quelques modifs de code suite a la relecture de la doc
- parser de query ignore la case des OR, AND, NOT, TO, IN, SELECT, WHERE
Added:
trunk/src/site/rst/devel/
trunk/src/site/rst/devel/Spec.rst
Removed:
trunk/src/site/en/rst/changes.rst
trunk/src/site/rst/Spec.rst
trunk/src/site/rst/changes.rst
trunk/src/site/rst/todo.rst
Modified:
trunk/src/site/rst/features.rst
trunk/src/site/rst/fonctionnement.rst
trunk/src/site/rst/index.rst
trunk/src/site/rst/user/faq.rst
trunk/src/site/rst/user/generation.rst.vm
trunk/src/site/rst/user/hessian.rst
trunk/src/site/rst/user/migration.rst
trunk/src/site/rst/user/query.rst
trunk/src/site/rst/user/security.rst
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
Deleted: trunk/src/site/en/rst/changes.rst
===================================================================
--- trunk/src/site/en/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/en/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,38 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-Changes
-=======
-
-TreeNode
---------
-
-Since 2.2, attribute "children" in tree node has been renamed to "attachment"
-du to confusion between attached wikitty and sub node children.
-
-TreeNode extension version has been increased to ``2.0``.
-
-You will need to migrate_ your wikitties.
-
-.. _migrate: migration.html
\ No newline at end of file
Deleted: trunk/src/site/rst/Spec.rst
===================================================================
--- trunk/src/site/rst/Spec.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,167 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-
-Ce document est fait pour contenir toutes les normalisations autour de Wikitty
-
-Identifiant des wikitties
-=========================
-
-Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les
-identifiants commencent par un UUID et peuvent être séparé d'une extension
-spécifique pour certains besoins par un '_' (underscore).
-
-C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois
-des exceptions :
-* Pour les méta-extensions : chacun des wikitties aura pour
-identifiant par exemple « WikittySecurity:MonExtension ».
-Cela permet de court-cuircuiter la recherche solR, et un passage par
-le réseau à chaque store/restore.
-
-Un wikitty en base a toujours un identifiant, dès instanciation.
-
-WikittyServiceNotifier
-======================
-
-Tous les évènements passant par le WikittyServiceNotifier sont envoyé au
-RemoteNotifier s'il est indiqué, dans la configuratio,n qu'il faut propager les
-évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas
-définir le transporter à utiliser (wikitty.notifier.transporter.class).
-
-Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le
-même transporter doit être utilisé pour le client et le serveur.
-
-Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp).
-L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il
-est donc préférable d'utiliser le transporter xmpp.
-
-Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier
-avec des transporters différents coté serveur pour permettre à différents
-types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est
-pas actuellement possible de configurer ce fonctionnement)
-
-Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec
-une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas
-besoin que la room soit archivée.
-
-Synchronisation de serveur
-==========================
-
-On peut avoir besoin d'avoir deux serveurs qui soit synchronisé.
-Actuellement il n'existe que du maitre/esclave.
-
-Pour mettre en place la synchronisation il faut que le serveur maitre
-utilise la couche de notification avec le transporter xmpp. Il faut que la
-room xmpp soit archivée.
-
-Pour que la synchornisation fonctionne il faut:
-- garantir que tous les events soient bien envoyés
-- garantir que tous les events soitent bien reçus
-
-et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le
-serveur s'arrête plus aucun event ne sera produit. Il faut seulement
-garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien
-envoyé aux clients.
-
-Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il
-stocke et qu'il incrémentera et réutilisera pour l'envoi suivant.
-
-Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture
-dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer
-les numeros manquants. (il redemande l'historique des messages pour les N
-messages qui lui manque)
-
-A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur
-(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event
-reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données
-reçu (pas de rupture détectée dans la sequence des events).
-
-Lorsque le client démarera pour la 1ère fois, il faut que la base de données
-ait été remplie manuellement, son indexe recréer, et le fichier de synchro
-créé convenablement.
-
-Lorsque le client redémarre après un arrêt, il redemande l'historique depuis
-la date du fichier de synchro.
-
-Le numéro unique d'event est généré par la couche de persistance et stocké
-sur le serveur en même temps que les données.
-
-
-Deux types de client:
-- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent
-- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau)
-
-Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir
-envoyer régulièrement les infos de notification.
-Si un client volatile disparait (impossible de lui envoyer l'info), on
-l'enleve de la liste des clients a prevenir
-Si un client persistant disparait, on met dans une file toutes les
-notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a
-manqué lorsqu'il sera de retour. (utile pour la synchro serveur)
-
-Localisation
-============
-
-Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty.
-
-Cette pseudo-extension a deux champs :
-* language String
-* translation String
-
-personne:wikittyI18n.language=fr,en,es
-personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname]
-personne.name=value
-
-ton extension : security des champs de sécurité
-ton extension : i18n des champs i18n
-ton extension.champs=valeur dans la langue
-
-un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues,
-tu charges plusieurs fois le wikitty.
-
-du coup ton wikitty a une version et une langue.
-On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée.
-si pas de i18n, du coup c'est la langue par défaut à chaque fois.
-
-Au moins les writers peuvent créer une nouvelle langue.
-
-pas de sécurité par langue, trop le bordel !
-
-il serait agréable que seules les extensions demandées soient chargées.
-
-dans les restore il faut ajouter (extensions, id, + préchargement d'extensions)
-
-attention au moment de la migration
-au moment du chargement
-
-
-
-
-On ajoute WikittyService#allowTranslation(token, extension, boolean)
-
-
-Pseudo extension
-================
-
-migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null.
Deleted: trunk/src/site/rst/changes.rst
===================================================================
--- trunk/src/site/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,37 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-Changements
-===========
-
-TreeNode
---------
-
-Depuis la version 2.2, l'attribut "children" des TreeNode a été renommé en
-"attachment" pour éviter la confusion entre les wikitty attachés à un noeud et
-les noeuds fils.
-
-Vous aurez besoin de migrer_ vos Wikitty.
-
-.. _migrer: migration.html
\ No newline at end of file
Added: trunk/src/site/rst/devel/Spec.rst
===================================================================
--- trunk/src/site/rst/devel/Spec.rst (rev 0)
+++ trunk/src/site/rst/devel/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -0,0 +1,167 @@
+.. -
+.. * #%L
+.. * Wikitty
+.. *
+.. * $Id: Spec.rst 1136 2011-08-12 14:24:03Z tchemit $
+.. * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/src/site/rst/Spec.rst $
+.. * %%
+.. * 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%
+.. -
+
+Ce document est fait pour contenir toutes les normalisations autour de Wikitty
+
+Identifiant des wikitties
+=========================
+
+Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les
+identifiants commencent par un UUID et peuvent être séparé d'une extension
+spécifique pour certains besoins par un '_' (underscore).
+
+C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois
+des exceptions :
+* Pour les méta-extensions : chacun des wikitties aura pour
+identifiant par exemple « WikittySecurity:MonExtension ».
+Cela permet de court-cuircuiter la recherche solR, et un passage par
+le réseau à chaque store/restore.
+
+Un wikitty en base a toujours un identifiant, dès instanciation.
+
+WikittyServiceNotifier
+======================
+
+Tous les évènements passant par le WikittyServiceNotifier sont envoyé au
+RemoteNotifier s'il est indiqué dans la configuration, qu'il faut propager les
+évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas
+définir le transporter à utiliser (wikitty.notifier.transporter.class).
+
+Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le
+même transporter doit être utilisé pour le client et le serveur.
+
+Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp).
+L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il
+est donc préférable d'utiliser le transporter xmpp.
+
+Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier
+avec des transporters différents coté serveur pour permettre à différents
+types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est
+pas actuellement possible de configurer ce fonctionnement)
+
+Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec
+une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas
+besoin que la room soit archivée.
+
+Synchronisation de serveur
+==========================
+
+On peut avoir besoin d'avoir deux serveurs qui soit synchronisé.
+Actuellement il n'existe que du maitre/esclave.
+
+Pour mettre en place la synchronisation il faut que le serveur maitre
+utilise la couche de notification avec le transporter xmpp. Il faut que la
+room xmpp soit archivée.
+
+Pour que la synchornisation fonctionne il faut:
+- garantir que tous les events soient bien envoyés
+- garantir que tous les events soitent bien reçus
+
+et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le
+serveur s'arrête plus aucun event ne sera produit. Il faut seulement
+garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien
+envoyé aux clients.
+
+Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il
+stocke et qu'il incrémentera et réutilisera pour l'envoi suivant.
+
+Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture
+dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer
+les numeros manquants. (il redemande l'historique des messages pour les N
+messages qui lui manque)
+
+A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur
+(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event
+reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données
+reçu (pas de rupture détectée dans la sequence des events).
+
+Lorsque le client démarera pour la 1ère fois, il faut que la base de données
+ait été remplie manuellement, son indexe recréer, et le fichier de synchro
+créé convenablement.
+
+Lorsque le client redémarre après un arrêt, il redemande l'historique depuis
+la date du fichier de synchro.
+
+Le numéro unique d'event est généré par la couche de persistance et stocké
+sur le serveur en même temps que les données.
+
+
+Deux types de client:
+- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent
+- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau)
+
+Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir
+envoyer régulièrement les infos de notification.
+Si un client volatile disparait (impossible de lui envoyer l'info), on
+l'enleve de la liste des clients a prevenir
+Si un client persistant disparait, on met dans une file toutes les
+notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a
+manqué lorsqu'il sera de retour. (utile pour la synchro serveur)
+
+Localisation
+============
+
+Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty.
+
+Cette pseudo-extension a deux champs :
+* language String
+* translation String
+
+personne:wikittyI18n.language=fr,en,es
+personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname]
+personne.name=value
+
+ton extension : security des champs de sécurité
+ton extension : i18n des champs i18n
+ton extension.champs=valeur dans la langue
+
+un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues,
+tu charges plusieurs fois le wikitty.
+
+du coup ton wikitty a une version et une langue.
+On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée.
+si pas de i18n, du coup c'est la langue par défaut à chaque fois.
+
+Au moins les writers peuvent créer une nouvelle langue.
+
+pas de sécurité par langue, trop le bordel !
+
+il serait agréable que seules les extensions demandées soient chargées.
+
+dans les restore il faut ajouter (extensions, id, + préchargement d'extensions)
+
+attention au moment de la migration
+au moment du chargement
+
+
+
+
+On ajoute WikittyService#allowTranslation(token, extension, boolean)
+
+
+Pseudo extension
+================
+
+migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null.
Modified: trunk/src/site/rst/features.rst
===================================================================
--- trunk/src/site/rst/features.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/features.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -43,25 +43,24 @@
Wikitty fournit un système de gestion des droits en lecture et en écriture pour
les entitées. Vous pouvez aller jusqu'à limiter l'accès à certains objet d'un
type à certains utilisateurs. Vous pouvez également accorder des droits
-différents à certains champs des objets.
+différents à certains groupes de champs des objets (sécurité au niveau des extensions).
Prenons par example un objet Employe.
Cet objet peut avoir des champs de type salaire,... qui ne sont modifiables que
-par les memebres du service RH, mais visibles par l'employé, alors que les
+par les membres du service RH, mais visibles par l'employé, alors que les
champs adresse par example sont modifiables par l'employé et les membres du
service RH.
Transactions
~~~~~~~~~~~~
-Wikitty fournit un système de transactions qui embarque une base locale H2 et un
-index SolR. A la lecture des données, il recherche dans la base locale puis dans
-la base de donnée s'il ne trouve pas la donnée. Lorsqu'il écrit une donnée, il
-l'écrit dans la base locale. Au commit de la transaction, toutes les opérations
-sont envoyées à la base de donnée Wikitty, si un problème survient (mauvais
-droits, ...), la transaction n'est pas enregistrée. Pour les recherches, une
-fusion est opérée entre les résultats sur la base locale et ceux sur la
-base Wikitty.
+Wikitty fournit un système de transactions. A la lecture des données, il
+recherche dans la transaction puis dans la base de donnée s'il ne trouve pas la
+donnée. Lorsqu'il écrit une donnée, il l'écrit dans la transaction. Au commit de
+la transaction, toutes les opérations sont envoyées à la base de donnée Wikitty,
+si un problème survient (mauvais droits, ...), la transaction n'est pas
+enregistrée. Pour les recherches, une fusion est opérée entre les résultats sur
+la transaction et ceux sur la base Wikitty.
Notifications
~~~~~~~~~~~~~
Modified: trunk/src/site/rst/fonctionnement.rst
===================================================================
--- trunk/src/site/rst/fonctionnement.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/fonctionnement.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -64,8 +64,8 @@
Le coeur de Wikitty apporte les services de base:
- génération de Bean métier pour une utilisation simple par le développeur
-- une classe WikittyProxy qui masque les objets Wikitty et manipule les Bean
- métier généré
+- une classe WikittyClient qui masque les objets Wikitty et manipule les Bean
+ métier généré et offre tout un ensemble de service complémentaire.
- Création, sauvegarde, restoration des Entités
- Recherche des entités (fulltext, facette, ...)
- notion d'arbre
@@ -98,22 +98,22 @@
Les nouveaux services (cache, securité, notification, ...) s'intercale en
couche au dessus du coeur pour founir les services.
-Le coeur delegue le travail à trois services qui peuvent être implanté avec
+Le coeur délègue le travail à trois services qui peuvent être implanté avec
des techologies différentes:
-- stockage des extensions (memoire, jdbc, hbase, jpa, ...)
-- stockage des données (memoire, jdbc, hbase, jpa, ...)
-- indexation et recherche (memoire, SolR, ...)
+- stockage des extensions (mémoire, jdbc, hbase, jpa, ...)
+- stockage des données (mémoire, jdbc, hbase, jpa, ...)
+- indexation et recherche (mémoire, SolR, ...)
Il est donc possible d'ajouter de nouveau service de haut niveau, ou
d'ajouter de nouvelle façon de stocker l'information.
-Pour certain besoin il n'y a pas besoin d'implanter une nouvelle
+Pour certain besoin il n'y a pas d'obligation d'implanter une nouvelle
chouche (WikittyService). On parle alors de AddOn. C'est addon travail
directement grace à l'API WikittyService, c'est le cas par exemple de
l'import/export.
-La partie cliente des applications ne travail qu'avec le WikittyProxy qui
+La partie cliente des applications ne travail qu'avec le WikittyClient qui
masque la notion d'objet Wikitty pour retourner des beans metiers facilement
manipulable par le développeur.
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/index.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -96,7 +96,7 @@
- Migration
- Import/Export
- Réplication
-- Label
+- Label/Groupe
Pour plus d'informations sur les différentes fonctionnalités, référez-vous à la
`page correspondante`_
@@ -154,5 +154,3 @@
.. image:: schemes/multiServerDeployment.png
-
-
Deleted: trunk/src/site/rst/todo.rst
===================================================================
--- trunk/src/site/rst/todo.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/todo.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,31 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-TODO
-====
-
-Code
-----
-
-- Voir pour changer la WikittyExtension en non-RuntimeException
Modified: trunk/src/site/rst/user/faq.rst
===================================================================
--- trunk/src/site/rst/user/faq.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/faq.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -47,7 +47,7 @@
WikittyGroup privateGroup = getPrivateGroup();
// Récupère l'utilisateur authentifié
-WikittyUser user = getLoggedInUser();
+WikittyUser user = wikittyClient.getUser();
// Récupère les membres du privateGroup
Set<String> members = privateGroup.getMembers();
Modified: trunk/src/site/rst/user/generation.rst.vm
===================================================================
--- trunk/src/site/rst/user/generation.rst.vm 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/generation.rst.vm 2012-01-03 16:10:28 UTC (rev 1277)
@@ -93,8 +93,8 @@
chaîne de caractère. En fait, dans vos entité Wikitty, un lien vers un autre
Wikitty estreprésenté par son identifiant qui est une chaîne de caractères.
Ainsi, un getXXXXX vous retournera l'identifiant d'un Wikitty qu'il faudra
-récupérer en passant par le proxy. Vous pouvez alors utiliser le cache pour
-limiter les appels côté serveur.
+récupérer en passant par le WikittyClient. Vous pouvez alors utiliser le cache
+pour limiter les appels côté serveur.
Subtilités de modélisation
==========================
@@ -104,7 +104,7 @@
Il est possible de rajouter une dépendance vers un objet de l'API Wikitty (par
example WikittyUser) en rajoutant simplement la classe dans votre modèle dans le
-package* org.nuiton.wikitty.api*. Elle ne sera pas générée mais interviendra
+package *org.nuiton.wikitty.entities*. Elle ne sera pas générée mais interviendra
comme une autre classe de votre modèle (héritage,...).
.. image:: wikittyDependency.png
Modified: trunk/src/site/rst/user/hessian.rst
===================================================================
--- trunk/src/site/rst/user/hessian.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/hessian.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -32,7 +32,7 @@
* d'une application war qui, en lisant une configuration, est capable de
fournir un service sur n'importe quel type de stockage wikitty
- * d'une factory revoyant un proxy sur un service distant
+ * d'une factory revoyant un proxy hessian sur un service distant
Serveur
-------
@@ -69,7 +69,7 @@
wikitty.service.cache.listenevents=true
# solr configuration
- solr.data.dir=/var/lib/myapp/solr
+ solr.data.dir=/var/local/myapp/solr
L'application est ensuite accessible sur l'uri "/wikitty" suivant le contexte
de déploiement.
Modified: trunk/src/site/rst/user/migration.rst
===================================================================
--- trunk/src/site/rst/user/migration.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/migration.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,11 +48,11 @@
enregistrer toutes les extensions dont votre application a besoin dans leur
dernière version::
- store(myExtension);
+ wikittyClient.storeExtension(myExtension);
ou::
- store(myEntityImpl.extensionMyEntity)
+ wikittyClient.storeExtension(myEntityImpl.extensionMyEntity)
Si vous avez des migrations spécifiques à effectuer, ajoutez au registre toutes
les migrations spécifiques des extensions::
@@ -62,17 +62,29 @@
Vous pouvez maintenant utiliser vos données simplement, elles seront migrées
au chargement.
-Si vous voulez migrer vos objets avant de les utiliser (pour des histoires de
-requêtes par exemple), pour chaque version, recherchez vos objets, restaurez
-les puis enregistrez-les::
+Si vous voulez migrer vos objets avant de les utiliser (pour quelle soit
+convenablement indexée par exemple), pour chaque version, recherchez vos objets,
+restaurez les puis enregistrez-les::
- search(Client)
- restore(Client)
- store(Client)
+ WikittyQueryResult<Client> all = wikittyClient.findAllByExample(new Client());
+ wikittyClient.store(all.getAll());
Attention au coût d'une indexation au vu du volume de données, il n'est pas
-toujours judicieux de réindexer toutes les données.
+toujours judicieux de réindexer toutes les données. Si vous avez beaucoup
+d'objet, il est potentiellement judicieux d'utiliser la pagination pour restaurer
+les objets par paquet de 1000 par exemple.
+ int LIMIT = 1000;
+ int first = 0;
+ Client example = new Client();
+ WikittyQueryResult<Client> all = wikittyClient.findAllByExample(example, first, LIMIT);;
+ while (all.size() >= LIMIT) {
+ wikittyClient.store(all.getAll());
+ first += LIMIT;
+ all = wikittyClient.findAllByExample(example, first, LIMIT);
+ }
+ wikittyClient.store(all.getAll());
+
Migrations spécifiques
======================
Modified: trunk/src/site/rst/user/query.rst
===================================================================
--- trunk/src/site/rst/user/query.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/query.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -258,7 +258,6 @@
* False : rFalse - retourne toujours faux::
-
WikittyQuery q = new WikittyQueryMaker()
.rFalse().end();
@@ -277,18 +276,108 @@
* Les noeuds à sous requêtes permettent de faire des requêtes complexes.
-* Non : not - Résultat inverse de la sous-requête.
+* Non : not - Résultat inverse de la sous-requête. Permet de faire la négation
+ d'une condition. On ne peut ajouter qu'un condition dans un not, il faut
+ donc ajouter en premier un or ou un and pour mettre plusieurs condition::
-* Ou : or - Ou entre les différentes sous-requêtes.
+ WikittyQuery q = new WikittyQueryMaker()
+ .not().rFalse().end(); // condition toujours vrai
-* Et : and - Et entre les différentes sous-requêtes.
+ WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE)");
-* Requête associée : in - Permet d'effectuer des jointures.
+ WikittyQuery q = new WikittyQueryMaker()
+ .not().or().rFalse().rFalse().rTrue().end(); // condition toujours fausse
+ WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE OR FALSE OR TRUE)");
+
+* Ou : or - Ou entre les différentes sous-requêtes. On peut ajouter autant
+ d'élément dans le or que l'on souhaite, en fait les éléments lui sont ajouté
+ tant qu'il n'est pas fermé (close).
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .or().rFalse().rTrue().rFalse().end(); // condition toujours vrai
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE OR TRUE OR FALSE");
+
+* Et : and - Et entre les différentes sous-requêtes. On peut ajouter autant
+ d'élément dans le and que l'on souhaite, en fait les éléments lui sont ajouté
+ tant qu'il n'est pas fermé (close).
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().rFalse().rTrue().rTrue().end(); // condition toujours fausse
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE AND TRUE AND TRUE");
+ WikittyQuery q = WikittyQueryParser.parse("FALSE TRUE TRUE");
+
+* Requête associée : in - Permet d'effectuer des jointures. Cette opérateur lie
+ deux requêtes entres elle. Le résultat d'un requête est utilisé comme un
+ containsOne dans l'autre. La requête suivante recherche tous les employers
+ en CDI, mais seulement ceux dont le nom de leur entreprise contient 'lutin'.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ and()
+ .eq("Employee.contract", "CDI")
+ .in("Employee.company").like("Company.name", "*Lutin*").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "Employee.contract=CDI AND Employee.company in (Company.name LIKE *Lutin*)");
+
* Selection : select - Ajout d'un select pour définir le champs à retourner au
- lieu de l'id
+ lieu de l'id. Le select doit toujours être le premier élément de la condition
+ ou du in. Dans l'exemple suivant au lieu de retourner l'id des employés
+ en CDI, on retourne leur nom. Si deux personnes avait le même nom, ce nom
+ ne serait retourné qu'une seul fois.::
+ WikittyQuery q = new WikittyQueryMaker()
+ select("Employee.name").eq("Employee.contract", "CDI").end();
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT Employee.name WHERE Employee.contract=CDI");
+
+ Il est possible de coupler le select et le in, par exemple pour recherche
+ toutes les personnes nés le même jour qu'un évênement qui a eu lieu en france::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .in("Person.birthday")
+ .select("Event.date").like("Event.country", "france").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "Person.birthday IN (SELECT Event.date WHERE Event.country LIKE france)");
+
+Spécificité de WikittyQueryMaker
+--------------------------------
+
+* Fermeture d'un noeud: close. Lorsqu'on ouvre un element a sous noeud comme
+ or, and, not, in, select, il faut pouvoir le fermer pour continuer la
+ construction de la condition. Pour cela on utilise close(), qui ferme la
+ derniere condition non terminal.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().or()....close(/*fermeture du or*/).close(/*fermeture du or*/)
+ .not().and().....end(/*fermeture de tous les elements non ferme (and, not)*/);
+
+* conversion de type: Il est possible de passer en argument des méthodes des
+ objets qui seront directement converti en leur representation String. Les
+ types supportés sont BusinessEntity, Wikitty, Date, Calendar, Number, Boolean.
+ Pour un objet Wikitty ou un BusinessEntity on utilise l'id.
+
+* wikitty: Normalement si l'on passe un wikitty en parametre de méthode
+ de WikittyQueryMaker, la condition se fait sur l'id, mais on peut vouloir
+ que le Wikitty soit pris comme exemple de condition (query by exemple)
+ Dans ce cas, on peut utiliser::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .wikitty(monWikitty).end();
+
+* Condition: Il est aussi possible d'ajouter toutes une condition déjà
+ construite pour l'intégrer à une nouvelle. Dans ce cas cette condition est
+ prise comme une boîte noir, c'est dire comme une condition terminal.::
+
+ WikittyQuery qold = ...
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().condition(qold).eq(...).end();
+
Recherche avancée
-----------------
@@ -332,23 +421,31 @@
* Nom : name - Nommage de la requêtes.
-* Les requêtes permettent d'ajouter un ordre ou des facettes :
+* Premier index : first - Permet de définir le premier index à retourner.
+ Principalement utilisé pour la pagination.
-* Premier index : first - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination.
+* Nombre : limit - Permet de définir le nombre de résultat à retourner.
+ Principalement utilisé pour la pagination.
-* Nombre : limit - Permet de définir le dernier index à retourner. Principalement utilisé pour la pagination.
+* facetMinCount: les topics des facettes ayant moins d'occurence que cette valeur
+ ne sont pas retournés
-* [TODO] facetMinCount
+* facetLimit: les facettes ramenent au plus se nombre de topics
-* [TODO] facetLimit
+* facetSort: determine l'ordre de tri des topics, il est possible de trier sur
+ le nombre d'occurence du topic ou le nom du topic
-* [TODO] facetSort
+* facetExtension indique de créer une facette sur les extensions des wikitties
-* [TODO] facetExtension
+* facetField indique de créer une facette sur un champs
-* [TODO] facetField
+* facetQuery indique de créer une facette grace a une condition. Par exemple au
+ lieu de creer une facette sur Product.price qui retournerait trop de topics
+ il est préférable de créer plusieur facetQuery pour regrouper des prix::
-* [TODO] facetQuery
+ query.addFacetQuery("0-5", new WikittyQueryMaker().bw("Product.price", 0, 5));
+ query.addFacetQuery("5-10", new WikittyQueryMaker().bw("Product.price", 5, 10));
+ query.addFacetQuery("10-+", new WikittyQueryMaker().gt("Product.price", 10));
* Tri : sortAscending - Ajout d'un ou plusieurs champs pour le tri ascendant du résultat.
Modified: trunk/src/site/rst/user/security.rst
===================================================================
--- trunk/src/site/rst/user/security.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/security.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -44,6 +44,30 @@
Cela rajoute la couche de sécurité à Wikitty. Vous pouvez maintenant rajouter
des droits à certaines entitées pour en limiter l'accès.
+Si vous souhaitez utiliser le module de cache en même temps que le module
+de sécurité, cela implique une bonne utilisation et de faire attention à certaine
+chose. Il faut faire attention qu'un utilisateur qui a récupéré un objet ne le
+rende pas disponible à un autre utilisateur au travers du cache.
+Il faut donc que la couche de sécurité soit toujours au dessus de la couche de
+cache.
+
+De la même façon, si l'on a mis du cache côté client dans certain cas, il faudra
+aussi remettre la couche de sécurité. Cela arrive si le côté client est
+multi-utilisateur. Si ce n'est pas le cas, il n'est pas nécessaire de le faire.
+
+::
+
+ +--------------+ +--------------+
+ WClient ----->| sécurité |<----+ | sécurité |<------ WClient
+ +--------------+ | +--------------+
+ | cache | | | cache |
+ +--------------+ | +--------------+
+ | notification | | | notification |
+ +--------------+ | +--------------+
+ | WS Impl | +----| WS Hessian |
+ +--------------+ +--------------+
+ serveur client
+
Utilisateurs et groupes
-----------------------
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/site_en.xml 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,7 +48,8 @@
<menu name="Overview">
<item name="Home" href="index.html"/>
- <item name="Changes" href="changes.html"/>
+ <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
<menu name="User">
@@ -57,12 +58,8 @@
</menu>
<menu name="Developer">
- <item name="Todo" href="todo.html"/>
- </menu>
-
- <menu name="Community">
+ <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/>
<item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/>
- <item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
<item name="SVN Repository" href="http://svn.nuiton.org/svn/wikitty/"/>
<item name="Continuous Integration" href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
<item name="Sonar analysis" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/site_fr.xml 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,10 +48,10 @@
<menu name="Overview">
<item name="Accueil" href="index.html"/>
- <item name="Fonctionnement" href="fonctionnement.html"/>
<item name="Fonctionnalités" href="features.html"/>
- <item name="Changements" href="changes.html"/>
- <item name="Spécifications" href="Spec.html"/>
+ <item name="Fonctionnement" href="fonctionnement.html"/>
+ <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Téléchargement" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
<menu name="Utilisateur">
@@ -59,27 +59,19 @@
<item name="Migration" href="user/migration.html"/>
<item name="Hessian" href="user/hessian.html"/>
<item name="Sécurité" href="user/security.html"/>
- <item name="Recherche" href="user/search.html"/>
+ <item name="Recherche" href="user/query.html"/>
<item name="FAQ" href="user/faq.html"/>
</menu>
<menu name="Developpeur">
- <item name="Todo" href="todo.html"/>
+ <item name="Spécifications" href="devel/Spec.html"/>
+ <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/>
+ <item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/>
+ <item name="Dépot SVN" href="http://svn.nuiton.org/svn/wikitty/"/>
+ <item name="Intégration continue" href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
+ <item name="Analyse Sonar" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
</menu>
- <menu name="Communauté">
- <item name="Bug tracker"
- href="http://nuiton.org/projects/wikitty/issues"/>
- <item name="Téléchargement"
- href="http://nuiton.org/projects/wikitty/files"/>
- <item name="Dépot SVN"
- href="http://svn.nuiton.org/svn/wikitty/"/>
- <item name="Intégration continue"
- href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
- <item name="Analyse Sonar"
- href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
- </menu>
-
<menu ref="modules"/>
<menu ref="reports"/>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -83,9 +83,9 @@
public WikittyClient(ApplicationConfig config) {
if (config != null) {
long timeToLogInfo = config.getOptionAsInt(WikittyConfigOption.
- WIKITTY_PROXY_TIME_TO_LOG_INFO.getKey());
+ WIKITTY_CLIENT_TIME_TO_LOG_INFO.getKey());
long timeToLogWarn = config.getOptionAsInt(WikittyConfigOption.
- WIKITTY_PROXY_TIME_TO_LOG_WARN.getKey());
+ WIKITTY_CLIENT_TIME_TO_LOG_WARN.getKey());
timeLog.setTimeToLogInfo(timeToLogInfo);
timeLog.setTimeToLogWarn(timeToLogWarn);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -283,16 +283,28 @@
+ " this room must have history activated"),
"test(a)conference.im.codelutin.com",
String.class, false, false),
+ @Deprecated
WIKITTY_PROXY_TIME_TO_LOG_INFO(
"wikitty.proxy.timeToLog.info",
n_("maximum time before send log info with time consumed"),
"1000",
Integer.class, false, false),
+ @Deprecated
WIKITTY_PROXY_TIME_TO_LOG_WARN(
"wikitty.proxy.timeToLog.warn",
n_("maximum time before send log warn with time consumed"),
"3000",
Integer.class, false, false),
+ WIKITTY_CLIENT_TIME_TO_LOG_INFO(
+ "wikitty.client.timeToLog.info",
+ n_("maximum time before send log info with time consumed"),
+ "1000",
+ Integer.class, false, false),
+ WIKITTY_CLIENT_TIME_TO_LOG_WARN(
+ "wikitty.client.timeToLog.warn",
+ n_("maximum time before send log warn with time consumed"),
+ "3000",
+ Integer.class, false, false),
WIKITTY_SECURITY_TIME_TO_LOG_INFO(
"wikitty.security.timeToLog.info",
n_("maximum time before send log info with time consumed"),
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-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -93,6 +93,21 @@
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 icNOT = IgnoreCase(NOT);
+ public Rule icAND = IgnoreCase(AND);
+ public Rule icOR = IgnoreCase(OR);
+ public Rule icSELECT = IgnoreCase(SELECT);
+ public Rule icWHERE = IgnoreCase(WHERE);
+ public Rule icIN = IgnoreCase(IN);
+ public Rule icTO = IgnoreCase(TO);
+ public Rule icFALSE = IgnoreCase(FALSE);
+ public Rule icTRUE = IgnoreCase(TRUE);
+ public Rule icLIKE = IgnoreCase(LIKE);
+ public Rule icUNLIKE = IgnoreCase(UNLIKE);
+ public Rule icNULL = IgnoreCase(NULL);
+
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(WikittyQueryParser.class);
@@ -165,7 +180,7 @@
}
Rule or() {
- return Sequence(and(), ZeroOrMore(space(), OR, space(), and(),
+ return Sequence(and(), ZeroOrMore(space(), icOR, space(), and(),
push(new Or((Condition)pop(1), (Condition)pop()))));
}
@@ -173,7 +188,7 @@
return Sequence(term(), ZeroOrMore(
// when no AND or OR is used, AND is default
// don't change order of FirstOf, this order is important
- FirstOf(Sequence(space(), AND, space()), Sequence(space(), TestNot(OR))),
+ FirstOf(Sequence(space(), icAND, space()), Sequence(space(), TestNot(icOR))),
term(),
push(new And((Condition)pop(1), (Condition)pop()))));
}
@@ -196,7 +211,7 @@
}
Rule not() {
- return Sequence(space(), NOT, space(), term(),
+ return Sequence(space(), icNOT, space(), term(),
push(new Not((Condition)pop())));
}
@@ -205,7 +220,7 @@
* @return
*/
Rule isNull() {
- return Sequence(field(), push(match()), space(), EQUALS, space(), IgnoreCase(NULL),
+ return Sequence(field(), push(match()), space(), EQUALS, space(), icNULL,
push(new Null(toElement(pop().toString()))));
}
@@ -214,7 +229,7 @@
* @return
*/
Rule isNotNull() {
- return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), IgnoreCase(NULL),
+ return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), icNULL,
push(new NotNull(toElement(pop().toString()))));
}
@@ -253,16 +268,16 @@
push(new GreaterOrEquals(toElement(pop().toString()), removeQuote(match()))));
}
Rule like() {
- return Sequence(field(), push(match()), space(), LIKE, space(), value(),
+ return Sequence(field(), push(match()), space(), icLIKE, space(), value(),
push(new Like(toElement(pop().toString()), removeQuote(match()))));
}
Rule notlike() {
- return Sequence(field(), push(match()), space(), UNLIKE, space(), value(),
+ return Sequence(field(), push(match()), space(), icUNLIKE, space(), value(),
push(new Unlike(toElement(pop().toString()), removeQuote(match()))));
}
Rule between() {
return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(),
- value(), push(removeQuote(match())), space(), TO, 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())));
}
@@ -281,11 +296,11 @@
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
Rule in() {
- return Sequence(field(), push(match()), space(), IN, space(), term(),
+ return Sequence(field(), push(match()), space(), icIN, space(), term(),
push(new In(toElement(pop(1).toString()), (Condition)pop())));
}
Rule select() {
- return Sequence(SELECT, space(), field(), push(match()), space(), WHERE, space(), term(),
+ return Sequence(icSELECT, space(), field(), push(match()), space(), icWHERE, space(), term(),
push(new Select(new ElementField(pop(1).toString()), (Condition)pop())));
}
Rule keyword() {
@@ -297,15 +312,15 @@
}
Rule rTrue() {
- return Sequence(IgnoreCase(TRUE), push(new True()));
+ return Sequence(icTRUE, push(new True()));
}
Rule rFalse() {
- return Sequence(IgnoreCase(FALSE), push(new False()));
+ return Sequence(icFALSE, push(new False()));
}
Rule value() {
- return FirstOf(IgnoreCase(TRUE), IgnoreCase(FALSE), IgnoreCase(NULL), field(), StringLiteral());
+ return FirstOf(field(), StringLiteral());
}
Rule StringLiteral() {
1
0