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
December 2011
- 1 participants
- 14 discussions
31 Dec '11
Author: bpoussin
Date: 2011-12-31 15:06:23 +0100 (Sat, 31 Dec 2011)
New Revision: 1271
Url: http://nuiton.org/repositories/revision/wikitty/1271
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- implantation du select en condition ce qui permet de faire des jointures facilement avec le In
(tout semble fini, reste a nettoyer un peu et ajouter plus de tests)
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java
trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -26,7 +26,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -39,6 +39,7 @@
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.Select;
/**
* Wikitty client is object used in client side to access WikittyService.
@@ -173,22 +174,28 @@
this.wikittyService = new WikittyServiceEnhanced(wikittyService);
}
- public <E extends BusinessEntity> E store(E e) {
- Wikitty w = ((BusinessEntityImpl)e).getWikitty();
- store(w);
- return e;
- }
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // STORE
+ //
+ ////////////////////////////////////////////////////////////////////////////
public Wikitty store(Wikitty w) {
long start = TimeLog.getTime();
WikittyEvent resp = wikittyService.store(securityToken, w);
// update object
resp.update(w);
-
+
timeLog.log(start, "store");
return w;
}
+ public <E extends BusinessEntity> E store(E e) {
+ Wikitty w = ((BusinessEntityImpl)e).getWikitty();
+ store(w);
+ return e;
+ }
+
public <E extends BusinessEntity> E[] store(E e1, E e2, E... eN) {
List<E> es = new ArrayList<E>(eN.length + 2);
Collections.addAll(es, e1, e2);
@@ -258,61 +265,35 @@
return wikitties;
}
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // RESTORE
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
/**
- * Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
- * @param <E> object type
- * @param clazz entity class
- * @param id entity id
- * @param checkExtension if true check that Wikitty result has all extension
- * declared in clazz
+ * Restore wikitty entity with specified id or {@code null} if entity can't be be found.
+ *
+ * @param id entity ids if null return is empty list
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
- public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
- try {
- long start = TimeLog.getTime();
- E result = null;
- if (id != null) {
- HashSet<String> extNames = null;
+ public List<Wikitty> restore(List<String> id) {
+ long start = TimeLog.getTime();
- Wikitty wikitty = wikittyService.restore(securityToken, id);
- if (wikitty != null) {
- if (checkExtension) {
- extNames = new HashSet<String>(wikitty.getExtensionNames());
- }
- result = WikittyUtil.newInstance(
- securityToken, wikittyService, clazz, wikitty);
-
- if (checkExtension) {
- // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
- BusinessEntityImpl b = (BusinessEntityImpl) result;
- Collection<WikittyExtension> BusinessEntityStaticExtensions = b.getStaticExtensions();
- for (WikittyExtension ext : BusinessEntityStaticExtensions) {
- String extensionName = ext.getName();
- if (!extNames.contains(extensionName)) {
- // extension wanted by BusinessEntity (clazz)
- // is not in wikitty, then wikitty is not good type
- // for business
- result = null;
- break;
- }
- }
- }
- }
- }
-
- timeLog.log(start, "restore<Business>");
- return result;
- } catch (SecurityException eee) {
- throw eee;
- } catch (Exception eee) {
- throw new WikittyException("Can't restore wikitty", eee);
+ List<Wikitty> result;
+ if (id == null) {
+ result = new ArrayList<Wikitty>();
+ } else {
+ result = wikittyService.restore(securityToken, id);
}
+
+ timeLog.log(start, "restore<list>");
+ return result;
}
/**
* Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
+ *
* @param id entity id
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
@@ -320,47 +301,14 @@
long start = TimeLog.getTime();
Wikitty result = null;
if (id != null) {
- result = wikittyService.restore(securityToken, id);
+ result = restore(Collections.singletonList(id)).get(0);
}
-
+
timeLog.log(start, "restore");
- return result;
- }
-
- /**
- * Restore wikitty entity with specified id or {@code null} if entity can't be found.
- *
- * @param <E> object type
- * @param clazz entity class
- * @param id entity id
- * @return wikitty entity with specified id or {@code null} if entity can't be found
- */
- public <E extends BusinessEntity> E restore(Class<E> clazz, String id) {
- E result = restore(clazz, id, false);
return result;
}
/**
- * Restore wikitty entity with specified id or {@code null} if entity can't be be found.
- *
- * @param id entity ids if null return is empty list
- * @return wikitty entity with specified id or {@code null} if entity can't be found
- */
- public List<Wikitty> restore(List<String> id) {
- long start = TimeLog.getTime();
-
- List<Wikitty> result;
- if (id == null) {
- result = new ArrayList<Wikitty>();
- } else {
- result = wikittyService.restore(securityToken, id);
- }
-
- timeLog.log(start, "restoreWikitty<list>");
- return result;
- }
-
- /**
* Restore wikitty entity with specified id or {@code null} if entity
* can't be be found, or checkExtension is true and wikitty don't match
* extension wanted.
@@ -406,6 +354,40 @@
return result;
}
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id) {
+ E result = restore(clazz, id, false);
+ return result;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @param checkExtension if true check that Wikitty result has all extension
+ * declared in clazz
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
+ long start = TimeLog.getTime();
+ E result = null;
+ if (id != null) {
+ result = restore(clazz, Collections.singletonList(id), checkExtension).get(0);
+ }
+
+ timeLog.log(start, "restore<Business>");
+ return result;
+ }
+
public <E extends BusinessEntity> List<E> restore(Class<E> clazz, List<String> id) {
List<E> result = restore(clazz, id, false);
return result;
@@ -417,7 +399,7 @@
list = new ArrayList<String>(id);
}
List<Wikitty> resultList = restore(list);
- Set<Wikitty> result = new HashSet<Wikitty>(resultList);
+ Set<Wikitty> result = new LinkedHashSet<Wikitty>(resultList);
return result;
}
@@ -432,10 +414,16 @@
list = new ArrayList<String>(id);
}
List<E> resultList = restore(clazz, list, checkExtension);
- Set<E> result = new HashSet<E>(resultList);
+ Set<E> result = new LinkedHashSet<E>(resultList);
return result;
}
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // DETELE
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
public void delete(String id) {
long start = TimeLog.getTime();
wikittyService.delete(securityToken, id);
@@ -477,6 +465,12 @@
timeLog.log(start, "delete<list<BusinessEntity>>");
}
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND (ALL) BY EXEMPLE <E>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
/**
* Null field are not used in search request.
*
@@ -494,7 +488,7 @@
.setFirst(first).setLimit(limit)
.setFacetField(fieldFacet);
- WikittyQueryResult<String> queryResult = findAllIdByQuery(query);
+ WikittyQueryResult<String> queryResult = findAllByQuery(query);
WikittyQueryResult<E> result = (WikittyQueryResult<E>)castTo(
e.getClass(), queryResult);
@@ -512,7 +506,7 @@
long start = TimeLog.getTime();
WikittyQuery query = new WikittyQueryMaker().wikitty(e).end();
- String id = findIdByQuery(query);
+ String id = findByQuery(query);
E result = (E)restore(e.getClass(), id);
timeLog.log(start, "findByExample");
@@ -521,112 +515,171 @@
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL BY CRITERIA <E>
+ // FIND ALL BY QUERY <E>
//
///////////////////////////////////////////////////////////////////////////
/**
+ * Cette method doit etre l'unique methode finalement utilise par toutes
+ * les methodes find avec un cast vers clazz
+ *
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If one criteria is null, find all extensions
- * for this criteria else if criteria is empty return nothing.
- *
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
+ *
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
- * @param criterias criterias
+ * @param queries criterias
+ * @param limitToFirst if true limit result to first result (first = 0, limit = 1)
* @return paged result
*/
- public <E extends BusinessEntity> List<WikittyQueryResult<E>> findAllByQuery(
- Class<E> clazz, List<WikittyQuery> criterias) {
+ protected <E> List<WikittyQueryResult<E>> findAllByQuery(
+ Class<E> clazz, List<WikittyQuery> queries, boolean limitToFirst) {
long start = TimeLog.getTime();
List<WikittyQueryResult<E>> result = null;
- if (criterias != null) {
- // newInstance only return BusinessEntityWikittyImpl
- BusinessEntityImpl sample =
- (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
+ List<WikittyQuery> serviceQueries;
+ if (queries != null) {
+ if (clazz.isAssignableFrom(BusinessEntity.class)) {
+ // on demande un business entity donc on modifie
+ // pas les criteres pour ajouter les contraintes sur les
+ // extensions
- Wikitty wikitty = sample.getWikitty();
- Collection<String> extensions = wikitty.getExtensionNames();
+ // newInstance only return BusinessEntityWikittyImpl
+ BusinessEntityImpl sample =
+ (BusinessEntityImpl) WikittyUtil.newInstance((Class<BusinessEntity>)clazz);
- List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
- for (WikittyQuery criteria : criterias) {
+ Wikitty wikitty = sample.getWikitty();
+ Collection<String> extensions = wikitty.getExtensionNames();
- // on ajoute la condition sur les extensions dans le critere
- // du coup, pour ne pas modifier le critere qui vient en parametre
- // il faut creer un nouveau critere ...
- WikittyQuery serviceCriteria = null;
- if (criteria != null) {
- serviceCriteria = criteria.copy();
+ serviceQueries = new ArrayList<WikittyQuery>(queries.size());
+ for (WikittyQuery criteria : queries) {
- // Dont add contraint if using select
- if (StringUtils.isEmpty(criteria.getSelect())) {
+ // on ajoute la condition sur les extensions dans le critere
+ // du coup, pour ne pas modifier le critere qui vient en parametre
+ // il faut creer un nouveau critere ...
+ WikittyQuery serviceQuery = null;
+ if (criteria != null) {
+ serviceQuery = criteria.copy();
+ WikittyQueryMaker queryMaker;
+ if (serviceQuery.getCondition() instanceof Select) {
+ // si la condition commence par un select
+ // alors il faut modifier la condition du select
+ Select select = (Select)serviceQuery.getCondition();
+ queryMaker = new WikittyQueryMaker()
+ .select(select.getElement())
+ .and().condition(select.getSubCondition())
+ .extContainsAll(extensions);
+ } else {
+ // sinon on modifie directement la condition
+ queryMaker = new WikittyQueryMaker()
+ .and().condition(serviceQuery.getCondition())
+ .extContainsAll(extensions);
+ }
// utilisation de cette nouvelle contrainte sur le nouvel objet
- // creation de la nouvelle contrainte
- WikittyQueryMaker queryMaker = new WikittyQueryMaker()
- .and().condition(serviceCriteria.getCondition())
- .extContainsAll(extensions);
-
- serviceCriteria.setCondition(queryMaker.getCondition());
+ serviceQuery.setCondition(queryMaker.getCondition());
}
+
+ // ajout de ce criteria dans la liste de tous les criteres
+ serviceQueries.add(serviceQuery);
}
+ } else {
+ // on ne demande pas un business entity donc on ne modifie
+ // pas les criteres
+ serviceQueries = queries;
+ }
- // ajout de ce criteria dans la liste de tous les criteres
- serviceCriterias.add(serviceCriteria);
+ if (limitToFirst) {
+ for (WikittyQuery query : serviceQueries) {
+ query.setFirst(0);
+ query.setLimit(1);
+ // lorsqu'on limit au premier, c'est qu'on utilise la methode
+ // pour retourne seulement un objet et pas un WikittyQueryResult
+ // on n'a donc pas a calculer les facets
+ query.setFacetExtension(false);
+ query.setFacetField();
+ query.setFacetQuery();
+ }
}
List<WikittyQueryResult<String>> pagedResult = wikittyService.findAllByQuery(
- securityToken, serviceCriterias);
+ securityToken, serviceQueries);
- // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
- // in one call to service. Currently each PagedResult.cast do a call
result = new ArrayList<WikittyQueryResult<E>>(pagedResult.size());
for (WikittyQueryResult<String> p : pagedResult) {
- result.add((WikittyQueryResult<E>)castTo(sample.getClass(), p));
+ result.add((WikittyQueryResult<E>)castTo(clazz, p));
}
}
- timeLog.log(start, "findAllByCriteria<Business>(List)");
+ timeLog.log(start, "findAllByQuery<E>(List, limitToFirst)");
return result;
}
/**
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If criteria is null, find all extensions
- * else if criteria is empty return nothing.
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
*
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
+ * @param criterias criterias
+ * @return paged result
+ */
+ public <E> List<WikittyQueryResult<E>> findAllByQuery(
+ Class<E> clazz, List<WikittyQuery> criterias) {
+ long start = TimeLog.getTime();
+ List<WikittyQueryResult<E>> result = findAllByQuery(clazz, criterias, false);
+ timeLog.log(start, "findAllByQuery<E>(List)");
+ return result;
+ }
+
+ /**
+ * Search object that correspond to criteria and that have all extension
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
+ *
+ * @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
+ * @param clazz entity class
* @param criteria criteria
* @return paged result
*/
- public <E extends BusinessEntity> WikittyQueryResult<E> findAllByCriteria(
+ public <E> WikittyQueryResult<E> findAllByQuery(
Class<E> clazz, WikittyQuery criteria) {
long start = TimeLog.getTime();
WikittyQueryResult<E> result = findAllByQuery(clazz,
- Collections.singletonList(criteria)).get(0);
- timeLog.log(start, "findAllByCriteria<Business>(One)");
+ Collections.singletonList(criteria), false).get(0);
+ timeLog.log(start, "findAllByQuery<E>(One)");
return result;
}
/**
+ /**
* Search object that correspond to criteria and that have all extension
- * needed by BusinessEntity (clazz). If criteria is null, find all extensions
- * else if criteria is empty return nothing.
+ * needed by BusinessEntity (clazz), if clazz is BusinessEntity class.
+ * If one criteria is empty, find all extensions
+ * for this criteria else if criteria is null return null.
*
* @param <E> object type
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @param clazz entity class
* @param c1 criteria 1
* @param c2 criteria 2
* @param otherCriteria otherCriteria
* @return paged result
*/
- public <E extends BusinessEntity> WikittyQueryResult<E>[] findAllByQuery(
+ public <E> WikittyQueryResult<E>[] findAllByQuery(
Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<E>> resultList = findAllByQuery(clazz, criterias);
+ List<WikittyQueryResult<E>> resultList = findAllByQuery(clazz, criterias, false);
WikittyQueryResult<E>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
timeLog.log(start, "findAllByCriteria<Business>(Varargs)");
return result;
@@ -634,81 +687,81 @@
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL BY CRITERIA <Wikitty>
+ // FIND BY CRITERIA <E>
//
///////////////////////////////////////////////////////////////////////////
- public List<WikittyQueryResult<Wikitty>> findAllByQuery(List<WikittyQuery> criteria) {
+ public <E> List<E> findByQuery(Class<E> clazz, List<WikittyQuery> criterias) {
long start = TimeLog.getTime();
- List<WikittyQueryResult<Wikitty>> result = null;
- if (criteria != null) {
- List<WikittyQueryResult<String>> resultId =
- wikittyService.findAllByQuery(securityToken, criteria);
- // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
- // in one call to service. Currently each PagedResult.cast do a call
- result = new ArrayList<WikittyQueryResult<Wikitty>>(resultId.size());
- for (WikittyQueryResult<String> p : resultId) {
- result.add(castTo(Wikitty.class, p));
+ List<WikittyQueryResult<E>> queryResult =
+ findAllByQuery(clazz, criterias, true);
+ List<E> result = new ArrayList<E>(queryResult.size());
+ for (WikittyQueryResult<E> r : queryResult) {
+ if (r.size() > 0) {
+ result.add(r.peek());
+ } else {
+ result.add(null);
}
}
- timeLog.log(start, "findAllByCriteria(List)");
- return result;
+
+ timeLog.log(start, "multiFindByCriteria<E>(List>");
+ return result;
}
- public WikittyQueryResult<Wikitty> findAllByQuery(WikittyQuery criteria) {
+ public <E> E findByQuery(Class<E> clazz, WikittyQuery criteria) {
long start = TimeLog.getTime();
- WikittyQueryResult<Wikitty> result = null;
+ E result = null;
if (criteria != null) {
- result = findAllByQuery(Collections.singletonList(criteria)).get(0);
+ result = findByQuery(clazz, Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findAllByCriteria(One)");
- return result;
+ timeLog.log(start, "findByQuery<E>(One)");
+ return result;
}
- public WikittyQueryResult<Wikitty>[] findAllByQuery(
- WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
+ public <E> E[] findByQuery(
+ Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<Wikitty>> resultList = findAllByQuery(criterias);
- WikittyQueryResult<Wikitty>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
+ List<E> resultList = findByQuery(clazz, criterias);
+ E[] result = resultList.toArray((E[])Array.newInstance(clazz, resultList.size()));
- timeLog.log(start, "findAllByCriteria(Varargs)");
- return result;
+ timeLog.log(start, "findByCriteria<E>(Varargs)");
+ return result;
}
///////////////////////////////////////////////////////////////////////////
//
- // FIND ALL ID BY CRITERIA <String>
+ // FIND ALL FIELD OR ID BY CRITERIA <String>
//
///////////////////////////////////////////////////////////////////////////
- public List<WikittyQueryResult<String>> findAllIdByQuery(List<WikittyQuery> criteria) {
+ public List<WikittyQueryResult<String>> findAllByQuery(List<WikittyQuery> criteria) {
long start = TimeLog.getTime();
List<WikittyQueryResult<String>> result = null;
if (criteria != null) {
result = wikittyService.findAllByQuery(securityToken, criteria);
}
- timeLog.log(start, "findAllIdByCriteria(List)");
- return result;
+ timeLog.log(start, "findAllByCriteria(List)");
+ return result;
}
- public WikittyQueryResult<String> findAllIdByQuery(WikittyQuery criteria) {
+ public WikittyQueryResult<String> findAllByQuery(WikittyQuery criteria) {
long start = TimeLog.getTime();
WikittyQueryResult<String> result = null;
if (criteria != null) {
- result = findAllIdByQuery(
+ result = findAllByQuery(
Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findAllIdByCriteria(One)");
+ timeLog.log(start, "findAllByCriteria(One)");
return result;
}
- public WikittyQueryResult<String>[] findAllIdByQuery(
+ public WikittyQueryResult<String>[] findAllByQuery(
WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
long start = TimeLog.getTime();
@@ -716,10 +769,10 @@
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<WikittyQueryResult<String>> resultList = findAllIdByQuery(criterias);
+ List<WikittyQueryResult<String>> resultList = findAllByQuery(criterias);
WikittyQueryResult<String>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
- timeLog.log(start, "findAllIdByCriteria(Varargs)");
+ timeLog.log(start, "findAllByCriteria(Varargs)");
return result;
}
@@ -729,27 +782,27 @@
//
///////////////////////////////////////////////////////////////////////////
- public List<String> findIdByQuery(List<WikittyQuery> criteria) {
+ public List<String> findByQuery(List<WikittyQuery> criteria) {
long start = TimeLog.getTime();
List<String> result = null;
if (criteria != null) {
result = wikittyService.findByQuery(securityToken, criteria);
}
- timeLog.log(start, "findIdByCriteria(List)");
+ timeLog.log(start, "findByCriteria(List)");
return result;
}
- public String findIdByQuery(WikittyQuery criteria) {
+ public String findByQuery(WikittyQuery criteria) {
long start = TimeLog.getTime();
String result = null;
if (criteria != null) {
- result = findIdByQuery(Collections.singletonList(criteria)).get(0);
+ result = findByQuery(Collections.singletonList(criteria)).get(0);
}
- timeLog.log(start, "findIdByCriteria(One)");
+ timeLog.log(start, "findByCriteria(One)");
return result;
}
- public String[] findIdByQuery(
+ public String[] findByQuery(
WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
long start = TimeLog.getTime();
@@ -757,121 +810,15 @@
Collections.addAll(criterias, c1, c2);
Collections.addAll(criterias, otherCriteria);
- List<String> resultList = findIdByQuery(criterias);
+ List<String> resultList = findByQuery(criterias);
String[] result = resultList.toArray(new String[criterias.size()]);
- timeLog.log(start, "findIdByCriteria(Varargs)");
- return result;
- }
-
- ///////////////////////////////////////////////////////////////////////////
- //
- // FIND BY CRITERIA <E>
- //
- ///////////////////////////////////////////////////////////////////////////
-
- public <E extends BusinessEntity> List<E> findByQuery(
- Class<E> clazz, List<WikittyQuery> criterias) {
- long start = TimeLog.getTime();
- List<E> result = null;
- if (criterias != null) {
- BusinessEntityImpl sample =
- (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
-
- Wikitty wikitty = sample.getWikitty();
- Collection<String> extensions = wikitty.getExtensionNames();
- List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
- for (WikittyQuery criteria : criterias) {
- // on a pas besoin de recuperer les limits du query puisqu'on en
- // veut qu'un et donc qu'on ne retourne pas de WikittyQueryResult
- // donc on ne fait pas une copie, on en cree un nouveau directement
- // a partir de la condition
- WikittyQuery q = new WikittyQueryMaker()
- .and().condition(criteria.getCondition())
- .extContainsAll(extensions).end();
- serviceCriterias.add(q);
- }
-
- List<String> id = findIdByQuery(serviceCriterias);
- result = restore(clazz, id);
- }
- timeLog.log(start, "multiFindByCriteria<Business>(List>");
+ timeLog.log(start, "findByCriteria(Varargs)");
return result;
}
- public <E extends BusinessEntity> E findByQuery(
- Class<E> clazz, WikittyQuery criteria) {
- long start = TimeLog.getTime();
- E result = null;
- if (criteria != null) {
- List<E> criterias = findByQuery(clazz, Collections.singletonList(criteria));
- if (!criterias.isEmpty()) {
- result = criterias.get(0);
- }
- }
- timeLog.log(start, "findByCriteria<Business>(One)");
- return result;
- }
-
- public <E extends BusinessEntity> E[] findByQuery(
- Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
- long start = TimeLog.getTime();
-
- List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
- Collections.addAll(criterias, c1, c2);
- Collections.addAll(criterias, otherCriteria);
-
- List<E> resultList = findByQuery(clazz, criterias);
- E[] result = resultList.toArray((E[])Array.newInstance(clazz, resultList.size()));
-
- timeLog.log(start, "findByCriteria<Business>(Varargs)");
- return result;
- }
-
///////////////////////////////////////////////////////////////////////////
//
- // FIND BY CRITERIA <Wikitty>
- //
- ///////////////////////////////////////////////////////////////////////////
-
- public List<Wikitty> findByQuery(List<WikittyQuery> criteria) {
- long start = TimeLog.getTime();
- List<Wikitty> result = null;
- if (criteria != null) {
- List<String> id = findIdByQuery(criteria);
- result = restore(id);
- }
- timeLog.log(start, "findByCriteria(List)");
- return result;
- }
-
- public Wikitty findByQuery(WikittyQuery criteria) {
- long start = TimeLog.getTime();
- String id = findIdByQuery(criteria);
- Wikitty wikitty = restore(id);
- timeLog.log(start, "findByCriteria(One)");
- return wikitty;
- }
-
- public Wikitty[] findByQuery(
- WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
- long start = TimeLog.getTime();
-
- List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
- Collections.addAll(criterias, c1, c2);
- Collections.addAll(criterias, otherCriteria);
-
- List<String> resultList = findIdByQuery(criterias);
- List<Wikitty> wikitties = restore(resultList);
- Wikitty[] result = wikitties.toArray(new Wikitty[resultList.size()]);
-
- timeLog.log(start, "findByCriteria(Varargs)");
- return result;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////
- //
// FIND BY TREE NODE
//
///////////////////////////////////////////////////////////////////////////
@@ -1325,7 +1272,7 @@
.eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, groupName)
.end();
- Wikitty group = findByQuery(criteria);
+ Wikitty group = findByQuery(Wikitty.class, criteria);
if (group != null && user != null) {
result = WikittySecurityUtil.isMember(wikittyService, securityToken,
@@ -1361,7 +1308,7 @@
*
* @param queryResult result to convert
* @param target to cast into.
- * Can be Wikitty, BusinessEntity, String, Date, BigDecimal, Boolean, byte[]
+ * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[]
* @return new WikittyQueryResult with element in right class or Exception
* if conversion is impossible
*/
@@ -1401,7 +1348,7 @@
// on commence par tout mettre en Wikitty, en utilisant le if du dessus
WikittyQueryResult<Wikitty> resultTmp = castTo(Wikitty.class, queryResult);
castedResult = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp.getAll());
- } else if (target.isAssignableFrom(BigDecimal.class)) {
+ } else if (target.isAssignableFrom(Number.class)) {
castedResult = new ArrayList<E>(queryResult.size());
for (Object o : queryResult) {
BigDecimal v = WikittyUtil.toBigDecimal(o);
@@ -1448,6 +1395,4 @@
return result;
}
-
-
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -42,12 +42,6 @@
/** query condition */
protected Condition condition;
- /**
- * Use to return select ids
- * Be carefull, can be long if many result is found
- */
- protected String select;
-
/** First index to get result. */
protected int first = 0;
/** Number of result to retrieve. 100 by default. */
@@ -114,7 +108,7 @@
result = ObjectUtils.equals(this.getName(), other.getName()) &&
ObjectUtils.equals(this.getFirst(), other.getFirst()) &&
ObjectUtils.equals(this.getLimit(), other.getLimit()) &&
- ObjectUtils.equals(this.getSelect(), other.getSelect()) &&
+ ObjectUtils.equals(this.isFacetExtension(), other.isFacetExtension()) &&
ObjectUtils.equals(this.getFacetField(), other.getFacetField()) &&
ObjectUtils.equals(this.getSortAscending(), other.getSortAscending()) &&
ObjectUtils.equals(this.getSortDescending(), other.getSortDescending()) &&
@@ -170,15 +164,6 @@
return this;
}
- public String getSelect() {
- return select;
- }
-
- public WikittyQuery setSelect(String select) {
- this.select = select;
- return this;
- }
-
public int getFirst() {
return first;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -37,6 +37,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -850,10 +851,29 @@
}
/**
+ * Add {@link Select}, this condition must be first or
+ * @param element le champs dont il faut extraire les donnees
+ * @return {@code this}
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(String element) {
+ return select(new ElementField(element));
+ }
+
+ /*
+ * @see {@link Select}
+ */
+ public WikittyQueryMaker select(ElementField element) {
+ Condition child = new Select(element);
+ addOnStack(child);
+ return this;
+ }
+
+ /**
* Add {@link In} to allow search on association (like sql join).
* To close this sub query you must used {@link #close()}
* @param foreignFieldName association fieldName
- * @return sub query
+ * @return {@code this}
* @see {@link In}
*/
public WikittyQueryMaker in(String foreignFieldName) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -30,6 +30,7 @@
import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.parboiled.BaseParser;
@@ -65,6 +66,8 @@
public static final String FALSE = "FALSE";
public static final String ID = "id";
+ public static final String SELECT = "SELECT";
+ public static final String WHERE = "WHERE";
public static final String IN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
@@ -181,15 +184,14 @@
Rule Parens() {
return Sequence(space(), BRACKET_OPEN, space(), or(), space(), BRACKET_CLOSE, space());
- // FIXME
}
Rule condition() {
return FirstOf(
- not(), isNull(), isNotNull(),
+ not(), isNull(), isNotNull(), select(),
eq(), neq(), less(), lesseq(), greater(), greatereq(), like(), notlike(),
between(), containsAll(), containsOne(),
- associated(), rTrue(), rFalse(), keyword()
+ in(), rTrue(), rFalse(), keyword()
);
}
@@ -278,10 +280,14 @@
value(), elems.get().add(removeQuote(match())), space()), CURLY_BRACKET_CLOSE,
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
- Rule associated() {
+ Rule in() {
return Sequence(field(), push(match()), space(), IN, space(), term(),
- push(new In(toElement(pop().toString()), (Condition)pop())));
+ push(new In(toElement(pop(1).toString()), (Condition)pop())));
}
+ Rule select() {
+ return Sequence(SELECT, space(), field(), push(match()), space(), WHERE, space(), term(),
+ push(new Select(new ElementField(pop(1).toString()), (Condition)pop())));
+ }
Rule keyword() {
return Sequence(value(), push(new Keyword(removeQuote(match()))));
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -22,6 +22,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -126,6 +127,25 @@
* @param o
* @return True if we want visit sub-element, otherwize false
*/
+ /**
+ * True if we want visit sub-element, otherwize false
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
+ abstract public boolean visitEnter(Select o);
+ /**
+ * Leave method is alway called, but evaluation of enter is passed in
+ * arguement
+ *
+ * @param o
+ * @param enterOrMiddleResult result returned by visitEnter method
+ */
+ abstract public void visitLeave(Select o, boolean enterOrMiddleResult);
+ /**
+ * True if we want visit sub-element, otherwize false
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
abstract public boolean visitEnter(Not o);
/**
* Leave method is alway called, but evaluation of enter is passed in
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -23,6 +23,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -71,7 +72,6 @@
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
q.setName(o.getName());
- q.setSelect(o.getSelect());
q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
@@ -121,6 +121,17 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ getQueryMaker().select(o.getElement());
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
public boolean visitEnter(In o) {
getQueryMaker().in(o.getElement());
return true;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -20,6 +20,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
@@ -89,6 +90,18 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ text += WikittyQueryParser.SELECT + o.getElement().getValue()
+ + WikittyQueryParser.WHERE + WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
public boolean visitEnter(In o) {
text += o.getElement().getValue() + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN;
return true;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -1,6 +1,9 @@
package org.nuiton.wikitty.query.conditions;
import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.commons.lang.ClassUtils;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.WikittyQueryVisitor;
import org.nuiton.wikitty.query.WikittyQueryVisitorToString;
@@ -29,13 +32,57 @@
}
/**
+ * Retourne la liste des conditions qui ne peuvent pas etre ajoutee
+ * a cette condition.
+ * Lorsqu'on implante un fils il est preferable de faire une nouvelle
+ * collection dans lequel on ajout ou on retire des elements
+ * <pre>
+ * return new Set(super.rejectedCondition).add/remove(condition.class)
+ * </pre>
+ * car certain regle sont mises pour toutes
+ * les conditions comme l'interdiction d'ajouter un Select.
+ *
+ * @param c
+ */
+ public Set<Class<? extends Condition>> rejectedCondition() {
+ Set<Class<? extends Condition>> result = new HashSet<Class<? extends Condition>>();
+ result.add(Select.class);
+ return result;
+ }
+
+ public void checkAddCondition(Condition c) {
+ Class clazz = null;
+ if (c != null) {
+ clazz = c.getClass();
+ }
+
+ Set<?> rejected = rejectedCondition();
+ if (rejected == null) {
+ // tout est rejete
+ throw new WikittyException(String.format(
+ "Add condition is not allowed in this condition type '%s'",
+ getClass().getSimpleName()));
+ } else if (rejected.contains(clazz)) {
+ throw new WikittyException(String.format(
+ "Add condition '%s' is not allowed in this condition type '%s'",
+ ClassUtils.getShortCanonicalName(c, "null"),
+ getClass().getSimpleName()));
+ }
+ }
+
+ /**
* For non terminal condition this method add subCondition.
* For terminal this method must return an exception
+ *
+ * When you overriden this method, you must call {@link #checkAddCondition}
+ * in first
*
* @param c
*/
public void addCondition(Condition c) {
- throw new WikittyException("Add condition is not allowed in this condition type");
+ throw new WikittyException(String.format(
+ "Add condition is not allowed in this condition type '%s'",
+ getClass().getSimpleName()));
}
public void accept(WikittyQueryVisitor visitor) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -80,7 +80,10 @@
@Override
public void addCondition(Condition c) {
- getConditions().add(c);
+ if (c != null) {
+ checkAddCondition(c);
+ getConditions().add(c);
+ }
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -32,10 +32,13 @@
@Override
public void addCondition(Condition c) {
+ checkAddCondition(c);
if (subCondition == null) {
this.subCondition = c;
} else {
- throw new WikittyException("ConditionUnary ("+getClass().getSimpleName()+") can't have more than one condition");
+ throw new WikittyException(String.format(
+ "ConditionUnary (%s) can't have more than one condition",
+ getClass().getSimpleName()));
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -1,5 +1,7 @@
package org.nuiton.wikitty.query.conditions;
+import java.util.HashSet;
+import java.util.Set;
import org.apache.commons.lang.ObjectUtils;
/**
@@ -32,7 +34,20 @@
super(restriction);
this.element = element;
}
-
+
+ /**
+ * Le In autorise le Select
+ * @return
+ */
+ @Override
+ public Set<Class<? extends Condition>> rejectedCondition() {
+ Set<Class<? extends Condition>> result =
+ new HashSet<Class<? extends Condition>>(super.rejectedCondition());
+ // le in autorise le Select
+ result.remove(Select.class);
+ return result;
+ }
+
public Element getElement() {
return element;
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Select.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -0,0 +1,54 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Cette condition n'accept pas d'etre utilise dans une autre condition.
+ * Il sert a demander l'extraction d'un autre champs que l'id. Si la valeur
+ * du champs est retrouvee plusieurs fois, cette valeur n'apparaitra qu'une
+ * seule fois dans les resultats (comme 'DISTINCT' en SQL)
+ * <p>
+ * Il y a donc deux types d'utilisation possible
+ *
+ * <pre>
+ * SELECT extName.fieldName WHERE condition
+ * condition ... IN (SELECT extName.fieldName WHERE other condition)
+ * </pre>
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Select extends ConditionUnary {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ElementField element;
+
+ public Select(ElementField element) {
+ this.element = element;
+ }
+
+ public Select(ElementField element, Condition restriction) {
+ super(restriction);
+ this.element = element;
+ }
+
+ public ElementField getElement() {
+ return element;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ boolean result = super.equalsDeep(other);
+ if (result) {
+ In op = (In)other;
+ result = ObjectUtils.equals(this.getElement(), op.getElement());
+ }
+ return result;
+ }
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -79,7 +79,10 @@
public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
/**
- * Find all wikitties that satisfy queries constraint
+ * Find all values that satisfy queries constraint. Values is Wikitty's id
+ * if there is no Select condition, otherwize is String that represent
+ * field value and can be String representation of
+ * Wikitty, Date, Boolean, Numeric, Binary, String
*
* @param transaction
* @param queries
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -60,12 +60,12 @@
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
import org.nuiton.wikitty.query.conditions.Like;
import org.nuiton.wikitty.query.conditions.NotEquals;
import org.nuiton.wikitty.query.conditions.NotNull;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
@@ -756,13 +756,24 @@
}
@Override
- public boolean visitEnter(Join o) {
+ public boolean visitEnter(Select o) {
+ // do nothing
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ // do nothing
+ }
+
+ @Override
+ public boolean visitEnter(org.nuiton.wikitty.query.conditions.In o) {
boolean evalResult = false;
String fqfieldName = o.getElement().getValue();
-// Object fieldValue = w.getFqField(fqfieldName);
- // il faut que le champs exist et que la valeur soit un String (pas null)
- if (w.hasField(fqfieldName) && (w.getFieldType(fqfieldName).getType() == TYPE.WIKITTY)) {
+ // il faut que le champs exist, mais tout type de champs convient
+ // maintenant qu'il est possible de faire un select
+ if (w.hasField(fqfieldName)) {
//Get sub-restriction
Condition sub = o.getSubCondition();
@@ -777,7 +788,6 @@
//Check that my field is contained in the sub-restriction results.
evalResult = check(ContainsOnePredicate, o.getElement(), associatedList);
-// associatedList.contains(String.valueOf(fieldValue));
}
evalStack.push(evalResult);
@@ -787,7 +797,7 @@
}
@Override
- public void visitLeave(Join o, boolean enterOrMiddleResult) {
+ public void visitLeave(org.nuiton.wikitty.query.conditions.In o, boolean enterOrMiddleResult) {
// nothing to do
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -132,7 +132,7 @@
{ // test join
WikittyQuery q = new WikittyQueryMaker()
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
.eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
@@ -146,7 +146,8 @@
WikittyQuery q = new WikittyQueryMaker()
.or()
.ideq(g2.getWikittyId())
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS).eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
// g1, g2, g3 doivent etre retrouve (g2 via ideq, et g1, g3 via le join)
@@ -159,7 +160,8 @@
WikittyQuery q = new WikittyQueryMaker()
.and()
.not().ideq(g1.getWikittyId()).close()
- .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS).eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
.end();
WikittyQueryResult<String> result = se.findAllByQuery(null, q);
// g3 doit etre retrouve via le join, et g1 est exclue via la not(ideq)
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -27,6 +27,7 @@
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
import org.nuiton.wikitty.services.WikittyTransaction;
@@ -128,6 +129,18 @@
}
@Override
+ public boolean visitEnter(Select o) {
+ // nothing to do
+ // select is done in WikittySearchEngineSolr method
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Select o, boolean enterOrMiddleResult) {
+ // nothing to do
+ }
+
+ @Override
public boolean visitEnter(In o) {
WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -66,6 +66,7 @@
import org.nuiton.util.TimeLog;
import org.nuiton.wikitty.WikittyConfigOption;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.query.FacetQuery;
import org.nuiton.wikitty.query.FacetTopic;
@@ -74,6 +75,7 @@
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -657,162 +659,181 @@
@Override
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
try {
- // Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
- transaction, this, elementModifier);
- query.getCondition().accept(v);
- String queryString = v.getSolrQuery();
- SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+ WikittyQueryResult<String> result;
- // Add paged
- int first = query.getFirst();
- int limit = query.getLimit();
+ if (query.getCondition() instanceof Select) {
+ // gere les conditions qui commence par select
+ // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
+ // car le select est execute via une facette, mais cette facette
+ // n'a pas les meme limites que les autres facette
- if (limit == Integer.MAX_VALUE) {
- // WARNING It is necessary to substract 'start' otherwise,
- // there is a capacity overlow in solR
- limit = Integer.MAX_VALUE - first;
- }
- querySolr.setStart(first);
- querySolr.setRows(limit);
+ Select select = (Select)query.getCondition();
+ String extName = WikittyExtension.extractExtensionName(
+ select.getElement().getValue());
+ WikittyQueryMaker newCond = new WikittyQueryMaker()
+ .and()
+ .exteq(extName)
+ .condition(select.getSubCondition());
- // Add sorting
- List<ElementField> sortAscending = query.getSortAscending();
- if(sortAscending != null) {
- for (ElementField sort : sortAscending) {
- String tranform = elementModifier.convertToSolr(transaction, sort);
- tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
- }
- }
-
- List<ElementField> sortDescending = query.getSortDescending();
- if(sortDescending != null) {
- for (ElementField sort : sortDescending) {
- String tranform = elementModifier.convertToSolr(transaction, sort);
- tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
- }
- }
+ // copy de la query pour les facettes
+ WikittyQuery queryFacet = query.copy();
+ queryFacet.setCondition(newCond.getCondition());
+ queryFacet.setLimit(0);
- // task : #1785 Add select method to allow specify wikittyId return field
- // If select is not empty, add facet on field
- String select = query.getSelect();
- boolean hasSelect = StringUtils.isNotEmpty(select);
- if (hasSelect) {
+ // copy de la query pour le select
+ // on part de facet qui a deja la bonne condition
+ WikittyQuery querySelect = queryFacet.copy();
+ querySelect.setLimit(0);
+ querySelect.setFacetMinCount(0);
+ querySelect.setFacetLimit(Integer.MAX_VALUE);
+ querySelect.setFacetQuery();
+ querySelect.setFacetField(select.getElement());
- // Limit on wikitty
- String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
- query.addFacetField(new ElementField(selectWikitty));
+ // execution des requetes
+ WikittyQueryResult<String> resultFacet = findAllByQuery(transaction, queryFacet);
+ WikittyQueryResult<String> resultSelect = findAllByQuery(transaction, querySelect);
- // We need no result, just facet
- query.setLimit(0);
- }
+ // creation des resultats via la facette select
+ List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
- // Add faceting
- boolean isFacetExtension = query.isFacetExtension();
- List<ElementField> facetField = query.getFacetField();
- List<FacetQuery> facetQuery = query.getFacetQuery();
+ List<String> selectList = new ArrayList<String>(
+ Math.min(topics.size(), query.getLimit()));
+ if (query.getFirst() < topics.size()) {
+ int first = query.getFirst();
+ int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
+ for (FacetTopic topic : topics.subList(first, last)) {
+ selectList.add(topic.getTopicName());
+ }
+ }
- // use to map query string to criteria facet name
- Map<String, String> facetQueryToName = new HashMap<String, String>();
+ // fusion des resultats
+ result = new WikittyQueryResult<String>(
+ query.getName(),
+ query.getFirst(),
+ topics.size(),
+ resultSelect.getQueryString(),
+ resultFacet.getFacets(),
+ selectList);
+ } else {
- if (isFacetExtension
- || CollectionUtils.isNotEmpty(facetField)
- || CollectionUtils.isNotEmpty(facetQuery)) {
- querySolr.setFacet(true);
- querySolr.setFacetMinCount(query.getFacetMinCount());
- querySolr.setFacetLimit(query.getFacetLimit());
+ // Create querySolr
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
+ query.getCondition().accept(v);
+ String queryString = v.getSolrQuery();
+ SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
- if (isFacetExtension) {
- querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ // Add paged
+ int first = query.getFirst();
+ int limit = query.getLimit();
+
+ if (limit == Integer.MAX_VALUE) {
+ // WARNING It is necessary to substract 'start' otherwise,
+ // there is a capacity overlow in solR
+ limit = Integer.MAX_VALUE - first;
}
+ querySolr.setStart(first);
+ querySolr.setRows(limit);
- // field facetisation
- if (facetField != null) {
- for (ElementField fqfieldName : facetField) {
- String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
- querySolr.addFacetField(tranform);
+ // Add sorting
+ List<ElementField> sortAscending = query.getSortAscending();
+ if(sortAscending != null) {
+ for (ElementField sort : sortAscending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
- // query facetisation
- if (facetQuery != null) {
- for (FacetQuery facet : facetQuery) {
- v = new WikittyQueryVisitorToSolr(
- transaction, this, elementModifier);
- facet.getCondition().accept(v);
- String queryFacet = v.getSolrQuery();
- facetQueryToName.put(queryFacet, facet.getName());
- querySolr.addFacetQuery(queryFacet);
+ List<ElementField> sortDescending = query.getSortDescending();
+ if(sortDescending != null) {
+ for (ElementField sort : sortDescending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
}
}
- }
- QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
- SolrDocumentList solrResults = resp.getResults();
+ // Add faceting
+ boolean isFacetExtension = query.isFacetExtension();
+ List<ElementField> facetField = query.getFacetField();
+ List<FacetQuery> facetQuery = query.getFacetQuery();
- Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
+ // use to map query string to criteria facet name
+ Map<String, String> facetQueryToName = new HashMap<String, String>();
- // la facet sur les extensions est directement et convenablement
- // gere comme un champs
- if (CollectionUtils.isNotEmpty(facetField)) {
- for (FacetField facet : resp.getFacetFields()) {
- String facetName = elementModifier.convertToField(facet.getName());
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- if (facet.getValues() != null) {
- for (FacetField.Count value : facet.getValues()) {
- String topicName = value.getName();
- int topicCount = (int) value.getCount();
- FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
- topics.add(topic);
+ if (isFacetExtension
+ || CollectionUtils.isNotEmpty(facetField)
+ || CollectionUtils.isNotEmpty(facetQuery)) {
+ querySolr.setFacet(true);
+ querySolr.setFacetMinCount(query.getFacetMinCount());
+ querySolr.setFacetLimit(query.getFacetLimit());
+
+ if (isFacetExtension) {
+ querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ }
+
+ // field facetisation
+ if (facetField != null) {
+ for (ElementField fqfieldName : facetField) {
+ String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
+ querySolr.addFacetField(tranform);
}
}
- facets.put(facetName, topics);
- }
- }
- if (CollectionUtils.isNotEmpty(facetQuery)) {
- for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
- String facetName = facet.getKey();
- // don't use contains because, map can have key with null value
- if (null != facetQueryToName.get(facetName)) {
- facetName = facetQueryToName.get(facetName);
+ // query facetisation
+ if (facetQuery != null) {
+ for (FacetQuery facet : facetQuery) {
+ v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
+ facet.getCondition().accept(v);
+ String queryFacet = v.getSolrQuery();
+ facetQueryToName.put(queryFacet, facet.getName());
+ querySolr.addFacetQuery(queryFacet);
+ }
}
- Integer count = facet.getValue();
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- FacetTopic topic = new FacetTopic(facetName, facetName, count);
- topics.add(topic);
- facets.put(facetName, topics);
}
- }
- List<String> ids;
- int numFound;
- if (hasSelect) {
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
+ SolrDocumentList solrResults = resp.getResults();
- // Get select facet
- List<FacetTopic> facetTopics = facets.get(select);
+ Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
- // Remove this one
- facets.remove(select);
+ // la facet sur les extensions est directement et convenablement
+ // gere comme un champs
+ if (CollectionUtils.isNotEmpty(facetField)) {
+ for (FacetField facet : resp.getFacetFields()) {
+ String facetName = elementModifier.convertToField(facet.getName());
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ if (facet.getValues() != null) {
+ for (FacetField.Count value : facet.getValues()) {
+ String topicName = value.getName();
+ int topicCount = (int) value.getCount();
+ FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
+ topics.add(topic);
+ }
+ }
+ facets.put(facetName, topics);
+ }
+ }
- // Total found
- numFound = facetTopics.size();
-
- // Extract ids starting on firstIndex
- ids = new ArrayList<String>();
-
- // If all must be return, use limit
- for (int i = first;i <= limit && i < numFound; i++) {
- FacetTopic topic = facetTopics.get(i);
- ids.add(topic.getTopicName());
+ if (CollectionUtils.isNotEmpty(facetQuery)) {
+ for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
+ String facetName = facet.getKey();
+ // don't use contains because, map can have key with null value
+ if (null != facetQueryToName.get(facetName)) {
+ facetName = facetQueryToName.get(facetName);
+ }
+ Integer count = facet.getValue();
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ FacetTopic topic = new FacetTopic(facetName, facetName, count);
+ topics.add(topic);
+ facets.put(facetName, topics);
+ }
}
- } else {
-
// Extract ids
- ids = new ArrayList<String>(solrResults.size());
+ List<String> ids = new ArrayList<String>(solrResults.size());
for (SolrDocument doc : solrResults) {
String id = SolrUtil.getStringFieldValue(doc, SOLR_ID);
@@ -820,14 +841,14 @@
}
// Get total num found
- numFound = (int)resp.getResults().getNumFound();
- }
+ int numFound = (int)resp.getResults().getNumFound();
- // Build paged result
- WikittyQueryResult<String> result = new WikittyQueryResult<String>(
- query.getName(),
- first, numFound, queryString, facets, ids);
+ // Build paged result
+ result = new WikittyQueryResult<String>(
+ query.getName(),
+ first, numFound, queryString, facets, ids);
+ }
return result;
} catch (SolrServerException eee) {
throw new WikittyException(String.format(
Added: trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java
===================================================================
--- trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java (rev 0)
+++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrForQueryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
@@ -0,0 +1,97 @@
+package org.nuiton.wikitty.storage.solr;
+
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyClient;
+import org.nuiton.wikitty.WikittyConfig;
+import org.nuiton.wikitty.entities.WikittyGroup;
+import org.nuiton.wikitty.entities.WikittyGroupImpl;
+import org.nuiton.wikitty.entities.WikittyImpl;
+import org.nuiton.wikitty.entities.WikittyLabel;
+import org.nuiton.wikitty.entities.WikittyLabelImpl;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Element;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineSolrForQueryTest {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineSolrForQueryTest.class);
+
+ protected static WikittyServiceSolr ws;
+
+ protected static ApplicationConfig instance =
+ WikittyConfig.getConfig("wikitty-config-sample-inmemory.properties");
+
+ protected WikittyClient client = new WikittyClient(ws);
+
+ @Before
+ public void deleteAll() throws Exception {
+ ws.clear(null);
+ }
+
+ @BeforeClass
+ public static void initTests() throws Exception {
+
+ SolrTestHelper.initTests(instance);
+
+ ws = new WikittyServiceSolr(instance);
+ }
+
+ @Test
+ public void testSelect() throws Exception {
+ // for id for easy debugging
+ WikittyImpl w = new WikittyImpl("g1");
+ WikittyGroupImpl g1 = new WikittyGroupImpl(w);
+ g1.setName("Group1");
+ w = new WikittyImpl("g2");
+ WikittyGroupImpl g2 = new WikittyGroupImpl(w);
+ g2.setName("GROUP2");
+
+ w = new WikittyImpl("l1");
+ WikittyLabelImpl l1 = new WikittyLabelImpl(w);
+ l1.addLabels(g1.getName());
+
+ client.store(g1, g2, l1);
+
+ {
+ WikittyQuery query = new WikittyQueryMaker()
+ .select(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .end();
+
+ WikittyQueryResult<String> result = client.findAllByQuery(query);
+
+ System.out.println(result.getAll());
+ Assert.assertEquals(2, result.getTotalResult());
+ }
+
+ {
+ WikittyQuery query = new WikittyQueryMaker()
+ .and()
+ .exteq(WikittyGroup.EXT_WIKITTYGROUP)
+ .in(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .select(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS)
+ .end();
+
+ WikittyQueryResult<String> result = client.findAllByQuery(query);
+
+ System.out.println(result.getAll());
+ Assert.assertEquals(1, result.getTotalResult());
+ }
+ }
+}
1
0
r1270 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:50:02 +0100 (Fri, 30 Dec 2011)
New Revision: 1270
Url: http://nuiton.org/repositories/revision/wikitty/1270
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- renomage de la condition Join en In
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -27,7 +27,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -138,7 +138,7 @@
}
/**
- * Ajout d'une condition non terminal (or, and, not, join)
+ * Ajout d'une condition non terminal (or, and, not, in)
* @param c
*/
protected void addOnStack(Condition c) {
@@ -186,7 +186,7 @@
/**
* Ajoute une condition, cette condition est prise comme une condition terminal
* Si l'on veut continuer a construire la requete, il faut avoir ajouter
- * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #join()}
+ * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #in()}
* @param c la condition a ajouter
* @return {@code this} with the {@code c} restriction added.
*/
@@ -850,27 +850,27 @@
}
/**
- * Add {@link Join} to allow search on association (like sql join).
+ * Add {@link In} to allow search on association (like sql join).
* To close this sub query you must used {@link #close()}
* @param foreignFieldName association fieldName
* @return sub query
- * @see {@link Join}
+ * @see {@link In}
*/
- public WikittyQueryMaker join(String foreignFieldName) {
- return join(new ElementField(foreignFieldName));
+ public WikittyQueryMaker in(String foreignFieldName) {
+ return in(new ElementField(foreignFieldName));
}
/*
- * @see {@link Join}
+ * @see {@link In}
*/
- public WikittyQueryMaker join(Element element) {
- Condition child = new Join(element);
+ public WikittyQueryMaker in(Element element) {
+ Condition child = new In(element);
addOnStack(child);
return this;
}
/**
- * Close last non terminal condition (or, and, not, join).
+ * Close last non terminal condition (or, and, not, in).
* <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
* @return
*/
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -27,7 +27,7 @@
import org.nuiton.wikitty.query.conditions.Not;
import org.nuiton.wikitty.query.conditions.NotEquals;
import org.nuiton.wikitty.query.conditions.Or;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.NotNull;
import org.nuiton.wikitty.query.conditions.Null;
import org.nuiton.wikitty.query.conditions.True;
@@ -65,7 +65,7 @@
public static final String FALSE = "FALSE";
public static final String ID = "id";
- public static final String JOIN = "IN";
+ public static final String IN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
public static final String NULL = "NULL";
@@ -279,8 +279,8 @@
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
Rule associated() {
- return Sequence(field(), push(match()), space(), JOIN, space(), term(),
- push(new Join(toElement(pop().toString()), (Condition)pop())));
+ return Sequence(field(), push(match()), space(), IN, space(), term(),
+ push(new In(toElement(pop().toString()), (Condition)pop())));
}
Rule keyword() {
return Sequence(value(), push(new Keyword(removeQuote(match()))));
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -5,7 +5,7 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.conditions.And;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
@@ -112,7 +112,7 @@
* @param o
* @return True if we want visit sub-element, otherwize false
*/
- abstract public boolean visitEnter(Join o);
+ abstract public boolean visitEnter(In o);
/**
* Leave method is alway called, but evaluation of enter is passed in
* arguement
@@ -120,7 +120,7 @@
* @param o
* @param enterOrMiddleResult result returned by visitEnter method
*/
- abstract public void visitLeave(Join o, boolean enterOrMiddleResult);
+ abstract public void visitLeave(In o, boolean enterOrMiddleResult);
/**
* True if we want visit sub-element, otherwize false
* @param o
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -13,7 +13,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -121,13 +121,13 @@
}
@Override
- public boolean visitEnter(Join o) {
- getQueryMaker().join(o.getElement());
+ public boolean visitEnter(In o) {
+ getQueryMaker().in(o.getElement());
return true;
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
getQueryMaker().close();
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -3,7 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.query.conditions.And;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
@@ -89,13 +89,13 @@
}
@Override
- public boolean visitEnter(Join o) {
- text += o.getElement().getValue() + WikittyQueryParser.JOIN + WikittyQueryParser.BRACKET_OPEN;
+ public boolean visitEnter(In o) {
+ text += o.getElement().getValue() + WikittyQueryParser.IN + WikittyQueryParser.BRACKET_OPEN;
return true;
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
text += WikittyQueryParser.BRACKET_CLOSE;
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/In.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -0,0 +1,51 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+
+/**
+ * In is used to join to Wikitty type.
+ *
+ * ex:
+ * <li> {@link WikittyQueryMaker}.in(myfield).eq(otherwikittyfield, "toto")
+ * is equivalent to
+ * <li> {@link WikittyQueryMaker}.containsOne(myfield, id1, id2, id3)
+ * where [id1, id2, id3] is id retrieved by query eq(otherwikittyfield, "toto")
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class In extends ConditionUnary {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+
+ public In(Element element) {
+ this.element = element;
+ }
+
+ public In(Element element, Condition restriction) {
+ super(restriction);
+ this.element = element;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ boolean result = super.equalsDeep(other);
+ if (result) {
+ In op = (In)other;
+ result = ObjectUtils.equals(this.getElement(), op.getElement());
+ }
+ return result;
+ }
+
+
+}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:43:37 UTC (rev 1269)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 15:50:02 UTC (rev 1270)
@@ -17,7 +17,7 @@
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
-import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.In;
import org.nuiton.wikitty.query.conditions.Keyword;
import org.nuiton.wikitty.query.conditions.Less;
import org.nuiton.wikitty.query.conditions.LessOrEquals;
@@ -128,7 +128,7 @@
}
@Override
- public boolean visitEnter(Join o) {
+ public boolean visitEnter(In o) {
WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
@@ -144,7 +144,7 @@
}
@Override
- public void visitLeave(Join o, boolean enterResult) {
+ public void visitLeave(In o, boolean enterResult) {
// do nothing
}
1
0
r1269 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:43:37 +0100 (Fri, 30 Dec 2011)
New Revision: 1269
Url: http://nuiton.org/repositories/revision/wikitty/1269
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
- Utilisation de constantes pour ElementId et ElementExtension dans Element
- Prise en compte des facets sur les extensions
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -68,7 +68,11 @@
protected List<FacetQuery> facetQuery;
/** Facet on field. */
protected List<ElementField> facetField;
- /** if true facet is done on extension name */
+ /**
+ * if true facet is done on extension name. Extention facet can be found
+ * in {@link WikittyQueryResult#getFacets()} with key
+ * {@link Element.EXTENSION.getValue()}
+ */
protected boolean facetExtension = false;
/** Sort ascending on fields. */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -11,7 +11,6 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.entities.BusinessEntity;
import org.nuiton.wikitty.entities.BusinessEntityImpl;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
@@ -380,7 +379,7 @@
* @see {@link Equals}
*/
public WikittyQueryMaker exteq(String extensionName) {
- return eq(new ElementExtension(), extensionName);
+ return eq(Element.EXTENSION, extensionName);
}
/**
@@ -393,7 +392,7 @@
* @see {@link Equals}
*/
public WikittyQueryMaker ideq(Object idOrWikitty) {
- return eq(new ElementId(), idOrWikitty);
+ return eq(Element.ID, idOrWikitty);
}
/**
@@ -406,7 +405,7 @@
* @see {@link ContainsAll}
*/
public WikittyQueryMaker extContainsAll(Collection<String> extensionNames) {
- return containsAll(new ElementExtension(), extensionNames);
+ return containsAll(Element.EXTENSION, extensionNames);
}
/**
@@ -416,7 +415,7 @@
List<String> l = new LinkedList<String>();
l.add(ext1);
l.addAll(Arrays.asList(exts));
- return containsAll(new ElementExtension(), l);
+ return containsAll(Element.EXTENSION, l);
}
/**
@@ -454,7 +453,7 @@
* @see {@link NotEquals}
*/
public WikittyQueryMaker extneq(String extensionName) {
- return ne(new ElementExtension(), extensionName);
+ return ne(Element.EXTENSION, extensionName);
}
/**
@@ -467,7 +466,7 @@
* @see {@link NotEquals}
*/
public WikittyQueryMaker idneq(Object idOrWikitty) {
- return ne(new ElementId(), idOrWikitty);
+ return ne(Element.ID, idOrWikitty);
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -1,6 +1,5 @@
package org.nuiton.wikitty.query;
-import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -57,11 +56,16 @@
*/
@BuildParseTree
public class WikittyQueryParser extends BaseParser<Object> {
+ /**
+ * type de champs pour indique qu'on fait une condition sur le nom
+ * d'une extension. Ce champs est aussi utilise comme valeur pour
+ * {@link ElementExtension} et comme nom de facet pour les extensions
+ */
public static final String EXTENSION = "extension";
public static final String FALSE = "FALSE";
public static final String ID = "id";
- public static final String JOIN = "<-";
+ public static final String JOIN = "IN";
public static final String LITERAL_CLOSE = "\"";
public static final String LITERAL_OPEN = "\"";
public static final String NULL = "NULL";
@@ -124,9 +128,9 @@
protected Element toElement(String v) {
Element result;
if (ID.equals(v)) {
- result = new ElementId();
+ result = Element.ID;
} else if (EXTENSION.equals(v)) {
- result = new ElementExtension();
+ result = Element.EXTENSION;
} else {
result = new ElementField(v);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -64,6 +64,7 @@
@Override
public boolean visitEnter(WikittyQuery o) {
WikittyQuery q = getQuery();
+ q.setFacetExtension(q.isFacetExtension());
q.setFacetField(new ArrayList<ElementField>(o.getFacetField()));
q.setFacetLimit(o.getFacetLimit());
q.setFacetMinCount(o.getFacetMinCount());
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -2,6 +2,7 @@
import java.io.Serializable;
import org.apache.commons.lang.ObjectUtils;
+import org.nuiton.wikitty.WikittyUtil;
/**
* Class mere qui determine sur quoi porte une condition. Les classes filles
@@ -20,6 +21,11 @@
// serialVersionUID is used for serialization.
private static final long serialVersionUID = 1L;
+ public static final ElementId ID = new ElementId();
+ public static final ElementExtension EXTENSION = new ElementExtension();
+ public static final ElementField ALL_FIELD =
+ new ElementField("*" + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + "*");
+
protected String value;
public Element() {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -5,7 +5,8 @@
import org.nuiton.wikitty.query.WikittyQueryParser;
/**
- * Un element qui represente les extensions
+ * Un element qui represente les extensions, vous devez utiliser l'instance
+ * {@link Element#EXTENSION}
*
* @author poussin
* @version $Revision$
@@ -21,7 +22,7 @@
private static final long serialVersionUID = 1L;
- public ElementExtension() {
+ protected ElementExtension() {
super(WikittyQueryParser.EXTENSION);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -2,7 +2,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.wikitty.WikittyUtil;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
@@ -24,9 +23,6 @@
private static final long serialVersionUID = 1L;
- static final public ElementField ALL_FIELD =
- new ElementField("*" + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + "*");
-
public ElementField(String value) {
super(value);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -5,7 +5,8 @@
import org.nuiton.wikitty.query.WikittyQueryParser;
/**
- * Element qui represente l'Id
+ * Element qui represente l'Id, vous devez utiliser l'instance
+ * {@link Element#ID}
*
* @author poussin
* @version $Revision$
@@ -21,7 +22,7 @@
private static final long serialVersionUID = 1L;
- public ElementId() {
+ protected ElementId() {
super(WikittyQueryParser.ID);
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -183,7 +183,7 @@
+ "|(" + SUFFIX_SORTABLE + "$)"
, "");
if (SOLR_EXTENSIONS.equals(fieldName)) {
- fieldName = new ElementExtension().getValue();
+ fieldName = Element.EXTENSION.getValue();
}
return fieldName;
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:12:58 UTC (rev 1268)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:43:37 UTC (rev 1269)
@@ -60,6 +60,7 @@
import org.nuiton.wikitty.services.WikittyTransaction;
import java.io.File;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.nuiton.util.ApplicationConfig;
import org.nuiton.util.TimeLog;
@@ -709,18 +710,24 @@
}
// Add faceting
+ boolean isFacetExtension = query.isFacetExtension();
List<ElementField> facetField = query.getFacetField();
List<FacetQuery> facetQuery = query.getFacetQuery();
// use to map query string to criteria facet name
Map<String, String> facetQueryToName = new HashMap<String, String>();
- if ((facetField != null && !facetField.isEmpty())
- || (facetQuery != null && !facetQuery.isEmpty())) {
+ if (isFacetExtension
+ || CollectionUtils.isNotEmpty(facetField)
+ || CollectionUtils.isNotEmpty(facetQuery)) {
querySolr.setFacet(true);
querySolr.setFacetMinCount(query.getFacetMinCount());
querySolr.setFacetLimit(query.getFacetLimit());
+ if (isFacetExtension) {
+ querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
+ }
+
// field facetisation
if (facetField != null) {
for (ElementField fqfieldName : facetField) {
@@ -746,7 +753,10 @@
SolrDocumentList solrResults = resp.getResults();
Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
- if (facetField != null && !facetField.isEmpty()) {
+
+ // la facet sur les extensions est directement et convenablement
+ // gere comme un champs
+ if (CollectionUtils.isNotEmpty(facetField)) {
for (FacetField facet : resp.getFacetFields()) {
String facetName = elementModifier.convertToField(facet.getName());
List<FacetTopic> topics = new ArrayList<FacetTopic>();
@@ -761,7 +771,8 @@
facets.put(facetName, topics);
}
}
- if (facetQuery != null && !facetQuery.isEmpty()) {
+
+ if (CollectionUtils.isNotEmpty(facetQuery)) {
for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
String facetName = facet.getKey();
// don't use contains because, map can have key with null value
1
0
r1268 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-generators/src/main/java/org/nuiton/wikitty/generator wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 16:12:58 +0100 (Fri, 30 Dec 2011)
New Revision: 1268
Url: http://nuiton.org/repositories/revision/wikitty/1268
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Generation dans les interfaces d'objet ElementField pour chaque champs
Utilisation du ElementField au lieu d'une String pour les sort et les facetField
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -38,6 +38,7 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+import org.nuiton.wikitty.query.conditions.ElementField;
/**
* Wikitty client is object used in client side to access WikittyService.
@@ -486,7 +487,7 @@
* @return
*/
public <E extends BusinessEntityImpl> WikittyQueryResult<E> findAllByExample(E e,
- int first, int limit, String ... fieldFacet ) {
+ int first, int limit, ElementField ... fieldFacet ) {
long start = TimeLog.getTime();
WikittyQuery query = new WikittyQueryMaker().wikitty(e).end()
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -8,6 +8,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ElementField;
/**
* Classe permettant de faire des recherches dans les données.
@@ -66,14 +67,14 @@
/** Facet on condition. */
protected List<FacetQuery> facetQuery;
/** Facet on field. */
- protected List<String> facetField;
+ protected List<ElementField> facetField;
/** if true facet is done on extension name */
protected boolean facetExtension = false;
/** Sort ascending on fields. */
- protected List<String> sortAscending;
+ protected List<ElementField> sortAscending;
/** Sort descending on fields. */
- protected List<String> sortDescending;
+ protected List<ElementField> sortDescending;
/** create anonymous query */
@@ -232,24 +233,24 @@
return this;
}
- public List<String> getFacetField() {
+ public List<ElementField> getFacetField() {
if (facetField == null) {
- facetField = new LinkedList<String>();
+ facetField = new LinkedList<ElementField>();
}
return facetField;
}
- public WikittyQuery addFacetField(String field) {
+ public WikittyQuery addFacetField(ElementField field) {
getFacetField().add(field);
return this;
}
- public WikittyQuery setFacetField(String ... facetField) {
- this.facetField = new LinkedList<String>(Arrays.asList(facetField));
+ public WikittyQuery setFacetField(ElementField ... facetField) {
+ this.facetField = new LinkedList<ElementField>(Arrays.asList(facetField));
return this;
}
- public WikittyQuery setFacetField(List<String> facetField) {
+ public WikittyQuery setFacetField(List<ElementField> facetField) {
this.facetField = facetField;
return this;
}
@@ -269,24 +270,24 @@
*
* @return field names
*/
- public List<String> getSortAscending() {
+ public List<ElementField> getSortAscending() {
if (sortAscending == null) {
- sortAscending = new LinkedList<String>();
+ sortAscending = new LinkedList<ElementField>();
}
return sortAscending;
}
- public WikittyQuery addSortAscending(String ... field) {
+ public WikittyQuery addSortAscending(ElementField ... field) {
getSortAscending().addAll(Arrays.asList(field));
return this;
}
- public WikittyQuery setSortAscending(String ... sortAscending) {
- this.sortAscending = new LinkedList<String>(Arrays.asList(sortAscending));
+ public WikittyQuery setSortAscending(ElementField ... sortAscending) {
+ this.sortAscending = new LinkedList<ElementField>(Arrays.asList(sortAscending));
return this;
}
- public WikittyQuery setSortAscending(List<String> sortAscending) {
+ public WikittyQuery setSortAscending(List<ElementField> sortAscending) {
this.sortAscending = sortAscending;
return this;
}
@@ -296,24 +297,24 @@
*
* @return field names
*/
- public List<String> getSortDescending() {
+ public List<ElementField> getSortDescending() {
if (sortDescending == null) {
- sortDescending = new LinkedList<String>();
+ sortDescending = new LinkedList<ElementField>();
}
return sortDescending;
}
- public WikittyQuery addSortDescending(String ... field) {
+ public WikittyQuery addSortDescending(ElementField ... field) {
getSortDescending().addAll(Arrays.asList(field));
return this;
}
- public WikittyQuery setSortDescending(String ... sortDescending) {
- this.sortDescending = new LinkedList<String>(Arrays.asList(sortDescending));
+ public WikittyQuery setSortDescending(ElementField ... sortDescending) {
+ this.sortDescending = new LinkedList<ElementField>(Arrays.asList(sortDescending));
return this;
}
- public WikittyQuery setSortDescending(List<String> sortDescending) {
+ public WikittyQuery setSortDescending(List<ElementField> sortDescending) {
this.sortDescending = sortDescending;
return this;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -8,6 +8,7 @@
import org.nuiton.wikitty.query.conditions.Condition;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -63,15 +64,15 @@
@Override
public boolean visitEnter(WikittyQuery o) {
WikittyQuery q = getQuery();
- q.setFacetField(new ArrayList<String>(o.getFacetField()));
+ q.setFacetField(new ArrayList<ElementField>(o.getFacetField()));
q.setFacetLimit(o.getFacetLimit());
q.setFacetMinCount(o.getFacetMinCount());
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
q.setName(o.getName());
q.setSelect(o.getSelect());
- q.setSortAscending(new ArrayList<String>(o.getSortAscending()));
- q.setSortDescending(new ArrayList<String>(o.getSortDescending()));
+ q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
+ q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
for (FacetQuery c : o.getFacetQuery()) {
WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy();
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -115,6 +115,7 @@
addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyExtension");
+ addImport(contract, "org.nuiton.wikitty.query.conditions.ElementField");
addImport(contract, "org.nuiton.wikitty.WikittyUtil");
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUser");
addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUserAbstract");
@@ -202,7 +203,14 @@
"FQ_" + fieldVariableName,
"String",
extensionVariableName + " + \"." + name + "\"",
- ObjectModelModifier.PUBLIC);
+ ObjectModelModifier.PUBLIC);
+
+ // adding public static final String ELEMENT_FIELD_CLIENT_NAME = new ElementField(EXT_CLIENT + ".name");
+ addConstant(contract,
+ "ELEMENT_" + fieldVariableName,
+ "ElementField",
+ "new ElementField(FQ_" +fieldVariableName + ")",
+ ObjectModelModifier.PUBLIC);
}
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -50,6 +50,7 @@
* final 'monfield' n'est pas de ce type alors on ne retrouvera rien car
* on recherchera sur un champs inexistant
* <li> *.* ou * = recherche fulltext
+ * <li> #..... = un champs special force par l'utilisateur
*
* @param tx
* @param element
@@ -62,88 +63,105 @@
} else if (element instanceof ElementExtension) {
result = SOLR_EXTENSIONS;
} else if (element instanceof ElementField) {
- String[] searchField =
- element.getValue().split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
+ String fieldValue = element.getValue();
+ if (StringUtils.startsWith(fieldValue, WikittySolrConstant.SOLR_WIKITTY_PREFIX)) {
+ // c'est un champs specifique a l'indexation, un utilisateur
+ // avance a du l'utiliser directement, on lui fait confiance
+ // et on le laisse comme ca
+ result = fieldValue;
+ } else {
+ String[] searchField = fieldValue.split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
- if (searchField.length >= 2) {
- String extName = searchField[0];
- String fieldName = searchField[1];
+ if (searchField.length >= 2) {
+ String extName = searchField[0];
+ String fieldName = searchField[1];
- if ("*".equals(extName) && "*".equals(fieldName)) {
- result = SOLR_FULLTEXT;
- } else if ("*".equals(extName)) {
- result = SOLR_ALL_EXTENSIONS
- + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ if ("*".equals(extName) && "*".equals(fieldName)) {
+ result = SOLR_FULLTEXT;
+ } else if ("*".equals(extName)) {
+ result = SOLR_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- String modifier = "";
- // on recherche si le type a ete force
- if (searchField.length >= 3) {
- // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
- // utile pour force la recherche sur les bons champs lorsqu'on
- // demande une recherche sur * == #all
- String fieldNameType = searchField[2];
- TYPE type = FieldType.TYPE.valueOf(fieldNameType);
- // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
- modifier = SolrUtil.getSolrFieldName("", type);
- }
+ String modifier = "";
+ // on recherche si le type a ete force
+ if (searchField.length >= 3) {
+ // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
+ // utile pour force la recherche sur les bons champs lorsqu'on
+ // demande une recherche sur * == #all
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
+ modifier = SolrUtil.getSolrFieldName("", type);
+ }
- if (StringUtils.isEmpty(modifier)) {
- // si on arrive ici, c'est qu'on a pas reussi a calculer le
- // modifier cela peut arriver par exemple pour
- // #all ou le seul moyen d'avoir le type est qu'il soit donne
- // dans le champs, sinon on ne peut pas le trouver
- if (log.isDebugEnabled()) {
- log.debug("Search on multi extentions (*) without field"
- + " type, fallback search in fulltext");
+ if (StringUtils.isEmpty(modifier)) {
+ // si on arrive ici, c'est qu'on a pas reussi a calculer le
+ // modifier cela peut arriver par exemple pour
+ // #all ou le seul moyen d'avoir le type est qu'il soit donne
+ // dans le champs, sinon on ne peut pas le trouver
+ if (log.isDebugEnabled()) {
+ log.debug("Search on multi extentions (*) without field"
+ + " type, fallback search in fulltext");
+ }
+ result = SOLR_FULLTEXT_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ } else {
+ result += modifier;
}
- result = SOLR_FULLTEXT_ALL_EXTENSIONS
- + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ } else if ("*".equals(fieldName)) {
+ // on doit recherche sur tout les champs de cette extension
+ // en fait cela revient a faire une recherche fulltext avec
+ // une 2eme condition sur le type d'extension
+ // Il ne faut donc pas le gere comme ca, on previent via
+ // une exception qui l'explique
+ throw new WikittyException(
+ "To search on all field of one extension, you must"
+ + " use two condition, one on extension type, other"
+ + " in fulltext '*.*' with the wanted constraint");
} else {
- result += modifier;
- }
+ result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- } else if ("*".equals(fieldName)) {
- // on doit recherche sur tout les champs de cette extension
- // en fait cela revient a faire une recherche fulltext avec
- // une 2eme condition sur le type d'extension
- // Il ne faut donc pas le gere comme ca, on previent via
- // une exception qui l'explique
- throw new WikittyException(
- "To search on all field of one extension, you must"
- + " use to condition, one on extension type, other"
- + " in fulltext '*.*' with the wanted constraint");
- } else {
- result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
-
- // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
- // Search type of field in extension
- String version =
- extensionStorage.getLastVersion(tx, extName);
- if (version != null) { // not valid extension if version == null
- WikittyExtension ext = extensionStorage.restore(
- tx, extName, version);
- FieldType fieldType = ext.getFieldType(fieldName);
- if (log.isDebugEnabled()) {
- log.debug(ext.toDefinition() + " for " + fieldName);
- }
- if (fieldType != null) { // type can be null if extension version differ
- TYPE type = fieldType.getType();
- result = SolrUtil.getSolrFieldName(result, type);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ // Search type of field in extension
+ String version =
+ extensionStorage.getLastVersion(tx, extName);
+ if (version == null) {
+ // not valid extension if version == null
+ // cela arrive si le framework genere des requetes
+ // si des extensions non enregistrer en base
+ // cela est possible par exemple sur les WikittyTreeNode
+ log.info(String.format(
+ "Can't find extension '%s'", extName));
} else {
- throw new WikittyException(String.format(
- "Can't find field '%s' in extension '%s'"
- + " with definition: %s",
- fieldName, ext.getId(), ext.toDefinition()));
+ WikittyExtension ext = extensionStorage.restore(
+ tx, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ if (log.isDebugEnabled()) {
+ log.debug(ext.toDefinition() + " for " + fieldName);
+ }
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ result = SolrUtil.getSolrFieldName(result, type);
+ } else {
+ // on ne retrouve pas le champs, on le laisse comme il est
+ // mais normalement rien ne matchera avec
+ // TODO poussin 20111230 peut-etre transforme
+ // le champs en une recherche fulltext ???
+ // mais c peut-etre dangereux car ce n'est pas
+ // ce qu'a demande l'utilisateur
+ log.info(String.format(
+ "Can't find field '%s' in extension '%s'"
+ + " with definition: %s",
+ fieldName, ext.getId(), ext.toDefinition()));
+ }
}
- } else {
- throw new WikittyException(String.format(
- "Can't find extension '%s'", extName));
}
+ } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
+ result = SOLR_FULLTEXT;
+ } else {
+ throw new WikittyException("Empty field name is unsupported");
}
- } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
- result = SOLR_FULLTEXT;
- } else {
- throw new WikittyException("Empty field name is unsupported");
}
} else {
throw new WikittyException(String.format(
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:12:58 UTC (rev 1268)
@@ -72,6 +72,7 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -675,19 +676,19 @@
querySolr.setRows(limit);
// Add sorting
- List<String> sortAscending = query.getSortAscending();
+ List<ElementField> sortAscending = query.getSortAscending();
if(sortAscending != null) {
- for (String sort : sortAscending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
+ for (ElementField sort : sortAscending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
- List<String> sortDescending = query.getSortDescending();
+ List<ElementField> sortDescending = query.getSortDescending();
if(sortDescending != null) {
- for (String sort : sortDescending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
+ for (ElementField sort : sortDescending) {
+ String tranform = elementModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
}
@@ -701,14 +702,14 @@
// Limit on wikitty
String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
- query.addFacetField(selectWikitty);
+ query.addFacetField(new ElementField(selectWikitty));
// We need no result, just facet
query.setLimit(0);
}
// Add faceting
- List<String> facetField = query.getFacetField();
+ List<ElementField> facetField = query.getFacetField();
List<FacetQuery> facetQuery = query.getFacetQuery();
// use to map query string to criteria facet name
@@ -722,8 +723,8 @@
// field facetisation
if (facetField != null) {
- for (String fqfieldName : facetField) {
- String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
+ for (ElementField fqfieldName : facetField) {
+ String tranform = elementModifier.convertToSolr(transaction, fqfieldName);
querySolr.addFacetField(tranform);
}
}
@@ -747,7 +748,7 @@
Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
if (facetField != null && !facetField.isEmpty()) {
for (FacetField facet : resp.getFacetFields()) {
- String facetName = fieldModifier.convertToField(transaction, facet.getName());
+ String facetName = elementModifier.convertToField(facet.getName());
List<FacetTopic> topics = new ArrayList<FacetTopic>();
if (facet.getValues() != null) {
for (FacetField.Count value : facet.getValues()) {
@@ -876,7 +877,7 @@
.and().condition(filter.getCondition())
.eq(TREENODE_ATTACHED_ALL, wikittyId).end()
.setFirst(0).setLimit(0)
- .addFacetField(TREENODE_ATTACHED_ALL)
+ .addFacetField(new ElementField(TREENODE_ATTACHED_ALL))
// l'arbre peut avoir beaucoup de branche, il
// faut que toutes les branches aient un count
// des attachments
1
0
r1267 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 30 Dec '11
by bpoussin@users.nuiton.org 30 Dec '11
30 Dec '11
Author: bpoussin
Date: 2011-12-30 15:32:17 +0100 (Fri, 30 Dec 2011)
New Revision: 1267
Url: http://nuiton.org/repositories/revision/wikitty/1267
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Implantation du WikittyQueryVisitorToSolr
Tout compile et tous les tests repassent, mais il reste encore du travail :)
Added:
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -45,7 +45,10 @@
* into business objects used by applications.
*
* It also manage {@link #securityToken} for {@link org.nuiton.wikitty.services.WikittyServiceSecurity}.
- *
+ *
+ * All method that need {@link #securityToken} and {@link org.nuiton.wikitty.services.WikittyServiceSecurity}
+ * must be in this class and not in {@link WikittyUtil}
+ *
* @author poussin
* @version $Revision$
* @since 3.3
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -35,8 +35,10 @@
* q.accept(v);
* v.getXXXX()
* </pre>
- *
*
+ * ATTENTION les sous classes doivent avoir une visibilite public car sinon
+ * l'introspection n'arrive pas a executer les methods
+ *
* @author poussin
* @version $Revision$
* @since 3.3
@@ -201,7 +203,9 @@
try {
downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -222,7 +226,9 @@
try {
result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -245,7 +251,9 @@
try {
result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
@@ -267,7 +275,9 @@
try {
downPolymorphic.invoke(this, new Object[] {object, enterOrMiddleResult});
} catch (Exception eee) {
- throw new WikittyException("Error during visitor call", eee);
+ throw new WikittyException(String.format(
+ "Error during visitor call method '%s'",
+ downPolymorphic), eee);
}
}
}
Added: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java (rev 0)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -0,0 +1,172 @@
+package org.nuiton.wikitty.storage.solr;
+
+import org.apache.commons.lang.ClassUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.FieldType.TYPE;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.conditions.Element;
+import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.ElementId;
+import org.nuiton.wikitty.services.WikittyTransaction;
+import org.nuiton.wikitty.storage.WikittyExtensionStorage;
+
+import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.*;
+
+/**
+ * Converti la valeur des objects de type {@link Element} pour etre utilisable
+ * dans Solr
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ElementModifier {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ElementModifier.class);
+
+ protected WikittyExtensionStorage extensionStorage;
+
+ public ElementModifier(WikittyExtensionStorage extensionStorage) {
+ this.extensionStorage = extensionStorage;
+ }
+
+ /**
+ * Different cas d'entree
+ * <li> monext.monfield on recherche sur un champs, son type est retrouve dans la base
+ * <li> monext.monfield.NUMERIC le type n'est pas pris en compte, car le champs
+ * est complement renseigne et donc on va recherche dans la base son type
+ * <li> *.monfield = recherche fulltext car aucun type n'est indique
+ * <li> *.monfield.NUMERIC recheche en utilise le type demande si on
+ * final 'monfield' n'est pas de ce type alors on ne retrouvera rien car
+ * on recherchera sur un champs inexistant
+ * <li> *.* ou * = recherche fulltext
+ *
+ * @param tx
+ * @param element
+ * @return
+ */
+ public String convertToSolr(WikittyTransaction tx, Element element) {
+ String result;
+ if (element instanceof ElementId) {
+ result = SOLR_ID;
+ } else if (element instanceof ElementExtension) {
+ result = SOLR_EXTENSIONS;
+ } else if (element instanceof ElementField) {
+ String[] searchField =
+ element.getValue().split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
+
+ if (searchField.length >= 2) {
+ String extName = searchField[0];
+ String fieldName = searchField[1];
+
+ if ("*".equals(extName) && "*".equals(fieldName)) {
+ result = SOLR_FULLTEXT;
+ } else if ("*".equals(extName)) {
+ result = SOLR_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ String modifier = "";
+ // on recherche si le type a ete force
+ if (searchField.length >= 3) {
+ // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
+ // utile pour force la recherche sur les bons champs lorsqu'on
+ // demande une recherche sur * == #all
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ...
+ modifier = SolrUtil.getSolrFieldName("", type);
+ }
+
+ if (StringUtils.isEmpty(modifier)) {
+ // si on arrive ici, c'est qu'on a pas reussi a calculer le
+ // modifier cela peut arriver par exemple pour
+ // #all ou le seul moyen d'avoir le type est qu'il soit donne
+ // dans le champs, sinon on ne peut pas le trouver
+ if (log.isDebugEnabled()) {
+ log.debug("Search on multi extentions (*) without field"
+ + " type, fallback search in fulltext");
+ }
+ result = SOLR_FULLTEXT_ALL_EXTENSIONS
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ } else {
+ result += modifier;
+ }
+
+ } else if ("*".equals(fieldName)) {
+ // on doit recherche sur tout les champs de cette extension
+ // en fait cela revient a faire une recherche fulltext avec
+ // une 2eme condition sur le type d'extension
+ // Il ne faut donc pas le gere comme ca, on previent via
+ // une exception qui l'explique
+ throw new WikittyException(
+ "To search on all field of one extension, you must"
+ + " use to condition, one on extension type, other"
+ + " in fulltext '*.*' with the wanted constraint");
+ } else {
+ result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ // Search type of field in extension
+ String version =
+ extensionStorage.getLastVersion(tx, extName);
+ if (version != null) { // not valid extension if version == null
+ WikittyExtension ext = extensionStorage.restore(
+ tx, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ if (log.isDebugEnabled()) {
+ log.debug(ext.toDefinition() + " for " + fieldName);
+ }
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ result = SolrUtil.getSolrFieldName(result, type);
+ } else {
+ throw new WikittyException(String.format(
+ "Can't find field '%s' in extension '%s'"
+ + " with definition: %s",
+ fieldName, ext.getId(), ext.toDefinition()));
+ }
+ } else {
+ throw new WikittyException(String.format(
+ "Can't find extension '%s'", extName));
+ }
+ }
+ } else if (searchField.length >= 1 && "*".equals(searchField[0])) {
+ result = SOLR_FULLTEXT;
+ } else {
+ throw new WikittyException("Empty field name is unsupported");
+ }
+ } else {
+ throw new WikittyException(String.format(
+ "Unsupported Element type '%s'",
+ ClassUtils.getShortCanonicalName(element, "null")));
+ }
+
+ return result;
+ }
+
+ public String convertToField(String solrName) {
+ String fieldName = solrName.replaceAll(
+ "(" + SUFFIX_BINARY + "$)"
+ + "|(" + SUFFIX_BOOLEAN + "$)"
+ + "|(" + SUFFIX_DATE + "$)"
+ + "|(" + SUFFIX_STRING + "$)"
+ + "|(" + SUFFIX_WIKITTY + "$)"
+ + "|(" + SUFFIX_NUMERIC + "$)"
+ + "|(" + SUFFIX_SORTABLE + "$)"
+ , "");
+ if (SOLR_EXTENSIONS.equals(fieldName)) {
+ fieldName = new ElementExtension().getValue();
+ }
+ return fieldName;
+ }
+}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -44,7 +44,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new {@link ElementModifier} with new query API
*/
+@Deprecated
public class FieldModifier {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -1,15 +1,18 @@
package org.nuiton.wikitty.storage.solr;
+import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.solr.client.solrj.SolrServer;
+import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryVisitor;
import org.nuiton.wikitty.query.conditions.And;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.Condition;
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.Element;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.False;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -26,6 +29,7 @@
import org.nuiton.wikitty.query.conditions.Or;
import org.nuiton.wikitty.query.conditions.True;
import org.nuiton.wikitty.query.conditions.Unlike;
+import org.nuiton.wikitty.services.WikittyTransaction;
/**
* Converti une {@link Condition} en une requete Solr, une fois la condition
@@ -41,13 +45,14 @@
* Last update: $Date$
* by : $Author$
*/
-class WikittyQueryVisitorToSolr extends WikittyQueryVisitor {
+public class WikittyQueryVisitorToSolr extends WikittyQueryVisitor {
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(WikittyQueryVisitorToSolr.class);
- protected SolrServer solrServer;
- protected FieldModifier fieldModifier;
+ protected WikittyTransaction tx;
+ protected WikittySearchEngineSolr solrServer;
+ protected ElementModifier elementModifier;
protected String solrQuery = "";
@@ -55,168 +60,237 @@
return solrQuery;
}
- public WikittyQueryVisitorToSolr(SolrServer solrServer, FieldModifier fieldModifier) {
+ public WikittyQueryVisitorToSolr(WikittyTransaction tx,
+ WikittySearchEngineSolr solrServer, ElementModifier elementModifier) {
+ this.tx = tx;
this.solrServer = solrServer;
- this.fieldModifier = fieldModifier;
+ this.elementModifier = elementModifier;
}
+ private String element2solr(Element element) {
+ String result = elementModifier.convertToSolr(tx, element);
+ return result;
+ }
+
+ private String value2solr(String value) {
+ String result;
+ if (value != null) {
+ result = "\"" + StringEscapeUtils.escapeJava(value) + "\"";
+ } else {
+ throw new WikittyException("Parse error, value must be not empty");
+ }
+ return result;
+ }
+
@Override
public boolean visitEnter(WikittyQuery o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ // do nothing
+ return true;
}
@Override
public void visitLeave(WikittyQuery o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ // do nothing
}
@Override
public boolean visitEnter(And o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "(";
+ return true;
}
@Override
public boolean visitMiddle(And o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += " AND ";
+ return true;
}
@Override
- public void visitLeave(And o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(And o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public boolean visitEnter(Or o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "(";
+ return true;
}
@Override
public boolean visitMiddle(Or o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += " OR ";
+ return true;
}
@Override
- public void visitLeave(Or o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Or o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public boolean visitEnter(Join o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ WikittyQuery q = new WikittyQuery(o.getSubCondition()).setLimit(Integer.MAX_VALUE);
+ WikittyQueryResult<String> result = solrServer.findAllByQuery(tx, q);
+
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : result) {
+ solrQuery += sep + value2solr(e);
+ sep = " OR ";
+ }
+ solrQuery += ")";
+ return false;
}
@Override
- public void visitLeave(Join o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Join o, boolean enterResult) {
+ // do nothing
}
@Override
public boolean visitEnter(Not o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "NOT(";
+ return true;
}
@Override
- public void visitLeave(Not o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visitLeave(Not o, boolean enterResult) {
+ solrQuery += ")";
}
@Override
public void visit(Between o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[" + value2solr(o.getMin()) + " TO " + value2solr(o.getMax()) + "]";
}
@Override
public void visit(ContainsAll o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : o.getValues()) {
+ solrQuery += sep + value2solr(e);
+ sep = " AND ";
+ }
+ solrQuery += ")";
}
@Override
public void visit(ContainsOne o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":(";
+ String sep = "";
+ for(String e : o.getValues()) {
+ solrQuery += sep + value2solr(e);
+ sep = " OR ";
+ }
+ solrQuery += ")";
}
@Override
public void visit(Equals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":" + value2solr(o.getValue());
}
@Override
public void visit(NotEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += "-" + element2solr(o.getElement())
+ + ":" + value2solr(o.getValue());
}
@Override
- public void visit(False o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visit(True o) {
+ solrQuery += "( *:* )";
}
@Override
- public void visit(True o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void visit(False o) {
+ solrQuery += "( *:* - *:* )";
}
@Override
public void visit(Greater o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":{" + value2solr(o.getValue()) + " TO *}";
}
@Override
public void visit(GreaterOrEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[" + value2solr(o.getValue()) + " TO *]";
}
@Override
public void visit(Keyword o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += value2solr(o.getValue());
}
@Override
public void visit(Less o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":{* TO " + value2solr(o.getValue()) + "}";
}
@Override
public void visit(LessOrEquals o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += element2solr(o.getElement())
+ + ":[* TO " + value2solr(o.getValue()) + "]";
}
@Override
public void visit(Like o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ String element2solr = element2solr(o.getElement());
+ if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string
+ // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ?
+ element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT;
+ }
+
+ solrQuery += element2solr + ":" + value2solr(o.getValue());
}
@Override
public void visit(Unlike o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ String element2solr = element2solr(o.getElement());
+ if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string
+ // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ?
+ element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT;
+ }
+
+ solrQuery += "-" + element2solr + ":" + value2solr(o.getValue());
}
@Override
public void visit(Null o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += WikittySolrConstant.SOLR_NULL_FIELD
+ + o.getElement().getValue() + ":true";
}
@Override
public void visit(NotNull o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ solrQuery += WikittySolrConstant.SOLR_NULL_FIELD
+ + o.getElement().getValue() + ":false";
}
@Override
public void defaultVisit(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
public boolean defaultVisitEnter(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
public boolean defaultVisitMiddle(Object o) {
- throw new UnsupportedOperationException("Not supported yet.");
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
@Override
- public void defaultVisitLeave(Object o, boolean enterOrMiddleResult) {
- throw new UnsupportedOperationException("Not supported yet.");
+ public void defaultVisitLeave(Object o, boolean enterResult) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
}
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -93,8 +93,12 @@
protected SolrServer solrServer;
/** Field modifier use to transform to solr format */
+ @Deprecated
protected FieldModifier fieldModifier;
+ /** Field modifier use to transform to solr format */
+ protected ElementModifier elementModifier;
+
/** JTA resource */
protected SolrResource solrResource;
@@ -144,6 +148,7 @@
solrServer = new EmbeddedSolrServer(solrCore, "");
fieldModifier = new FieldModifier(extensionStorage);
+ elementModifier = new ElementModifier(extensionStorage);
solrResource = new SolrResource(solrServer);
} catch (Exception eee) {
@@ -651,7 +656,8 @@
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
try {
// Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
query.getCondition().accept(v);
String queryString = v.getSolrQuery();
SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
@@ -725,7 +731,8 @@
// query facetisation
if (facetQuery != null) {
for (FacetQuery facet : facetQuery) {
- v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
facet.getCondition().accept(v);
String queryFacet = v.getSolrQuery();
facetQueryToName.put(queryFacet, facet.getName());
@@ -850,7 +857,8 @@
// on a dans treeSearch uniquement le noeud passe en parametre
// et ses enfants jusqu'a la profondeur demandee
// Create querySolr
- WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(
+ transaction, this, elementModifier);
treeQuery.getCondition().accept(v);
String queryString = v.getSolrQuery();
SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
Modified: trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java
===================================================================
--- trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java 2011-12-29 19:04:15 UTC (rev 1266)
+++ trunk/wikitty-solr/src/test/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolrTest.java 2011-12-30 14:32:17 UTC (rev 1267)
@@ -198,7 +198,7 @@
TreeNodeResult<String> treeNodeResult =
ws.getSearchEngine().findAllChildrenCount(
- null, root.getId(), 0, true, null);
+ null, root.getId(), 0, true, (Criteria)null);
int val = treeNodeResult.getAttCount();
// Integer val = ws.getSearchEngine().findNodeCount(null, root, null);
Assert.assertEquals(12, val);
@@ -207,7 +207,7 @@
// Map<String, Integer> children = ws.getSearchEngine().findAllChildrenCount(null, root, null);
TreeNodeResult<String> children =
ws.getSearchEngine().findAllChildrenCount(
- null, root.getId(), 1, true, null);
+ null, root.getId(), 1, true, (Criteria)null);
if (log.isDebugEnabled()) {
log.debug("Children : " + children);
}
1
0
r1266 - in trunk/wikitty-api/src/main/java/org/nuiton/wikitty: . entities query
by bpoussin@users.nuiton.org 29 Dec '11
by bpoussin@users.nuiton.org 29 Dec '11
29 Dec '11
Author: bpoussin
Date: 2011-12-29 20:04:15 +0100 (Thu, 29 Dec 2011)
New Revision: 1266
Url: http://nuiton.org/repositories/revision/wikitty/1266
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Implantation de WikittyClient en remplacement de WikittyProxy qui est maintenant deprecated
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -0,0 +1,1449 @@
+package org.nuiton.wikitty;
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.util.TimeLog;
+import org.nuiton.wikitty.entities.BusinessEntity;
+import org.nuiton.wikitty.entities.BusinessEntityImpl;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyGroup;
+import org.nuiton.wikitty.entities.WikittyUser;
+import org.nuiton.wikitty.services.WikittyEvent;
+import org.nuiton.wikitty.services.WikittySecurityUtil;
+import org.nuiton.wikitty.services.WikittyServiceEnhanced;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.collections.CollectionUtils;
+import org.nuiton.wikitty.entities.WikittyField;
+import org.nuiton.wikitty.entities.WikittyTokenHelper;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+
+/**
+ * Wikitty client is object used in client side to access WikittyService.
+ * It is used to transform wikitty object used by {@link WikittyService}
+ * into business objects used by applications.
+ *
+ * It also manage {@link #securityToken} for {@link org.nuiton.wikitty.services.WikittyServiceSecurity}.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyClient {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ final static private Log log = LogFactory.getLog(WikittyClient.class);
+ final static private TimeLog timeLog = new TimeLog(WikittyClient.class);
+
+ /** Delegated wikitty service. */
+ protected WikittyServiceEnhanced wikittyService;
+
+ /**
+ * Security token.
+ *
+ * @see org.nuiton.wikitty.services.WikittyServiceSecurity#login(String, String)
+ */
+ protected String securityToken;
+
+ /**
+ * Empty constructor (uninitialized wikittyService).
+ */
+ public WikittyClient() {
+ }
+
+ public WikittyClient(ApplicationConfig config) {
+ if (config != null) {
+ long timeToLogInfo = config.getOptionAsInt(WikittyConfigOption.
+ WIKITTY_PROXY_TIME_TO_LOG_INFO.getKey());
+ long timeToLogWarn = config.getOptionAsInt(WikittyConfigOption.
+ WIKITTY_PROXY_TIME_TO_LOG_WARN.getKey());
+ timeLog.setTimeToLogInfo(timeToLogInfo);
+ timeLog.setTimeToLogWarn(timeToLogWarn);
+ }
+ }
+
+ /**
+ * Constructor with wikittyService.
+ *
+ * @param wikittyService wikitty service
+ */
+ public WikittyClient(WikittyService wikittyService) {
+ this();
+ setWikittyService(wikittyService);
+ }
+
+ public WikittyClient(ApplicationConfig config, WikittyService wikittyService) {
+ this(config);
+ setWikittyService(wikittyService);
+ }
+
+ static public TimeLog getTimeTrace() {
+ return timeLog;
+ }
+
+ static public Map<String, TimeLog.CallStat> getCallCount() {
+ return timeLog.getCallCount();
+ }
+
+ public void login(String login, String password) {
+ long start = TimeLog.getTime();
+ String result = wikittyService.login(login, password);
+ setSecurityToken(result);
+
+ timeLog.log(start, "login");
+ }
+
+ public void logout() {
+ long start = TimeLog.getTime();
+ wikittyService.logout(securityToken);
+
+ timeLog.log(start, "logout");
+ }
+
+ public String getSecurityToken() {
+ return securityToken;
+ }
+
+ public void setSecurityToken(String securityToken) {
+ this.securityToken = securityToken;
+ }
+
+ /**
+ * get current wikittyUser logged or null if no user logged
+ * @return null if no user logged
+ */
+ public WikittyUser getUser() {
+ WikittyUser result = getUser(WikittyUser.class);
+ return result;
+ }
+
+ /**
+ * get current logged user wikitty object
+ * @param clazz Business class used as User in your application,
+ * this extension should be require WikittyUser.
+ * @return null if no user logged
+ */
+ public <E extends BusinessEntity> E getUser(Class<E> clazz) {
+ E result = null;
+ if (securityToken != null) {
+ //Get the token
+ Wikitty securityTokenWikitty = restore(securityToken);
+ if (securityTokenWikitty != null) {
+ //Get the user
+ String userId = WikittyTokenHelper.getUser(securityTokenWikitty);
+ result = restore(clazz, userId);
+ }
+ }
+ return result;
+ }
+
+ public WikittyService getWikittyService() {
+ return wikittyService.getDelegate();
+ }
+
+ public void setWikittyService(WikittyService wikittyService) {
+ this.wikittyService = new WikittyServiceEnhanced(wikittyService);
+ }
+
+ public <E extends BusinessEntity> E store(E e) {
+ Wikitty w = ((BusinessEntityImpl)e).getWikitty();
+ store(w);
+ return e;
+ }
+
+ public Wikitty store(Wikitty w) {
+ long start = TimeLog.getTime();
+ WikittyEvent resp = wikittyService.store(securityToken, w);
+ // update object
+ resp.update(w);
+
+ timeLog.log(start, "store");
+ return w;
+ }
+
+ public <E extends BusinessEntity> E[] store(E e1, E e2, E... eN) {
+ List<E> es = new ArrayList<E>(eN.length + 2);
+ Collections.addAll(es, e1, e2);
+ Collections.addAll(es, eN);
+
+ List<E> list = store(es);
+
+ E[] result = list.toArray((E[])Array.newInstance(
+ eN.getClass().getComponentType(), list.size()));
+ return result;
+ }
+
+ public Wikitty[] store(Wikitty w1, Wikitty w2, Wikitty... wN) {
+ List<Wikitty> ws = new ArrayList<Wikitty>(wN.length + 2);
+ Collections.addAll(ws, w1, w2);
+ Collections.addAll(ws, wN);
+
+ List<Wikitty> resultList = storeWikitty(ws);
+ Wikitty[] result = resultList.toArray(new Wikitty[resultList.size()]);
+ return result;
+ }
+
+ /**
+ * Store to WikittyService objects.
+ *
+ * @param <E> object type
+ * @param objets list
+ * @return updated objects list
+ */
+ public <E extends BusinessEntity> List<E> store(List<E> objets) {
+ long start = TimeLog.getTime();
+ // prepare data to send to service
+ List<Wikitty> wikitties = new ArrayList<Wikitty>(objets.size());
+ for (E e : objets) {
+ if (e == null) {
+ wikitties.add(null);
+ } else {
+ Wikitty w = ((BusinessEntityImpl)e).getWikitty();
+ wikitties.add(w);
+ }
+ }
+
+ // call the service with Wikitty
+ WikittyEvent resp = wikittyService.store(securityToken, wikitties);
+
+ // update object
+ for (Wikitty w : wikitties) {
+ resp.update(w);
+ }
+
+ timeLog.log(start, "store<list>");
+ return objets;
+ }
+
+ public List<Wikitty> storeWikitty(List<Wikitty> wikitties) {
+ long start = TimeLog.getTime();
+
+ // call the service with Wikitty
+ WikittyEvent resp = wikittyService.store(securityToken, wikitties);
+
+ // update object
+ for (Wikitty w : wikitties) {
+ resp.update(w);
+ }
+
+ timeLog.log(start, "storeWikitty<list>");
+ return wikitties;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @param checkExtension if true check that Wikitty result has all extension
+ * declared in clazz
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
+ try {
+ long start = TimeLog.getTime();
+ E result = null;
+ if (id != null) {
+ HashSet<String> extNames = null;
+
+ Wikitty wikitty = wikittyService.restore(securityToken, id);
+ if (wikitty != null) {
+ if (checkExtension) {
+ extNames = new HashSet<String>(wikitty.getExtensionNames());
+ }
+ result = WikittyUtil.newInstance(
+ securityToken, wikittyService, clazz, wikitty);
+
+ if (checkExtension) {
+ // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
+ BusinessEntityImpl b = (BusinessEntityImpl) result;
+ Collection<WikittyExtension> BusinessEntityStaticExtensions = b.getStaticExtensions();
+ for (WikittyExtension ext : BusinessEntityStaticExtensions) {
+ String extensionName = ext.getName();
+ if (!extNames.contains(extensionName)) {
+ // extension wanted by BusinessEntity (clazz)
+ // is not in wikitty, then wikitty is not good type
+ // for business
+ result = null;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ timeLog.log(start, "restore<Business>");
+ return result;
+ } catch (SecurityException eee) {
+ throw eee;
+ } catch (Exception eee) {
+ throw new WikittyException("Can't restore wikitty", eee);
+ }
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param id entity id
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public Wikitty restore(String id) {
+ long start = TimeLog.getTime();
+ Wikitty result = null;
+ if (id != null) {
+ result = wikittyService.restore(securityToken, id);
+ }
+
+ timeLog.log(start, "restore");
+ return result;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be found.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity id
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public <E extends BusinessEntity> E restore(Class<E> clazz, String id) {
+ E result = restore(clazz, id, false);
+ return result;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity can't be be found.
+ *
+ * @param id entity ids if null return is empty list
+ * @return wikitty entity with specified id or {@code null} if entity can't be found
+ */
+ public List<Wikitty> restore(List<String> id) {
+ long start = TimeLog.getTime();
+
+ List<Wikitty> result;
+ if (id == null) {
+ result = new ArrayList<Wikitty>();
+ } else {
+ result = wikittyService.restore(securityToken, id);
+ }
+
+ timeLog.log(start, "restoreWikitty<list>");
+ return result;
+ }
+
+ /**
+ * Restore wikitty entity with specified id or {@code null} if entity
+ * can't be be found, or checkExtension is true and wikitty don't match
+ * extension wanted.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param id entity ids if null return is empty list
+ * @param checkExtension if true check that Wikitty result has all extension
+ * @return wikitty entity with specified id or {@code null} if entity
+ * can't be found or if one wikitty don't have extension wanted by E type
+ */
+ public <E extends BusinessEntity> List<E> restore(
+ Class<E> clazz, List<String> id, boolean checkExtension) {
+ long start = TimeLog.getTime();
+ List<E> result = new ArrayList<E>();
+
+ if (id != null) {
+ List<Wikitty> wikitties = wikittyService.restore(securityToken, id);
+
+ Collection<String> businessExtension = null;
+ if (checkExtension) {
+ // Recuperation de la liste des extensions du BusinessEntity resultats
+ BusinessEntityImpl sample =
+ (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
+ businessExtension = sample.getExtensionNames();
+ }
+
+ for (Wikitty w : wikitties) {
+ E dto = null;
+ if (!checkExtension ||
+ // on ne check pas les extensions ou ...
+ CollectionUtils.subtract(businessExtension, w.getExtensionNames()).isEmpty()) {
+ // ... on a retrouve toutes les extensions du wikitty dans l'objet
+ // on le prend dans les resultats
+ dto = WikittyUtil.newInstance(clazz, w);
+ } // sinon on ne prend pas l'objet
+
+ // add entity to result after checkExtension
+ result.add(dto);
+ }
+ }
+ timeLog.log(start, "restore<list>");
+ return result;
+ }
+
+ public <E extends BusinessEntity> List<E> restore(Class<E> clazz, List<String> id) {
+ List<E> result = restore(clazz, id, false);
+ return result;
+ }
+
+ public Set<Wikitty> restore(Set<String> id) {
+ ArrayList<String> list = null;
+ if (id != null) {
+ list = new ArrayList<String>(id);
+ }
+ List<Wikitty> resultList = restore(list);
+ Set<Wikitty> result = new HashSet<Wikitty>(resultList);
+ return result;
+ }
+
+ public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, Set<String> id) {
+ Set<E> result = restore(clazz, id, false);
+ return result;
+ }
+
+ public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, Set<String> id, boolean checkExtension) {
+ ArrayList<String> list = null;
+ if (id != null) {
+ list = new ArrayList<String>(id);
+ }
+ List<E> resultList = restore(clazz, list, checkExtension);
+ Set<E> result = new HashSet<E>(resultList);
+ return result;
+ }
+
+ public void delete(String id) {
+ long start = TimeLog.getTime();
+ wikittyService.delete(securityToken, id);
+
+ timeLog.log(start, "delete");
+ }
+
+ public <E extends BusinessEntity> void delete(E object) {
+ long start = TimeLog.getTime();
+ if (object != null) {
+ String id = object.getWikittyId();
+ wikittyService.delete(securityToken, id);
+ }
+ timeLog.log(start, "delete(BusinessEntity)");
+ }
+
+ public void delete(Collection<String> ids) {
+ long start = TimeLog.getTime();
+ wikittyService.delete(securityToken, ids);
+
+ timeLog.log(start, "delete<list>");
+ }
+
+ public <E extends BusinessEntity> void delete(List<E> objets) {
+ long start = TimeLog.getTime();
+
+ // prepare data to send to service
+ List<String> ids = new ArrayList<String>(objets.size());
+ for (E e : objets) {
+ if (e != null) {
+ String id = e.getWikittyId();
+ ids.add(id);
+ }
+ }
+
+ // call the service with Wikitty
+ wikittyService.delete(securityToken, ids);
+
+ timeLog.log(start, "delete<list<BusinessEntity>>");
+ }
+
+ /**
+ * Null field are not used in search request.
+ *
+ * @param e sample wikitty
+ * @param firstIndex
+ * @param endIndex
+ * @param fieldFacet
+ * @return
+ */
+ public <E extends BusinessEntityImpl> WikittyQueryResult<E> findAllByExample(E e,
+ int first, int limit, String ... fieldFacet ) {
+ long start = TimeLog.getTime();
+
+ WikittyQuery query = new WikittyQueryMaker().wikitty(e).end()
+ .setFirst(first).setLimit(limit)
+ .setFacetField(fieldFacet);
+
+ WikittyQueryResult<String> queryResult = findAllIdByQuery(query);
+ WikittyQueryResult<E> result = (WikittyQueryResult<E>)castTo(
+ e.getClass(), queryResult);
+
+ timeLog.log(start, "findAllByExample<limit>");
+ return result;
+ }
+
+ /**
+ * Null field are not used in search request.
+ *
+ * @param e sample wikitty
+ * @return
+ */
+ public <E extends BusinessEntityImpl> E findByExample(E e) {
+ long start = TimeLog.getTime();
+ WikittyQuery query = new WikittyQueryMaker().wikitty(e).end();
+
+ String id = findIdByQuery(query);
+ E result = (E)restore(e.getClass(), id);
+
+ timeLog.log(start, "findByExample");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND ALL BY CRITERIA <E>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Search object that correspond to criteria and that have all extension
+ * needed by BusinessEntity (clazz). If one criteria is null, find all extensions
+ * for this criteria else if criteria is empty return nothing.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param criterias criterias
+ * @return paged result
+ */
+ public <E extends BusinessEntity> List<WikittyQueryResult<E>> findAllByQuery(
+ Class<E> clazz, List<WikittyQuery> criterias) {
+ long start = TimeLog.getTime();
+ List<WikittyQueryResult<E>> result = null;
+ if (criterias != null) {
+ // newInstance only return BusinessEntityWikittyImpl
+ BusinessEntityImpl sample =
+ (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
+
+ Wikitty wikitty = sample.getWikitty();
+ Collection<String> extensions = wikitty.getExtensionNames();
+
+ List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
+ for (WikittyQuery criteria : criterias) {
+
+ // on ajoute la condition sur les extensions dans le critere
+ // du coup, pour ne pas modifier le critere qui vient en parametre
+ // il faut creer un nouveau critere ...
+ WikittyQuery serviceCriteria = null;
+ if (criteria != null) {
+ serviceCriteria = criteria.copy();
+
+ // Dont add contraint if using select
+ if (StringUtils.isEmpty(criteria.getSelect())) {
+
+ // utilisation de cette nouvelle contrainte sur le nouvel objet
+ // creation de la nouvelle contrainte
+ WikittyQueryMaker queryMaker = new WikittyQueryMaker()
+ .and().condition(serviceCriteria.getCondition())
+ .extContainsAll(extensions);
+
+ serviceCriteria.setCondition(queryMaker.getCondition());
+ }
+ }
+
+ // ajout de ce criteria dans la liste de tous les criteres
+ serviceCriterias.add(serviceCriteria);
+ }
+
+ List<WikittyQueryResult<String>> pagedResult = wikittyService.findAllByQuery(
+ securityToken, serviceCriterias);
+
+ // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
+ // in one call to service. Currently each PagedResult.cast do a call
+ result = new ArrayList<WikittyQueryResult<E>>(pagedResult.size());
+ for (WikittyQueryResult<String> p : pagedResult) {
+ result.add((WikittyQueryResult<E>)castTo(sample.getClass(), p));
+ }
+ }
+ timeLog.log(start, "findAllByCriteria<Business>(List)");
+ return result;
+ }
+
+ /**
+ * Search object that correspond to criteria and that have all extension
+ * needed by BusinessEntity (clazz). If criteria is null, find all extensions
+ * else if criteria is empty return nothing.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param criteria criteria
+ * @return paged result
+ */
+ public <E extends BusinessEntity> WikittyQueryResult<E> findAllByCriteria(
+ Class<E> clazz, WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ WikittyQueryResult<E> result = findAllByQuery(clazz,
+ Collections.singletonList(criteria)).get(0);
+ timeLog.log(start, "findAllByCriteria<Business>(One)");
+ return result;
+ }
+
+ /**
+ * Search object that correspond to criteria and that have all extension
+ * needed by BusinessEntity (clazz). If criteria is null, find all extensions
+ * else if criteria is empty return nothing.
+ *
+ * @param <E> object type
+ * @param clazz entity class
+ * @param c1 criteria 1
+ * @param c2 criteria 2
+ * @param otherCriteria otherCriteria
+ * @return paged result
+ */
+ public <E extends BusinessEntity> WikittyQueryResult<E>[] findAllByQuery(
+ Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
+ long start = TimeLog.getTime();
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<WikittyQueryResult<E>> resultList = findAllByQuery(clazz, criterias);
+ WikittyQueryResult<E>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
+ timeLog.log(start, "findAllByCriteria<Business>(Varargs)");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND ALL BY CRITERIA <Wikitty>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ public List<WikittyQueryResult<Wikitty>> findAllByQuery(List<WikittyQuery> criteria) {
+ long start = TimeLog.getTime();
+ List<WikittyQueryResult<Wikitty>> result = null;
+ if (criteria != null) {
+ List<WikittyQueryResult<String>> resultId =
+ wikittyService.findAllByQuery(securityToken, criteria);
+
+ // TODO poussin 20110318 optimize cast. Try to cast all pagedResult id
+ // in one call to service. Currently each PagedResult.cast do a call
+ result = new ArrayList<WikittyQueryResult<Wikitty>>(resultId.size());
+ for (WikittyQueryResult<String> p : resultId) {
+ result.add(castTo(Wikitty.class, p));
+ }
+ }
+ timeLog.log(start, "findAllByCriteria(List)");
+ return result;
+ }
+
+ public WikittyQueryResult<Wikitty> findAllByQuery(WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ WikittyQueryResult<Wikitty> result = null;
+ if (criteria != null) {
+ result = findAllByQuery(Collections.singletonList(criteria)).get(0);
+ }
+ timeLog.log(start, "findAllByCriteria(One)");
+ return result;
+ }
+
+ public WikittyQueryResult<Wikitty>[] findAllByQuery(
+ WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
+ long start = TimeLog.getTime();
+
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<WikittyQueryResult<Wikitty>> resultList = findAllByQuery(criterias);
+ WikittyQueryResult<Wikitty>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
+
+ timeLog.log(start, "findAllByCriteria(Varargs)");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND ALL ID BY CRITERIA <String>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ public List<WikittyQueryResult<String>> findAllIdByQuery(List<WikittyQuery> criteria) {
+ long start = TimeLog.getTime();
+ List<WikittyQueryResult<String>> result = null;
+ if (criteria != null) {
+ result = wikittyService.findAllByQuery(securityToken, criteria);
+ }
+ timeLog.log(start, "findAllIdByCriteria(List)");
+ return result;
+ }
+
+ public WikittyQueryResult<String> findAllIdByQuery(WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ WikittyQueryResult<String> result = null;
+ if (criteria != null) {
+ result = findAllIdByQuery(
+ Collections.singletonList(criteria)).get(0);
+ }
+ timeLog.log(start, "findAllIdByCriteria(One)");
+ return result;
+ }
+
+ public WikittyQueryResult<String>[] findAllIdByQuery(
+ WikittyQuery c1, WikittyQuery c2, WikittyQuery ... otherCriteria) {
+ long start = TimeLog.getTime();
+
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<WikittyQueryResult<String>> resultList = findAllIdByQuery(criterias);
+ WikittyQueryResult<String>[] result = resultList.toArray(new WikittyQueryResult[criterias.size()]);
+
+ timeLog.log(start, "findAllIdByCriteria(Varargs)");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND ID BY CRITERIA <String>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ public List<String> findIdByQuery(List<WikittyQuery> criteria) {
+ long start = TimeLog.getTime();
+ List<String> result = null;
+ if (criteria != null) {
+ result = wikittyService.findByQuery(securityToken, criteria);
+ }
+ timeLog.log(start, "findIdByCriteria(List)");
+ return result;
+ }
+
+ public String findIdByQuery(WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ String result = null;
+ if (criteria != null) {
+ result = findIdByQuery(Collections.singletonList(criteria)).get(0);
+ }
+ timeLog.log(start, "findIdByCriteria(One)");
+ return result;
+ }
+
+ public String[] findIdByQuery(
+ WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
+ long start = TimeLog.getTime();
+
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<String> resultList = findIdByQuery(criterias);
+ String[] result = resultList.toArray(new String[criterias.size()]);
+
+ timeLog.log(start, "findIdByCriteria(Varargs)");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND BY CRITERIA <E>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ public <E extends BusinessEntity> List<E> findByQuery(
+ Class<E> clazz, List<WikittyQuery> criterias) {
+ long start = TimeLog.getTime();
+ List<E> result = null;
+ if (criterias != null) {
+ BusinessEntityImpl sample =
+ (BusinessEntityImpl) WikittyUtil.newInstance(clazz);
+
+ Wikitty wikitty = sample.getWikitty();
+ Collection<String> extensions = wikitty.getExtensionNames();
+ List<WikittyQuery> serviceCriterias = new ArrayList<WikittyQuery>(criterias.size());
+ for (WikittyQuery criteria : criterias) {
+ // on a pas besoin de recuperer les limits du query puisqu'on en
+ // veut qu'un et donc qu'on ne retourne pas de WikittyQueryResult
+ // donc on ne fait pas une copie, on en cree un nouveau directement
+ // a partir de la condition
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().condition(criteria.getCondition())
+ .extContainsAll(extensions).end();
+ serviceCriterias.add(q);
+ }
+
+ List<String> id = findIdByQuery(serviceCriterias);
+ result = restore(clazz, id);
+ }
+ timeLog.log(start, "multiFindByCriteria<Business>(List>");
+ return result;
+ }
+
+ public <E extends BusinessEntity> E findByQuery(
+ Class<E> clazz, WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ E result = null;
+ if (criteria != null) {
+ List<E> criterias = findByQuery(clazz, Collections.singletonList(criteria));
+ if (!criterias.isEmpty()) {
+ result = criterias.get(0);
+ }
+ }
+ timeLog.log(start, "findByCriteria<Business>(One)");
+ return result;
+ }
+
+ public <E extends BusinessEntity> E[] findByQuery(
+ Class<E> clazz, WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
+ long start = TimeLog.getTime();
+
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<E> resultList = findByQuery(clazz, criterias);
+ E[] result = resultList.toArray((E[])Array.newInstance(clazz, resultList.size()));
+
+ timeLog.log(start, "findByCriteria<Business>(Varargs)");
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND BY CRITERIA <Wikitty>
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ public List<Wikitty> findByQuery(List<WikittyQuery> criteria) {
+ long start = TimeLog.getTime();
+ List<Wikitty> result = null;
+ if (criteria != null) {
+ List<String> id = findIdByQuery(criteria);
+ result = restore(id);
+ }
+ timeLog.log(start, "findByCriteria(List)");
+ return result;
+ }
+
+ public Wikitty findByQuery(WikittyQuery criteria) {
+ long start = TimeLog.getTime();
+ String id = findIdByQuery(criteria);
+ Wikitty wikitty = restore(id);
+ timeLog.log(start, "findByCriteria(One)");
+ return wikitty;
+ }
+
+ public Wikitty[] findByQuery(
+ WikittyQuery c1, WikittyQuery c2, WikittyQuery... otherCriteria) {
+ long start = TimeLog.getTime();
+
+ List<WikittyQuery> criterias = new ArrayList<WikittyQuery>(otherCriteria.length + 2);
+ Collections.addAll(criterias, c1, c2);
+ Collections.addAll(criterias, otherCriteria);
+
+ List<String> resultList = findIdByQuery(criterias);
+ List<Wikitty> wikitties = restore(resultList);
+ Wikitty[] result = wikitties.toArray(new Wikitty[resultList.size()]);
+
+ timeLog.log(start, "findByCriteria(Varargs)");
+ return result;
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // FIND BY TREE NODE
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Recupere une portion d'arbre a partir de l'id passer en parametre. L'id
+ * doit etre celui d'un WikittyTreeNode. Ce WikittyTreeNode est alors le
+ * root de l'arbre retourne.
+ *
+ * Return Wikitty in result, those Wikitties have WikittyTreeNode extension
+ *
+ * @param wikittyId root
+ * @param depth profondeur de noeud a recuperer
+ * @param count vrai si l'on veut le nombre de piece attaches sur le noeud
+ * (piece des enfants compris)
+ * @param filter filter pour compter les pieces attachees
+ * @return treeNodeResult of wikitty
+ *
+ * @since 3.1
+ */
+ public WikittyQueryResultTreeNode<Wikitty> findTreeNode(
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ long start = TimeLog.getTime();
+
+ WikittyQueryResultTreeNode<String> resultId = wikittyService.findTreeNode(
+ securityToken, wikittyId, depth, count, filter);
+
+ RetrieveIdVisitor retrieveIdVisitor = new RetrieveIdVisitor();
+ resultId.acceptVisitor(retrieveIdVisitor);
+
+ List<String> ids = retrieveIdVisitor.getIds();
+ List<Wikitty> wikitties = restore(ids);
+
+ IdToObjectConverter<Wikitty> converter =
+ new IdToObjectConverter<Wikitty>(ids, wikitties);
+
+ ConvertTreeVisitor<Wikitty> convertVisitor =
+ new ConvertTreeVisitor<Wikitty>(converter);
+
+ resultId.acceptVisitor(convertVisitor);
+
+ WikittyQueryResultTreeNode<Wikitty> result = convertVisitor.getTree();
+ timeLog.log(start, "findTreeNode<Wikitty>");
+ return result;
+ }
+
+ /**
+ * Recupere une portion d'arbre a partir de l'id passer en parametre. L'id
+ * doit etre celui d'un WikittyTreeNode. Ce WikittyTreeNode est alors le
+ * root de l'arbre retourne.
+ *
+ * Return E in result
+ *
+ * @param clazz business class wanted to replace id in TreeNodeResult
+ * @param wikittyId root
+ * @param depth profondeur de noeud a recuperer
+ * @param count vrai si l'on veut le nombre de piece attaches sur le noeud (piece des enfants compris)
+ * @param filter filter pour compter les pieces attachees
+ * @return
+ *
+ * @since 3.1
+ */
+ public <E extends BusinessEntity> WikittyQueryResultTreeNode<E> findTreeNode(
+ Class<E> clazz, String wikittyId, int depth,
+ boolean count, WikittyQuery filter) {
+ long start = TimeLog.getTime();
+
+ WikittyQueryResultTreeNode<String> resultId = wikittyService.findTreeNode(
+ securityToken, wikittyId, depth, count, filter);
+
+ RetrieveIdVisitor retrieveIdVisitor = new RetrieveIdVisitor();
+ resultId.acceptVisitor(retrieveIdVisitor);
+
+ List<String> ids = retrieveIdVisitor.getIds();
+ List<E> wikitties = restore(clazz, ids);
+
+ IdToObjectConverter<E> converter =
+ new IdToObjectConverter<E>(ids, wikitties);
+
+ ConvertTreeVisitor<E> convertVisitor =
+ new ConvertTreeVisitor<E>(converter);
+
+ resultId.acceptVisitor(convertVisitor);
+
+ WikittyQueryResultTreeNode<E> result = convertVisitor.getTree();
+ timeLog.log(start, "findTreeNode");
+ return result;
+ }
+
+ /**
+ * Used to collect all node id
+ * @since 3.1
+ */
+ static private class RetrieveIdVisitor implements WikittyQueryResultTreeNode.Visitor<String> {
+
+ protected List<String> ids = new ArrayList<String>();
+
+ public List<String> getIds() {
+ return ids;
+ }
+
+ @Override
+ public boolean visitEnter(WikittyQueryResultTreeNode<String> node) {
+ String id = node.getObject();
+ ids.add(id);
+ return true;
+ }
+
+ @Override
+ public boolean visitLeave(WikittyQueryResultTreeNode<String> node) {
+ return true;
+ }
+ }
+
+ /**
+ * Converti un id en son object WikittyTreeNode
+ * @since 3.1
+ */
+ static private class IdToObjectConverter<T> implements ConvertTreeVisitor.Converter<String, T> {
+ protected Map<String, T> objects = new HashMap<String, T>();
+ protected String securityToken;
+ protected WikittyService wikittyService;
+ public IdToObjectConverter(List<String> ids, List<T> objectList) {
+
+ for (int i = 0; i < ids.size(); i++) {
+ this.objects.put(ids.get(i), objectList.get(i));
+ }
+ }
+
+ @Override
+ public T convert(String id) {
+ T result = objects.get(id);
+ return result;
+ }
+ }
+
+ /**
+ * Parcours un TreeNodeResult et en fait une copie en modifiant le type
+ * d'objet stocker dans le noeud grace a un converter, si le converter
+ * est null une exception est levee
+ *
+ * @param <TARGET> le type d'objet pour le nouvel arbre
+ * @since 3.1
+ */
+ static private class ConvertTreeVisitor<TARGET extends Serializable>
+ implements WikittyQueryResultTreeNode.Visitor<String> {
+
+ static private interface Converter<SOURCE, TARGET> {
+ public TARGET convert(SOURCE o);
+ }
+ protected Converter<String, TARGET> converter;
+ protected WikittyQueryResultTreeNode<TARGET> tree = null;
+ protected LinkedList<WikittyQueryResultTreeNode<TARGET>> stack =
+ new LinkedList<WikittyQueryResultTreeNode<TARGET>>();
+
+ public ConvertTreeVisitor(Converter<String, TARGET> converter) {
+ this.converter = converter;
+ if (converter == null) {
+ throw new IllegalArgumentException("Converter can't be null");
+ }
+ }
+
+ public WikittyQueryResultTreeNode<TARGET> getTree() {
+ return tree;
+ }
+
+ @Override
+ public boolean visitEnter(WikittyQueryResultTreeNode<String> node) {
+ String id = node.getObject();
+ int count = node.getAttCount();
+
+ TARGET object = converter.convert(id);
+ WikittyQueryResultTreeNode<TARGET> newNode = new WikittyQueryResultTreeNode<TARGET>(
+ object, count);
+
+ WikittyQueryResultTreeNode<TARGET> parent = stack.peekLast();
+ if (parent == null) {
+ // le premier noeud, donc le root a retourner plus tard
+ tree = newNode;
+ } else {
+ parent.add(newNode);
+ }
+
+ stack.offerLast(newNode);
+
+ return true;
+ }
+
+ @Override
+ public boolean visitLeave(WikittyQueryResultTreeNode<String> node) {
+ stack.pollLast();
+ return true;
+ }
+ }
+
+ /**
+ * Recupere une portion d'arbre a partir de l'id passer en parametre. L'id
+ * doit etre celui d'un WikittyTreeNode. Ce WikittyTreeNode est alors le
+ * root de l'arbre retourne.
+ *
+ * Return just wikitty Id in result
+ *
+ * @param wikittyId
+ * @param depth
+ * @param count
+ * @param filter
+ * @return
+ * @since 3.1
+ */
+ public WikittyQueryResultTreeNode<String> findAllIdTreeNode(
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ long start = TimeLog.getTime();
+ WikittyQueryResultTreeNode<String> result = wikittyService.findTreeNode(
+ securityToken, wikittyId, depth, count, filter);
+
+ timeLog.log(start, "findAllIdTreeNode");
+ return result;
+ }
+
+ /**
+ * Delete specified tree node and all sub nodes.
+ *
+ * @param treeNodeId tree node id to delete
+ * @return {@true} if at least one node has been deleted
+ */
+ public WikittyEvent deleteTree(String treeNodeId) {
+ long start = TimeLog.getTime();
+ WikittyEvent result = wikittyService.deleteTree(securityToken,treeNodeId);
+
+ timeLog.log(start, "deleteTree");
+ return result;
+ }
+
+ public Wikitty restoreVersion(String wikittyId, String version) {
+ long start = TimeLog.getTime();
+ Wikitty result = wikittyService.restoreVersion(
+ securityToken, wikittyId, version);
+
+ timeLog.log(start, "restoreVersion");
+ return result;
+ }
+
+ /**
+ * Manage Update and creation.
+ *
+ * @param ext extension to be persisted
+ * @return update response
+ */
+ public WikittyEvent storeExtension(WikittyExtension ext) {
+ long start = TimeLog.getTime();
+ WikittyEvent response =
+ wikittyService.storeExtension(securityToken, ext);
+
+ timeLog.log(start, "storeExtension");
+ return response;
+ }
+
+ /**
+ * Manage Update and creation.
+ *
+ * @param exts list of wikitty extension to be persisted
+ * @return update response
+ */
+ public WikittyEvent storeExtension(Collection<WikittyExtension> exts) {
+ long start = TimeLog.getTime();
+ WikittyEvent response =
+ wikittyService.storeExtension(securityToken, exts);
+
+ timeLog.log(start, "storeExtension<list>");
+ return response;
+ }
+
+ /**
+ * Load extension from id. Id is 'name[version]'.
+ *
+ * @param extensionId extension id to restore
+ * @return the corresponding object, exception if no such object found.
+ */
+ public WikittyExtension restoreExtension(String extensionId) {
+ long start = TimeLog.getTime();
+ WikittyExtension extension = wikittyService.restoreExtension(securityToken, extensionId);
+
+ timeLog.log(start, "restoreExtension");
+ return extension;
+ }
+
+ /**
+ * Search extension with name in last version.
+ *
+ * @param extensionName extension name
+ * @return the corresponding object, exception if no such object found.
+ */
+ public WikittyExtension restoreExtensionLastVersion(String extensionName) {
+ long start = TimeLog.getTime();
+ WikittyExtension extension = wikittyService.restoreExtensionLastVersion(securityToken, extensionName);
+
+ timeLog.log(start, "restoreExtensionLastVersion");
+ return extension;
+ }
+
+ /**
+ * Search extension with name in last version.
+ *
+ * @param extensionNames extension name
+ * @return extension wanted with dependencies extensions at head of list
+ */
+ public List<WikittyExtension> restoreExtensionAndDependenciesLastVesion(Collection<String> extensionNames) {
+ long start = TimeLog.getTime();
+ List<WikittyExtension> result =
+ wikittyService.restoreExtensionAndDependenciesLastVesion(
+ securityToken, extensionNames);
+
+ timeLog.log(start, "restoreExtensionAndDependenciesLastVesion");
+ return result;
+
+ }
+
+ public void deleteExtension(String extName) {
+ long start = TimeLog.getTime();
+ wikittyService.deleteExtension(securityToken, extName);
+
+ timeLog.log(start, "deleteExtension");
+ }
+
+ public void deleteExtension(Collection<String> extNames) {
+ long start = TimeLog.getTime();
+ wikittyService.deleteExtension(securityToken, extNames);
+
+ timeLog.log(start, "deleteExtension<list>");
+ }
+
+ /**
+ * Return all extension id (ex: "extName[version])").
+ *
+ * @return extension id list
+ */
+ public List<String> getAllExtensionIds() {
+ long start = TimeLog.getTime();
+ List<String> result = wikittyService.getAllExtensionIds(securityToken);
+
+ timeLog.log(start, "getAllExtensionIds");
+ return result;
+ }
+
+ /**
+ * Return all extension id (ex: "extName[version])") where
+ * {@code extensionName} is required.
+ *
+ * @param extensionName extension name
+ * @return extensions
+ */
+ public List<String> getAllExtensionsRequires(String extensionName) {
+ long start = TimeLog.getTime();
+ List<String> result = wikittyService.getAllExtensionsRequires(securityToken, extensionName);
+
+ timeLog.log(start, "getAllExtensionsRequires");
+ return result;
+ }
+
+ /**
+ * Use with caution : It will delete ALL indexes from search engine !
+ * This operation should be disabled in production environment.
+ */
+ public WikittyEvent clear() {
+ long start = TimeLog.getTime();
+ WikittyEvent result = wikittyService.clear(securityToken);
+
+ timeLog.log(start, "clear");
+ return result;
+ }
+
+ /**
+ * Synchronize search engine with wikitty storage engine, i.e. clear and
+ * reindex all object.
+ */
+ public void syncSearchEngine() {
+ long start = TimeLog.getTime();
+ wikittyService.syncSearchEngine(securityToken);
+
+ timeLog.log(start, "syncSearchEngine");
+ }
+
+ /**
+ * Method to get the Wikitty encapsulated into a BusinessEntity
+ *
+ * This method can go to serveur side, if BusinessEntity is not
+ * BusinessEntityImpl, this append when use GWT
+ *
+ * @param entity the BusinessEntity encapsulating the Wikitty
+ * @return the wikitty encapsulated
+ */
+ public Wikitty getWikitty(BusinessEntity entity){
+ long start = TimeLog.getTime();
+ Wikitty result;
+
+ if (entity instanceof BusinessEntityImpl) {
+ result = ((BusinessEntityImpl) entity).getWikitty();
+ } else {
+ String id = entity.getWikittyId();
+
+ result = restore(id);
+
+ //try settings all fields except version
+ try {
+ //get all fields
+ Class entityClass = entity.getClass();
+ Field[] fields = entityClass.getDeclaredFields();
+
+ for(Field field:fields){
+ //for each field that got WikittyField annotation
+ if (field.isAnnotationPresent(WikittyField.class)){
+
+ //get the attribute's wikitty fqn
+ WikittyField annotation = field.getAnnotation(WikittyField.class);
+ String fieldFQN = annotation.fqn();
+
+ //set the value
+ Method m = entityClass.getMethod("get" + StringUtils.capitalize(field.getName()));
+ Object value = m.invoke(entity);
+
+ result.setFqField(fieldFQN, value);
+ }
+ }
+ } catch (Exception eee) {
+ throw new WikittyException("Could not transform entity to Wikitty", eee);
+ }
+
+ //manually set version
+ result.setVersion(entity.getWikittyVersion());
+ }
+
+ timeLog.log(start, "getWikitty");
+ return result;
+ }
+
+ /**
+ * Check that the logged in user is in a group. A #SecurityException might
+ * be thrown at runtime if the #WikittyUser session timed out.
+ * @param groupName the name of the group to check
+ * @return true is the logged in user is in the group
+ */
+ public boolean isMember(String groupName) {
+ long start = TimeLog.getTime();
+ boolean result = false;
+
+ WikittyUser user = getLoggedInUser();
+
+ //Find the group from its name
+ WikittyQuery criteria = new WikittyQueryMaker().and()
+ .exteq(WikittyGroup.EXT_WIKITTYGROUP)
+ .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, groupName)
+ .end();
+
+ Wikitty group = findByQuery(criteria);
+
+ if (group != null && user != null) {
+ result = WikittySecurityUtil.isMember(wikittyService, securityToken,
+ user.getWikittyId(), group.getId());
+ }
+
+ timeLog.log(start, "isMember");
+ return result;
+ }
+
+ /**
+ * Get the #WikittyUser that is logged in. A #SecurityException might be
+ * thrown at runtime if the #WikittyUser session timed out.
+ * @return the logged in #WikittyUser
+ */
+ public WikittyUser getLoggedInUser() {
+ long start = TimeLog.getTime();
+
+ String userId = WikittySecurityUtil.getUserForToken(wikittyService,
+ securityToken);
+
+ WikittyUser user = restore(WikittyUser.class, userId);
+
+ timeLog.log(start, "getLoggedInUser");
+ return user;
+ }
+
+ /**
+ * Convert all result to the wanted type and return new WikittyQueryResult
+ * with this new result list. For business object transformation, if some
+ * result don't have the right extension (clazz) this extension is
+ * automatically added.
+ *
+ * @param queryResult result to convert
+ * @param target to cast into.
+ * Can be Wikitty, BusinessEntity, String, Date, BigDecimal, Boolean, byte[]
+ * @return new WikittyQueryResult with element in right class or Exception
+ * if conversion is impossible
+ */
+ public <E> WikittyQueryResult<E> castTo(Class<E> target,
+ WikittyQueryResult queryResult) {
+ List<E> castedResult;
+
+ if (queryResult.size() == 0) {
+ // on ne fait rien on met juste une nouvelle liste vide
+ castedResult = new ArrayList<E>();
+ } else if (target.isAssignableFrom(Wikitty.class)) {
+ // On veut des Wikitties en sortie
+
+ if (queryResult.peek() instanceof Wikitty) {
+ // W, rien a faire
+ castedResult = queryResult.getAll();
+ } else if (queryResult.peek() instanceof BusinessEntityImpl) {
+ // BusinessEntityImpl, il faut recuperer les wikitty
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (BusinessEntityImpl e : (WikittyQueryResult<BusinessEntityImpl>)queryResult) {
+ castedResult.add((E)e.getWikitty());
+ }
+ } else if (queryResult.peek() instanceof String) {
+ // String, il faut faire un restore
+ // le queryResult courant contient des Ids
+ // Si ce n'est pas le cas, ca veut dire que le developpeur utilisant
+ // ce queryResult ne sait pas ce qu'il fait :)
+ List<String> ids = (List<String>) queryResult.getAll();
+ castedResult = (List<E>)getWikittyService().restore(securityToken, ids);
+ } else {
+ throw new ClassCastException("WikittyQueryResult don't contains"
+ + " object convertible to Wikitty"
+ + " (accepted Wikitty, BusinessEntityImpl, String id) but "
+ + queryResult.peek().getClass());
+ }
+ } else if (target.isAssignableFrom(BusinessEntityImpl.class)) {
+ // on commence par tout mettre en Wikitty, en utilisant le if du dessus
+ WikittyQueryResult<Wikitty> resultTmp = castTo(Wikitty.class, queryResult);
+ castedResult = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp.getAll());
+ } else if (target.isAssignableFrom(BigDecimal.class)) {
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (Object o : queryResult) {
+ BigDecimal v = WikittyUtil.toBigDecimal(o);
+ castedResult.add((E)v);
+ }
+ } else if (target.isAssignableFrom(Date.class)) {
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (Object o : queryResult) {
+ Date v = WikittyUtil.toDate(o);
+ castedResult.add((E)v);
+ }
+ } else if (target.isAssignableFrom(Boolean.class)) {
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (Object o : queryResult) {
+ Boolean v = WikittyUtil.toBoolean(o);
+ castedResult.add((E)v);
+ }
+ } else if (target.isAssignableFrom(byte[].class)) {
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (Object o : queryResult) {
+ byte[] v = WikittyUtil.toBinary(o);
+ castedResult.add((E)v);
+ }
+ } else if (target.isAssignableFrom(String.class)) {
+ castedResult = new ArrayList<E>(queryResult.size());
+ for (Object o : queryResult) {
+ String v = WikittyUtil.toString(o);
+ castedResult.add((E)v);
+ }
+ }else {
+ throw new ClassCastException(String.format(
+ "WikittyQueryResult don't contains"
+ + " object convertible to %s"
+ + " (accepted Wikitty, BusinessEntityImpl, String id, Date,"
+ + " BigDecimal, Boolean, byte[]) but '%s'",
+ target.getName(), queryResult.peek().getClass()));
+ }
+
+ WikittyQueryResult<E> result = new WikittyQueryResult<E>(
+ queryResult.getQueryName(),
+ queryResult.getFirst(), queryResult.getTotalResult(),
+ queryResult.getQueryString(), queryResult.getFacets(),
+ castedResult);
+ return result;
+ }
+
+
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -72,7 +72,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use {@link WikittyClient}
*/
+@Deprecated
public class WikittyProxy {
/** to use log facility, just put in your code: log.info(\"...\"); */
@@ -1235,6 +1237,19 @@
return result;
}
+ /**
+ * XXX poussin 20111229 cette methode n'est pas documentee et ne semble pas
+ * utilisee, heureusement car son implantation est fausse :(.
+ * On cree un BusinessEntity autour d'un wikitty puis ensuite on check les
+ * extension, or lors de la creation du BusinessEntity sur le wikitty celui
+ * ci a ajouter toutes les extensions. donc cette methode doit toujours
+ * retourne vrai :(
+ *
+ * @param <E>
+ * @param clazz
+ * @param wikittyId
+ * @return
+ */
public <E extends BusinessEntity> boolean hasType(Class<E> clazz, String wikittyId) {
try {
long start = TimeLog.getTime();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -741,7 +741,7 @@
if (!BusinessEntityImpl.class
.isAssignableFrom(clazzInstanciable)) {
throw new WikittyException(String.format(
- "Your class '%s' don't extends WikittyDto", clazz
+ "Your class '%s' don't extends BusinessEntityImpl", clazz
.getName()));
}
@@ -755,6 +755,49 @@
}
/**
+ * Create new Business Entity with specified Wikitty
+ * @param target Business Entity class
+ * @param w wikitty to used
+ * @return
+ */
+ static public <E extends BusinessEntity> E newInstance(Class<E> target, Wikitty w) {
+ E result = newInstance(target);
+ BusinessEntityImpl bean = (BusinessEntityImpl) result;
+ bean.setWikitty(w);
+
+ return result;
+ }
+
+ /**
+ * Cast Business object to another Business Object
+ * If source don't have target extension, this extension is added
+ *
+ * @param source business entity source
+ * @param target business entity class wanted
+ * @return new instance of object wanted
+ */
+ public <E extends BusinessEntity> E newInstance(Class<E> target, BusinessEntityImpl source) {
+ E result = newInstance(target, source.getWikitty());
+ return result;
+ }
+
+
+ /**
+ * Create new Business Entity List from wikitties
+ * @param target Business Entity class
+ * @param wikitties list of wikitties
+ * @return new list of Business Entity
+ */
+ static public <E extends BusinessEntity> List<E> newInstance(Class<E> target, List<Wikitty> wikitties) {
+ List<E> result = new ArrayList<E>(wikitties.size());
+ for (Wikitty w : wikitties) {
+ result.add(newInstance(target, w));
+ }
+ return result;
+ }
+
+
+ /**
* Create new instance of BusinessEntity from Wikitty object passed in argument.
* If argument is Interface try to add 'Impl' to find instanciable class.
* <p>
@@ -766,7 +809,12 @@
* @param clazz class of the new instance
* @param w wikitty object to use internaly for in new instance
* @return new instance
+ *
+ * @deprecated since 3.3 il n'est pas coherent d'acceder au serveur lorsqu'on
+ * instancie un objet. La verification de la securite de toute facon ne
+ * se fait qu'au moment de la sauvegarde.
*/
+ @Deprecated
static public <E extends BusinessEntity> E newInstance(String securityToken,
WikittyService wikittyService, Class<E> clazz, Wikitty w) {
try {
@@ -786,7 +834,7 @@
if (!BusinessEntityImpl.class
.isAssignableFrom(clazzInstanciable)) {
throw new WikittyException(String.format(
- "Your class '%s' don't extends WikittyDto", clazz
+ "Your class '%s' don't extends BusinessEntityImpl", clazz
.getName()));
}
@@ -800,6 +848,9 @@
result = (E) cons.newInstance(parms);
BusinessEntityImpl bean = (BusinessEntityImpl) result;
+ // FIXME poussin 20111229 on ne devrait pas avoir besoin
+ // d'acceder au serveur ici :(. Voir si le check est vraiment
+ // util
checkExtensionVersion(securityToken, wikittyService, w, bean);
bean.setWikitty(w);
@@ -1106,6 +1157,15 @@
return result;
}
+ /**
+ *
+ * @param service
+ * @param securityToken
+ * @param entity
+ * @return
+ * @deprecated since 3.3 use {@link WikittyClient#getWikitty(org.nuiton.wikitty.entities.BusinessEntity)}
+ */
+ @Deprecated
static public Wikitty getWikitty(WikittyService service,
String securityToken,
BusinessEntity entity) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -30,7 +30,10 @@
import java.util.Collection;
/**
- * Used as parent interface to all Business class
+ * Used as parent interface to all Business class.
+ *
+ * getWikitty and setWikitty is not in interface because this objet for some
+ * implementation (GWT) is to complexe
*
* @author poussin
* @version $Revision$
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -46,6 +46,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ObjectUtil;
+import org.nuiton.util.VersionUtil;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.generator.WikittyTransformerUtil;
@@ -289,6 +290,19 @@
*/
@Override
public void addExtension(WikittyExtension ext) {
+ // on check qu'on avait pas deja cette extension dans une version plus
+ // recente, dans ce cas, on leve une exception en disant qu'il faut
+ // se mettre a jour
+ WikittyExtension currentExt = extensions.get(ext.getName());
+ if (currentExt != null &&
+ VersionUtil.greaterThan(currentExt.getVersion(), ext.getVersion())) {
+ throw new WikittyException(String.format(
+ "You try to put extension '%s' in older version (%s) than"
+ + " current version (%s). You must update your software.",
+ ext.getName(), ext.getVersion(), currentExt.getVersion()));
+ }
+
+ // on check les dependances
List required = ext.getRequires();
if (required != null && !required.isEmpty() &&
!extensions.keySet().containsAll(required)) {
@@ -297,6 +311,7 @@
" required not available extension '%s' in this wikitty",
ext.getName(), required));
}
+
extensions.put(ext.name, ext);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -11,6 +11,10 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.BusinessEntity;
+import org.nuiton.wikitty.entities.BusinessEntityImpl;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.query.conditions.And;
import org.nuiton.wikitty.query.conditions.Between;
import org.nuiton.wikitty.query.conditions.Condition;
@@ -193,6 +197,49 @@
}
/**
+ * Ajoute une contrainte qui cree les conditions en prenant comme exemple
+ * l'objet passer en parametre. Seuls les champs non null sont utilises ainsi
+ * que la liste des extensions de l'objet
+ *
+ * @param w le wikitty a prendre comme exemple
+ * @return {@code this} with the {@code w} restriction added.
+ */
+ public WikittyQueryMaker wikitty(Wikitty w) {
+ WikittyQueryMaker result = new WikittyQueryMaker().and();
+
+ // result object must have same extension that wikitty example
+ result.extContainsAll(w.getExtensionNames());
+
+ for (String fqfieldName : w.fieldNames()) {
+ Object value = w.getFqField(fqfieldName);
+ if (value != null) {
+ FieldType type = w.getFieldType(fqfieldName);
+ if (type.isCollection()) {
+ result.containsAll(fqfieldName, (Collection<?>)value);
+ } else {
+ result.eq(fqfieldName, value);
+ }
+ }
+ }
+ addCondition(result.getCondition());
+
+ return this;
+ }
+
+ /**
+ * Ajoute une contrainte qui cree les conditions en prenant comme exemple
+ * l'objet passer en parametre. Seuls les champs non null sont utilises ainsi
+ * que la liste des extensions de l'objet
+ *
+ * @param e l'objet a prendre comme exemple
+ * @return {@code this} with the {@code e} restriction added.
+ */
+ public WikittyQueryMaker wikitty(BusinessEntityImpl e) {
+ Wikitty w = e.getWikitty();
+ return wikitty(w);
+ }
+
+ /**
* Contains.
*
* Search on lists (multivalued fields) that a field contains all the values
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 2011-12-29 14:29:52 UTC (rev 1265)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2011-12-29 19:04:15 UTC (rev 1266)
@@ -1,7 +1,6 @@
package org.nuiton.wikitty.query;
import java.io.Serializable;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -10,16 +9,12 @@
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.wikitty.WikittyException;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.WikittyService;
-import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.entities.BusinessEntityImpl;
-import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.WikittyClient;
/**
- * Represente un resultat de requete {@link WikittyQuery}
+ * Represente un resultat de requete {@link WikittyQuery}. Pour caster les
+ * valeurs dans une autre representation vous pouvez utiliser la methode
+ * {@link WikittyClient#cast(org.nuiton.wikitty.query.WikittyQueryResult, java.lang.Class)}
*
* @author poussin
* @version $Revision$
@@ -76,122 +71,6 @@
this.results = Collections.unmodifiableList(results);
}
- /**
- * Call {@link #cast(WikittyProxy, Class, boolean)} with
- * autoconvert = true
- *
- * @param proxy used to retrieve securityToken and WikittyService
- * @param clazz target PagedResult type
- * @return new PagedResult, this result can have less elements that original
- * for some reason (security, ...)
- */
- public <E extends BusinessEntityImpl> WikittyQueryResult<E> cast(
- WikittyProxy proxy, Class<E> clazz) {
- return cast(proxy, clazz, true);
- }
-
- /**
- * Convert all result to the wikitty type and return new PagedResult with
- * this new result list.
- *
- * @param securityToken security token
- * @param ws wikitty service
- *
- * @return new PagedResult, this result can have less elements that original
- * for some reason (security, ...)
- */
- public WikittyQueryResult<Wikitty> WikittyQueryResult(String securityToken, WikittyService ws) {
- List<Wikitty> castedResult;
-
- if (results.size() == 0) {
- castedResult = new ArrayList<Wikitty>();
- } else {
- if (results.get(0) instanceof String) {
- // le pagedresult courant contient des Ids
- // Si ce n'est pas le cas, ca veut dire que le developpeur utilisant
- // ce PagedResult ne sait pas ce qu'il fait :)
- List<String> ids = (List<String>) results;
- castedResult = ws.restore(securityToken, ids);
- } else {
- throw new ClassCastException("WikittyQueryResult don't contains" +
- " wikitty String id but " + results.get(0).getClass());
- }
- }
- WikittyQueryResult<Wikitty> result = new WikittyQueryResult<Wikitty>(queryName,
- first, totalResult, queryString, facets, castedResult);
- return result;
- }
-
- /**
- * Convert all result to the wanted type and return new PagedResult with
- * this new result list. If some result don't have the right extension (clazz)
- * this extension is automatically added if autoconvert is true. Else
- * an exception is thrown when result without extension is found.
- *
- * When you used autoconvert = false, you have a potentially problem when
- * you have modified a BusinessEntity to have new extension and all your
- * wikitty object are not uptodate in database.
- *
- * @param <E> class to cast into
- * @param proxy used to retrieve securityToken and WikittyService
- * @param autoconvert if autoconvert is false and object don't all needed
- * extension, object is not put in the result
- * @return new PagedResult, this result can have less elements that original
- * for some reason (security, ...)
- */
- public <E extends BusinessEntityImpl> WikittyQueryResult<E> cast(
- WikittyProxy proxy, Class<E> clazz, boolean autoconvert) {
- List<E> castedResult;
-
- if (results.size() > 0 && results.get(0) instanceof String) {
- // le pagedresult courant contient des Ids
- // Si ce n'est pas le cas, ca veut dire que le developpeur utilisant
- // ce PagedResult ne sait pas ce qu'il fait :)
- List<String> ids = (List<String>)results;
- castedResult = proxy.restore(clazz, ids, !autoconvert);
- } else {
- castedResult = new ArrayList<E>(results.size());
- E sample = WikittyUtil.newInstance(clazz);
- Collection<WikittyExtension> wantedExtension = sample.getStaticExtensions();
- for (T t : results) {
- if (t == null) {
- castedResult.add(null);
- } else {
- Wikitty w = null;
- if (t instanceof Wikitty) {
- w = (Wikitty) t;
- } else if (t instanceof BusinessEntityImpl) {
- w = ((BusinessEntityImpl) t).getWikitty();
- } else {
- throw new WikittyException(String.format(
- "Illegal object result class '%s' can't convert it to class '%s'",
- t.getClass().getName(), clazz.getName()));
- }
-
- Collection<WikittyExtension> wikittyExtension = w.getExtensions();
- if (autoconvert || wikittyExtension.containsAll(wantedExtension)) {
- E e = WikittyUtil.newInstance(proxy.getSecurityToken(),
- proxy.getWikittyService(), clazz, (Wikitty) t);
- castedResult.add(e);
- } else {
- // silently pass current object, this object is not put
- // in result
- if (log.isDebugEnabled()) {
- log.debug(String.format(
- "Illegal object result class '%s' can't convert it to '%s'" +
- "there is no same extension %s != %s",
- t.getClass().getName(), clazz.getName(),
- wikittyExtension, wantedExtension));
- }
- }
- }
- }
- }
- WikittyQueryResult<E> result = new WikittyQueryResult<E>(queryName,
- first, totalResult, queryString, facets, castedResult);
- return result;
- }
-
public String getQueryName() {
return queryName;
}
1
0
Author: bpoussin
Date: 2011-12-29 15:29:52 +0100 (Thu, 29 Dec 2011)
New Revision: 1265
Url: http://nuiton.org/repositories/revision/wikitty/1265
Log:
retrait de wikitty publication du build global
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-12-29 14:27:18 UTC (rev 1264)
+++ trunk/pom.xml 2011-12-29 14:29:52 UTC (rev 1265)
@@ -24,9 +24,14 @@
<module>wikitty-dto</module>
<module>wikitty-solr</module>
<module>wikitty-jdbc</module>
+<!--
+ Suppression des modules du build, en attendant une reecriture des storages
+ et de l'utilisation du container Jetty dont l'api a change dans les denieres
+ version (depuis mavenpom4redmine 3.0.7)
<module>wikitty-publication</module>
<module>wp-maven-plugin</module>
<module>wikitty-publication-ui</module>
+-->
<module>wikitty-struts</module>
<module>wikitty-hessian-client</module>
<module>wikitty-hessian-server</module>
1
0
r1264 - in trunk: wikitty-publication/src/main/resources wikitty-publication-ui/src/main/resources
by bpoussin@users.nuiton.org 29 Dec '11
by bpoussin@users.nuiton.org 29 Dec '11
29 Dec '11
Author: bpoussin
Date: 2011-12-29 15:27:18 +0100 (Thu, 29 Dec 2011)
New Revision: 1264
Url: http://nuiton.org/repositories/revision/wikitty/1264
Log:
commit de wikitty publication avant de le retirer du build global. Car il faut le repenser/reecrire.
Il n'utilise pas la reecriture de Storage et Indexer mais directement le WikittyService.
Du coup on ne peut pas profiter du travail fait sur le InMemory (il faudrait faire un heritage et surcharge)
Ce dernier commit contient les essaies (pas propre du tout) fait pour rendre generic les actions struts2
(fichier de mapping unique pour toutes les applications wikittyPublication)
Modified:
trunk/wikitty-publication-ui/src/main/resources/log4j.properties
trunk/wikitty-publication-ui/src/main/resources/struts.xml
trunk/wikitty-publication/src/main/resources/mimetype.properties
Modified: trunk/wikitty-publication/src/main/resources/mimetype.properties
===================================================================
--- trunk/wikitty-publication/src/main/resources/mimetype.properties 2011-12-29 14:22:36 UTC (rev 1263)
+++ trunk/wikitty-publication/src/main/resources/mimetype.properties 2011-12-29 14:27:18 UTC (rev 1264)
@@ -39,5 +39,7 @@
image/jpeg=jpg
image/png=png
text/java=java
+text/java.action=javaa
+text/jsp=jsp
application/jar=jar
application/uml.jar=zargo
Modified: trunk/wikitty-publication-ui/src/main/resources/log4j.properties
===================================================================
--- trunk/wikitty-publication-ui/src/main/resources/log4j.properties 2011-12-29 14:22:36 UTC (rev 1263)
+++ trunk/wikitty-publication-ui/src/main/resources/log4j.properties 2011-12-29 14:27:18 UTC (rev 1264)
@@ -23,7 +23,7 @@
# #L%
###
# Global logging configuration
-log4j.rootLogger=FATAL, stdout
+log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
@@ -31,6 +31,6 @@
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
# package level
-log4j.logger.org.nuiton.wikitty.publication=DEBUG
+##log4j.logger.org.nuiton.wikitty.publication=DEBUG
#log4j.logger.org.nuiton.util.TimeLog=WARN
log4j.logger.org.apache.struts2.dispatcher.mapper=DEBUG
Modified: trunk/wikitty-publication-ui/src/main/resources/struts.xml
===================================================================
--- trunk/wikitty-publication-ui/src/main/resources/struts.xml 2011-12-29 14:22:36 UTC (rev 1263)
+++ trunk/wikitty-publication-ui/src/main/resources/struts.xml 2011-12-29 14:27:18 UTC (rev 1264)
@@ -134,6 +134,16 @@
class="org.nuiton.wikitty.publication.ui.action.PublicationActionEval">
<param name="contextData">{1}</param>
<param name="args">{2}</param>
+ <!--
+ | si le type mime est text/java.action alors on passe ici
+ | l'action doit avoir place le getAction() a la valeur de la
+ | nouvelle action qui vient d'etre compilee
+ +-->
+ <result name="action" type="chain">
+ <param name="actionName">${action}</param>
+ <param name="namespace">/action</param>
+ </result>
+ <!-- sinon on passe par le retour normal direct -->
<result type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
@@ -164,6 +174,16 @@
<param name="contextData">{1}</param>
<param name="contextApps">{2}</param>
<param name="args">{3}</param>
+ <!--
+ | si le type mime est text/java.action alors on passe ici
+ | l'action doit avoir place le getAction() a la valeur de la
+ | nouvelle action qui vient d'etre compilee
+ +-->
+ <result name="action" type="chain">
+ <param name="actionName">${nextAction}</param>
+ <param name="namespace">/action</param>
+ </result>
+ <!-- sinon on passe par le retour normal direct -->
<result type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
@@ -181,4 +201,17 @@
</action>
</package>
+ <package name="action" namespace="/action" extends="publicArea">
+ <result-types>
+ <result-type name="WPResult" default="true"
+ class="org.nuiton.wikitty.publication.ui.WikittyPublicationResult" />
+ </result-types>
+ <action name="*"
+ class="{1}">
+ <result name="input">${pageInput}</result>
+ <result name="error">${pageError}</result>
+ <result name="success">${pageSuccess}</result>
+ </action>
+ </package>
+
</struts>
1
0
29 Dec '11
Author: bpoussin
Date: 2011-12-29 15:22:36 +0100 (Thu, 29 Dec 2011)
New Revision: 1263
Url: http://nuiton.org/repositories/revision/wikitty/1263
Log:
commit de wikitty publication avant de le retirer du build global. Car il faut le repenser/reecrire.
Il n'utilise pas la reecriture de Storage et Indexer mais directement le WikittyService.
Du coup on ne peut pas profiter du travail fait sur le InMemory (il faudrait faire un heritage et surcharge)
Ce dernier commit contient les essaies (pas propre du tout) fait pour rendre generic les actions struts2
(fichier de mapping unique pour toutes les applications wikittyPublication)
Added:
trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java
trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java
Modified:
trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java
trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java
Copied: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java (from rev 1227, trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java)
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java (rev 0)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -0,0 +1,50 @@
+/*
+ * #%L
+ * Wikitty :: publication
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 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.publication;
+
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper;
+
+
+/**
+ * This class is used to decorate wikitty pub text content with mime type
+ * text/java.action
+ *
+ * This content is java class code without need to add some other code
+ *
+ *
+ * @author mfortun
+ *
+ */
+public class ActionCodeDecorator extends CodeDecorator {
+
+ @Override
+ public String getCode(Wikitty wikitty) {
+ String result = WikittyPubTextHelper.getContent(wikitty);
+ return result;
+ }
+
+
+}
Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-12-29 12:06:50 UTC (rev 1262)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -273,7 +273,7 @@
/**
* Use to transform wikittyPubText.content into compilable Java
- *
+ *
* @param wikitty
* the wikitty pub text
* @return the java code
Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-12-29 12:06:50 UTC (rev 1262)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -52,6 +52,7 @@
static private Log log = LogFactory.getLog(MimeTypePubHelper.class);
+ public static final String ACTION_TYPE = "text/java.action";
public static final String JAVA_TYPE = "text/java";
public static final String JAR_TYPE = "application/jar";
/**
Added: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java
===================================================================
--- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java (rev 0)
+++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -0,0 +1,50 @@
+package org.nuiton.wikitty.publication.ui;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import java.io.File;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.dispatcher.ServletDispatcherResult;
+import org.nuiton.util.FileUtil;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyPublicationResult extends ServletDispatcherResult {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyPublicationResult.class);
+ private static final long serialVersionUID = 1L;
+
+ private static final String JSP_DIR = "/WEB-INF/dynamic-jsp/";
+
+ @Override
+ public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
+ // FIXME poussin 20110907 ecrire la jsp sur le disque au bonne endroit
+ // modifier finalLocation en fonction de cet endroit
+ HttpServletRequest request = ServletActionContext.getRequest();
+ String path = request.getSession().getServletContext().getRealPath(JSP_DIR);
+ File jspdir = new File(path);
+ jspdir.mkdirs();
+ File jsp = new File(jspdir, finalLocation + ".jsp");
+
+ String content = "<%@taglib prefix='s' uri='/struts-tags'%><html><body>Hello<form><s:textfield label='First' key='first' name='first' /></form></body></html>";
+
+ FileUtil.writeString(jsp, content);
+
+ log.fatal(String.format("jsp file %s writed ", jsp));
+
+ finalLocation = JSP_DIR + finalLocation + ".jsp";
+
+ super.doExecute(finalLocation, invocation);
+ }
+
+
+}
Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java
===================================================================
--- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-12-29 12:06:50 UTC (rev 1262)
+++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -75,6 +75,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import org.nuiton.wikitty.publication.ActionCodeDecorator;
/**
* Java class
@@ -86,6 +87,8 @@
ServletResponseAware, ServletRequestAware, PublicationContext,
EvalInterface {
+ public static final String RESULT_ACTION = "action";
+
/**
*
*/
@@ -103,6 +106,8 @@
protected InputStream inputStream;
protected WikittyPublicationClassLoader classloader;
protected List<File> classPathSup;
+ /** nom de l'action utilisateur a executer */
+ protected String nextAction;
@Override
public void setServletResponse(HttpServletResponse arg0) {
@@ -115,8 +120,18 @@
}
+ public String getNextAction() {
+ return nextAction;
+ }
+
+ public void setNextAction(String nextAction) {
+ this.nextAction = nextAction;
+ }
+
@Override
public String execute() throws Exception {
+ String result = SUCCESS;
+
// extract jars from wikitty service
URL[] urls = getJarsDependency();
@@ -130,12 +145,17 @@
// change class loader for action
Thread.currentThread().setContextClassLoader(classloader);
- doAction(this, getMandatoryArguments());
+ Object resultObject = doAction(this, getMandatoryArguments());
+ if (RESULT_ACTION.equals(resultObject)) {
+ result = RESULT_ACTION;
+ }
+
// restore class loader
- Thread.currentThread().setContextClassLoader(oldClassLoader);
+// Thread.currentThread().setContextClassLoader(oldClassLoader);
- return SUCCESS;
+ log.fatal("Result eval is " + result);
+ return result;
}
/**
@@ -271,6 +291,24 @@
context.setContentType("text/plain");
result = String.format("no data found for criteria '%s'",
criteria);
+ } else if (WikittyPubTextHelper.getMimeType(w).equals(
+ MimeTypePubHelper.ACTION_TYPE)) {
+
+ decorator = new ActionCodeDecorator();
+ String name = WikittyPubTextHelper.getName(w);
+ byte[] content;
+ try {
+ content = compile(decorator, classPathSup, w);
+ classloader.addClass(name, content);
+ setNextAction(name);
+ result = RESULT_ACTION;
+ log.fatal(String.format("%s added in cl", name));
+ } catch (IOException eee) {
+ log.debug("Error when processing the wikitty content");
+ // TODO Mfortun-2011-07-28 really handle exception
+ eee.printStackTrace();
+ result = getError(context);
+ }
} else if (w
.hasExtension(WikittyPubTextCompiled.EXT_WIKITTYPUBTEXTCOMPILED)
|| WikittyPubTextHelper.getMimeType(w).equals(
@@ -339,6 +377,74 @@
}
/**
+ * Compile wikitty.content if needed and add it in
+ * WikittyPubTextCompiled.byteCode in wikitty
+ *
+ * @param w
+ * @return
+ */
+ protected byte[] compile(List<File> classPathSup, String name, String javaContent) throws IOException {
+ if (!FileUtils.getTempDirectory().exists()) {
+ FileUtils.getTempDirectory().mkdir();
+ }
+
+ File javaWikittyDir = new File(FileUtils.getTempDirectory()
+ .getAbsolutePath() + File.separator + JAVA_TEMP_DIR_NAME);
+ if (!javaWikittyDir.exists()) {
+ javaWikittyDir.mkdir();
+ }
+
+ // compile
+ File javaFile = new File(javaWikittyDir.getAbsolutePath()
+ + File.separator + name + ".java");
+ File classFile = new File(javaWikittyDir.getAbsolutePath()
+ + File.separator + name + ".class");
+
+ String content = null;
+ if (javaFile.exists()) {
+ content = FileUtil.readAsString(javaFile);
+ }
+ // compile only if the content has change if java already on the
+ // FS
+ if (content == null
+ || !classFile.exists()
+ || !StringUtil.encodeMD5(javaContent).equals(
+ StringUtil.encodeMD5(content))
+ ) {
+ javaFile.createNewFile();
+ FileUtil.writeString(javaFile, javaContent);
+
+ PrintWriter writer = new PrintWriter(System.out);
+ // compile
+ CompileHelper.compile(classPathSup, javaWikittyDir,
+ javaFile, javaWikittyDir, writer);
+ }
+
+ byte[] wikittyByte = FileUtil.fileToByte(classFile);
+ return wikittyByte;
+ }
+
+ /**
+ * Compile wikitty.content if needed and add it in
+ * WikittyPubTextCompiled.byteCode in wikitty
+ *
+ * @param w
+ * @return
+ */
+ protected byte[] compile(CodeDecorator decorator, List<File> classPathSup, Wikitty w) throws IOException {
+ String name = WikittyPubTextHelper.getName(w);
+ // the java and the class are store insiede tmp directory
+ // add extension and attribut
+
+ String content = decorator.getCode(w);
+ byte[] wikittyByte = compile(classPathSup, name, content);
+
+ w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled);
+ WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte);
+ return wikittyByte;
+ }
+
+ /**
* Method to evaluate java kind of wikittyPubText
*
* @param context
@@ -361,56 +467,11 @@
// if wikitty pub text with java, need to transform it as
// wikitty pub text compiled with java class bytecode
if (WikittyPubTextHelper.getMimeType(w).equals(
- MimeTypePubHelper.JAVA_TYPE)) {
-
- String name = WikittyPubTextHelper.getName(w);
- // the java and the class are store insiede tmp directory
- if (!FileUtils.getTempDirectory().exists()) {
- FileUtils.getTempDirectory().mkdir();
- }
-
- File javaWikittyFile = new File(FileUtils.getTempDirectory()
- .getAbsolutePath() + File.separator + JAVA_TEMP_DIR_NAME);
- if (!javaWikittyFile.exists()) {
- javaWikittyFile.mkdir();
- }
-
- // encapsulate java inside a class
- String javaContent = decorator.getCode(w);
-
- String content = null;
+ MimeTypePubHelper.JAVA_TYPE) ||
+ WikittyPubTextHelper.getMimeType(w).equals(
+ MimeTypePubHelper.ACTION_TYPE)) {
try {
- // compile
- File javaFile = new File(javaWikittyFile.getAbsolutePath()
- + File.separator + name + ".java");
- File clazzFile = new File(javaWikittyFile.getAbsolutePath()
- + File.separator + name + ".class");
-
- if (javaFile.exists()) {
- content = FileUtil.readAsString(javaFile);
- }
- // compile only if the content has change if java already on the
- // FS
- if (content == null
- || !StringUtil.encodeMD5(javaContent).equals(
- StringUtil.encodeMD5(content))
- || !clazzFile.exists()) {
- javaFile.createNewFile();
- FileUtil.writeString(javaFile, javaContent);
-
- PrintWriter writer = new PrintWriter(System.out);
- // compile
- CompileHelper.compile(classPathSup, javaWikittyFile,
- javaFile, javaWikittyFile, writer);
- }
-
- File classFile = new File(javaWikittyFile.getAbsolutePath()
- + File.separator + name + ".class");
-
- byte[] wikittyByte = FileUtil.fileToByte(classFile);
- // add extension and attribut
- w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled);
- WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte);
+ compile(decorator, classPathSup, w);
} catch (Exception e) {
// TODO mfortun-2011-08-16 really handle exception
if (log.isErrorEnabled()) {
Added: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java
===================================================================
--- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java (rev 0)
+++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java 2011-12-29 14:22:36 UTC (rev 1263)
@@ -0,0 +1,18 @@
+package org.nuiton.wikitty.publication.ui.interceptor;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class EvalInterceptor {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(EvalInterceptor.class);
+}
Modified: trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml
===================================================================
--- trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml 2011-12-29 12:06:50 UTC (rev 1262)
+++ trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml 2011-12-29 14:22:36 UTC (rev 1263)
@@ -31,7 +31,9 @@
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
<pattern>/nodecorate/*</pattern>
+ <pattern>/fragment/*</pattern>
<pattern>*/eval/*</pattern>
+ <pattern>/action/*</pattern>
</excludes>
1
0
r1262 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 29 Dec '11
by bpoussin@users.nuiton.org 29 Dec '11
29 Dec '11
Author: bpoussin
Date: 2011-12-29 13:06:50 +0100 (Thu, 29 Dec 2011)
New Revision: 1262
Url: http://nuiton.org/repositories/revision/wikitty/1262
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
Debut d'implantation dans le module Solr ('plus que' le visiteur a implanter)
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetQuery.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetQuery.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetQuery.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -0,0 +1,38 @@
+package org.nuiton.wikitty.query;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.query.conditions.Condition;
+
+/**
+ * Contient une Condition pour creer une facet dans un {@link WikittyQuery}
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class FacetQuery {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(FacetQuery.class);
+
+ protected String name;
+ protected Condition condition;
+
+ public FacetQuery(String name, Condition condition) {
+ this.name = name;
+ this.condition = condition;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Condition getCondition() {
+ return condition;
+ }
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-28 18:55:40 UTC (rev 1261)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -64,7 +64,7 @@
protected int facetLimit = 100;
/** Facet on condition. */
- protected List<Condition> facetCriteria;
+ protected List<FacetQuery> facetQuery;
/** Facet on field. */
protected List<String> facetField;
/** if true facet is done on extension name */
@@ -115,7 +115,7 @@
ObjectUtils.equals(this.getSortDescending(), other.getSortDescending()) &&
ObjectUtils.equals(this.getFacetLimit(), other.getFacetLimit()) &&
ObjectUtils.equals(this.getFacetMinCount(), other.getFacetMinCount()) &&
- ObjectUtils.equals(this.getFacetCriteria(), other.getFacetCriteria()) &&
+ ObjectUtils.equals(this.getFacetQuery(), other.getFacetQuery()) &&
ObjectUtils.equals(this.getCondition(), other.getCondition());
} else {
result = false;
@@ -210,23 +210,28 @@
return this;
}
- public List<Condition> getFacetCriteria() {
- if (facetCriteria == null) {
- facetCriteria = new LinkedList<Condition>();
+ public List<FacetQuery> getFacetQuery() {
+ if (facetQuery == null) {
+ facetQuery = new LinkedList<FacetQuery>();
}
- return facetCriteria;
+ return facetQuery;
}
- public WikittyQuery addFacetCriteria(Condition criteria) {
- getFacetCriteria().add(criteria);
+ public WikittyQuery addFacetQuery(FacetQuery facetQuery) {
+ getFacetQuery().add(facetQuery);
return this;
}
- public WikittyQuery setFacetCriteria(Condition ... facetCriteria) {
- this.facetCriteria = new LinkedList<Condition>(Arrays.asList(facetCriteria));
+ public WikittyQuery addFacetQuery(String name, Condition condition) {
+ getFacetQuery().add(new FacetQuery(name, condition));
return this;
}
+ public WikittyQuery setFacetQuery(FacetQuery ... facetQuery) {
+ this.facetQuery = new LinkedList<FacetQuery>(Arrays.asList(facetQuery));
+ return this;
+ }
+
public List<String> getFacetField() {
if (facetField == null) {
facetField = new LinkedList<String>();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-28 18:55:40 UTC (rev 1261)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -181,6 +181,18 @@
}
/**
+ * Ajoute une condition, cette condition est prise comme une condition terminal
+ * Si l'on veut continuer a construire la requete, il faut avoir ajouter
+ * avant une {@link #and()}, {@link #or()}, {@link #not()}, {@link #join()}
+ * @param c la condition a ajouter
+ * @return {@code this} with the {@code c} restriction added.
+ */
+ public WikittyQueryMaker condition(Condition c) {
+ addCondition(c);
+ return this;
+ }
+
+ /**
* Contains.
*
* Search on lists (multivalued fields) that a field contains all the values
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-28 18:55:40 UTC (rev 1261)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -55,6 +55,11 @@
return result;
}
+ public Condition getCondition() {
+ Condition result = getQueryMaker().getCondition();
+ return result;
+ }
+
@Override
public boolean visitEnter(WikittyQuery o) {
WikittyQuery q = getQuery();
@@ -68,11 +73,11 @@
q.setSortAscending(new ArrayList<String>(o.getSortAscending()));
q.setSortDescending(new ArrayList<String>(o.getSortDescending()));
- for (Condition c : o.getFacetCriteria()) {
+ for (FacetQuery c : o.getFacetQuery()) {
WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy();
- c.accept(v);
- Condition facetCriteria = v.getQueryMaker().getCondition();
- q.addFacetCriteria(facetCriteria);
+ c.getCondition().accept(v);
+ Condition condition = v.getCondition();
+ q.addFacetQuery(c.getName(), condition);
}
return true;
}
Added: 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 (rev 0)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -0,0 +1,222 @@
+package org.nuiton.wikitty.storage.solr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.solr.client.solrj.SolrServer;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryVisitor;
+import org.nuiton.wikitty.query.conditions.And;
+import org.nuiton.wikitty.query.conditions.Between;
+import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ContainsAll;
+import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.Equals;
+import org.nuiton.wikitty.query.conditions.False;
+import org.nuiton.wikitty.query.conditions.Greater;
+import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
+import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.Keyword;
+import org.nuiton.wikitty.query.conditions.Less;
+import org.nuiton.wikitty.query.conditions.LessOrEquals;
+import org.nuiton.wikitty.query.conditions.Like;
+import org.nuiton.wikitty.query.conditions.Not;
+import org.nuiton.wikitty.query.conditions.NotEquals;
+import org.nuiton.wikitty.query.conditions.NotNull;
+import org.nuiton.wikitty.query.conditions.Null;
+import org.nuiton.wikitty.query.conditions.Or;
+import org.nuiton.wikitty.query.conditions.True;
+import org.nuiton.wikitty.query.conditions.Unlike;
+
+/**
+ * Converti une {@link Condition} en une requete Solr, une fois la condition
+ * converti on peut la recuperer par {@link #getSolrQuery()}.
+ *
+ * Cette objet ne peut etre utiliser qu'un seul fois, il faut creer un nouveau
+ * visiteur pour chaque convertion.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+class WikittyQueryVisitorToSolr extends WikittyQueryVisitor {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryVisitorToSolr.class);
+
+ protected SolrServer solrServer;
+ protected FieldModifier fieldModifier;
+
+ protected String solrQuery = "";
+
+ public String getSolrQuery() {
+ return solrQuery;
+ }
+
+ public WikittyQueryVisitorToSolr(SolrServer solrServer, FieldModifier fieldModifier) {
+ this.solrServer = solrServer;
+ this.fieldModifier = fieldModifier;
+ }
+
+ @Override
+ public boolean visitEnter(WikittyQuery o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visitLeave(WikittyQuery o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitEnter(And o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitMiddle(And o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visitLeave(And o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitEnter(Or o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitMiddle(Or o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visitLeave(Or o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitEnter(Join o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visitLeave(Join o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean visitEnter(Not o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visitLeave(Not o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Between o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(ContainsAll o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(ContainsOne o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Equals o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(NotEquals o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(False o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(True o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Greater o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(GreaterOrEquals o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Keyword o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Less o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(LessOrEquals o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Like o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Unlike o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(Null o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void visit(NotNull o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void defaultVisit(Object o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean defaultVisitEnter(Object o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean defaultVisitMiddle(Object o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void defaultVisitLeave(Object o, boolean enterOrMiddleResult) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-28 18:55:40 UTC (rev 1261)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-29 12:06:50 UTC (rev 1262)
@@ -49,7 +49,6 @@
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.CoreContainer;
import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.FacetTopic;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.FieldType.TYPE;
import org.nuiton.wikitty.search.PagedResult;
@@ -67,6 +66,12 @@
import org.nuiton.wikitty.WikittyConfigOption;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
+import org.nuiton.wikitty.query.FacetQuery;
+import org.nuiton.wikitty.query.FacetTopic;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -643,94 +648,93 @@
}
@Override
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
+ public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
try {
- // Create query with restriction
- Restriction2Solr restriction2Solr = new Restriction2Solr(transaction, fieldModifier);
- String queryString = restriction2Solr.toSolr(criteria.getRestriction(), solrServer);
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+ // Create querySolr
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ query.getCondition().accept(v);
+ String queryString = v.getSolrQuery();
+ SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
// Add paged
- int firstIndex = criteria.getFirstIndex();
- int endIndex = criteria.getEndIndex();
+ int first = query.getFirst();
+ int limit = query.getLimit();
- query.setStart(firstIndex);
- int nbRows;
- if (endIndex == -1) {
+ if (limit == Integer.MAX_VALUE) {
// WARNING It is necessary to substract 'start' otherwise,
// there is a capacity overlow in solR
- nbRows = Integer.MAX_VALUE - firstIndex;
- } else {
- nbRows = endIndex - firstIndex + 1;
+ limit = Integer.MAX_VALUE - first;
}
- query.setRows(nbRows);
+ querySolr.setStart(first);
+ querySolr.setRows(limit);
// Add sorting
- List<String> sortAscending = criteria.getSortAscending();
+ List<String> sortAscending = query.getSortAscending();
if(sortAscending != null) {
for (String sort : sortAscending) {
String tranform = fieldModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- query.addSortField(tranform, SolrQuery.ORDER.asc);
+ querySolr.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
- List<String> sortDescending = criteria.getSortDescending();
+ List<String> sortDescending = query.getSortDescending();
if(sortDescending != null) {
for (String sort : sortDescending) {
String tranform = fieldModifier.convertToSolr(transaction, sort);
tranform += WikittySolrConstant.SUFFIX_SORTABLE;
- query.addSortField(tranform, SolrQuery.ORDER.desc);
+ querySolr.addSortField(tranform, SolrQuery.ORDER.desc);
}
}
// task : #1785 Add select method to allow specify wikittyId return field
// If select is not empty, add facet on field
- String select = criteria.getSelect();
+ String select = query.getSelect();
boolean hasSelect = StringUtils.isNotEmpty(select);
if (hasSelect) {
// Limit on wikitty
String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
- criteria.addFacetField(selectWikitty);
+ query.addFacetField(selectWikitty);
// We need no result, just facet
- criteria.setEndIndex(firstIndex);
+ query.setLimit(0);
}
// Add faceting
- List<String> facetField = criteria.getFacetField();
- List<Criteria> facetCriteria = criteria.getFacetCriteria();
+ List<String> facetField = query.getFacetField();
+ List<FacetQuery> facetQuery = query.getFacetQuery();
// use to map query string to criteria facet name
Map<String, String> facetQueryToName = new HashMap<String, String>();
if ((facetField != null && !facetField.isEmpty())
- || (facetCriteria != null && !facetCriteria.isEmpty())) {
- query.setFacet(true);
- query.setFacetMinCount(criteria.getFacetMinCount());
- query.setFacetLimit(criteria.getFacetLimit());
+ || (facetQuery != null && !facetQuery.isEmpty())) {
+ querySolr.setFacet(true);
+ querySolr.setFacetMinCount(query.getFacetMinCount());
+ querySolr.setFacetLimit(query.getFacetLimit());
// field facetisation
if (facetField != null) {
for (String fqfieldName : facetField) {
String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
- query.addFacetField(tranform);
+ querySolr.addFacetField(tranform);
}
}
// query facetisation
- if (facetCriteria != null) {
- for (Criteria facet : facetCriteria) {
- String queryFacet =
- restriction2Solr.toSolr(facet.getRestriction(), solrServer);
+ if (facetQuery != null) {
+ for (FacetQuery facet : facetQuery) {
+ v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ facet.getCondition().accept(v);
+ String queryFacet = v.getSolrQuery();
facetQueryToName.put(queryFacet, facet.getName());
- query.addFacetQuery(queryFacet);
+ querySolr.addFacetQuery(queryFacet);
}
}
}
- QueryResponse resp = SolrUtil.executeQuery(solrServer, query);
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
SolrDocumentList solrResults = resp.getResults();
Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
@@ -749,7 +753,7 @@
facets.put(facetName, topics);
}
}
- if (facetCriteria != null && !facetCriteria.isEmpty()) {
+ if (facetQuery != null && !facetQuery.isEmpty()) {
for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
String facetName = facet.getKey();
// don't use contains because, map can have key with null value
@@ -780,10 +784,8 @@
// Extract ids starting on firstIndex
ids = new ArrayList<String>();
- // If all must be return, use nbRows
- endIndex = (endIndex == -1 ? nbRows : endIndex);
- for (int i = firstIndex;i <= endIndex && i < numFound;i++) {
-
+ // If all must be return, use limit
+ for (int i = first;i <= limit && i < numFound; i++) {
FacetTopic topic = facetTopics.get(i);
ids.add(topic.getTopicName());
}
@@ -803,14 +805,14 @@
}
// Build paged result
- PagedResult<String> result = new PagedResult<String>(
- criteria.getName(),
- firstIndex, numFound, queryString, facets, ids);
+ WikittyQueryResult<String> result = new WikittyQueryResult<String>(
+ query.getName(),
+ first, numFound, queryString, facets, ids);
return result;
} catch (SolrServerException eee) {
throw new WikittyException(String.format(
- "Error during find of criteria '%s'", criteria), eee);
+ "Error during find of query '%s'", query), eee);
}
}
@@ -826,34 +828,34 @@
* @return all childrens count
*/
@Override
- public TreeNodeResult<String> findAllChildrenCount(
+ public WikittyQueryResultTreeNode<String> findAllChildrenCount(
WikittyTransaction transaction,
- String wikittyId, int depth, boolean count, Criteria filter) {
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
try {
- TreeNodeResult<String> result = null;
+ WikittyQueryResultTreeNode<String> result = null;
SolrDocument doc = SolrUtil.findById(solrServer, wikittyId);
if (doc != null) {
// on verifie que l'argument est bien un TreeNode
if (doc.containsKey(TREENODE_DEPTH)) {
- Search treeSearch = Search.query().and().eq(TREENODE_PARENTS, wikittyId);
+ WikittyQueryMaker treeSearch = new WikittyQueryMaker()
+ .and().eq(TREENODE_PARENTS, wikittyId);
if (depth >= 0) {
Integer d = SolrUtil.getIntFieldValue(doc, TREENODE_DEPTH);
- treeSearch = treeSearch.bw(TREENODE_DEPTH,
- String.valueOf(d),
- String.valueOf(d + depth));
+ treeSearch = treeSearch.bw(TREENODE_DEPTH, d, d + depth);
}
- Criteria treeCriteria = treeSearch.criteria();
+ WikittyQuery treeQuery = treeSearch.getQuery();
// on a dans treeSearch uniquement le noeud passe en parametre
// et ses enfants jusqu'a la profondeur demandee
- Restriction2Solr restriction2Solr =
- new Restriction2Solr(transaction, fieldModifier);
- String queryString = restriction2Solr.toSolr(
- treeCriteria.getRestriction(), solrServer);
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
- QueryResponse resp = SolrUtil.executeQuery(solrServer, query);
+ // Create querySolr
+ WikittyQueryVisitorToSolr v = new WikittyQueryVisitorToSolr(solrServer, fieldModifier);
+ treeQuery.getCondition().accept(v);
+ String queryString = v.getSolrQuery();
+ SolrQuery querySolr = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, querySolr);
SolrDocumentList solrResults = resp.getResults();
Map<String, Integer> counts = new HashMap<String, Integer>();
@@ -862,12 +864,17 @@
// TODO poussin 20110128 regarder si on ne peut pas
// restreindre les facettes aux noeuds trouve dans la recherche
// precedente
- Criteria attCriteria = Search.query(filter).eq(
- TREENODE_ATTACHED_ALL, wikittyId).criteria()
- .setFirstIndex(0).setEndIndex(0)
- .addFacetField(TREENODE_ATTACHED_ALL);
- PagedResult<String> attSearch =
- findAllByCriteria(transaction, attCriteria);
+ WikittyQuery attQuery = new WikittyQueryMaker()
+ .and().condition(filter.getCondition())
+ .eq(TREENODE_ATTACHED_ALL, wikittyId).end()
+ .setFirst(0).setLimit(0)
+ .addFacetField(TREENODE_ATTACHED_ALL)
+ // l'arbre peut avoir beaucoup de branche, il
+ // faut que toutes les branches aient un count
+ // des attachments
+ .setFacetLimit(Integer.MAX_VALUE);
+ WikittyQueryResult<String> attSearch =
+ findAllByQuery(transaction, attQuery);
List<FacetTopic> topics = attSearch.getTopic(TREENODE_ATTACHED_ALL);
if (topics != null) {
for (FacetTopic topic : topics) {
@@ -881,8 +888,8 @@
// construction du resultat, il proceder en 2 phases car
// sinon si on construit un fils avant son pere, il ne sera
// jamais associe
- Map<String, TreeNodeResult<String>> allTreeNodeResult =
- new HashMap<String, TreeNodeResult<String>>();
+ Map<String, WikittyQueryResultTreeNode<String>> allTreeNodeResult =
+ new HashMap<String, WikittyQueryResultTreeNode<String>>();
// key: id de l'enfant, value: l'id du parent
Map<String, String> childParent = new HashMap<String, String>();
// construction de tous les TreeNodeResult qui permettront
@@ -894,17 +901,18 @@
WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT,
TYPE.WIKITTY);
int nb = counts.containsKey(id) ? counts.get(id) : 0;
- TreeNodeResult<String> child = new TreeNodeResult<String>(id, nb);
+ WikittyQueryResultTreeNode<String> child =
+ new WikittyQueryResultTreeNode<String>(id, nb);
allTreeNodeResult.put(id, child);
childParent.put(id, parentId);
}
// construction de l'arbre avant de le retourner
- for(Map.Entry<String, TreeNodeResult<String>> e : allTreeNodeResult.entrySet()) {
+ for(Map.Entry<String, WikittyQueryResultTreeNode<String>> e : allTreeNodeResult.entrySet()) {
String id = e.getKey();
String parentId = childParent.get(id);
if (allTreeNodeResult.containsKey(parentId)) {
- TreeNodeResult<String> child = e.getValue();
- TreeNodeResult<String> parent = allTreeNodeResult.get(parentId);
+ WikittyQueryResultTreeNode<String> child = e.getValue();
+ WikittyQueryResultTreeNode<String> parent = allTreeNodeResult.get(parentId);
if (parent != child) {
parent.add(child);
}
@@ -1054,4 +1062,288 @@
solrCore.shutdown();
}
+
+
+ @Override
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
+ try {
+ // Create query with restriction
+ Restriction2Solr restriction2Solr = new Restriction2Solr(transaction, fieldModifier);
+ String queryString = restriction2Solr.toSolr(criteria.getRestriction(), solrServer);
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+
+ // Add paged
+ int firstIndex = criteria.getFirstIndex();
+ int endIndex = criteria.getEndIndex();
+
+ query.setStart(firstIndex);
+ int nbRows;
+ if (endIndex == -1) {
+ // WARNING It is necessary to substract 'start' otherwise,
+ // there is a capacity overlow in solR
+ nbRows = Integer.MAX_VALUE - firstIndex;
+ } else {
+ nbRows = endIndex - firstIndex + 1;
+ }
+ query.setRows(nbRows);
+
+ // Add sorting
+ List<String> sortAscending = criteria.getSortAscending();
+ if(sortAscending != null) {
+ for (String sort : sortAscending) {
+ String tranform = fieldModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ query.addSortField(tranform, SolrQuery.ORDER.asc);
+ }
+ }
+
+ List<String> sortDescending = criteria.getSortDescending();
+ if(sortDescending != null) {
+ for (String sort : sortDescending) {
+ String tranform = fieldModifier.convertToSolr(transaction, sort);
+ tranform += WikittySolrConstant.SUFFIX_SORTABLE;
+ query.addSortField(tranform, SolrQuery.ORDER.desc);
+ }
+ }
+
+ // task : #1785 Add select method to allow specify wikittyId return field
+ // If select is not empty, add facet on field
+ String select = criteria.getSelect();
+ boolean hasSelect = StringUtils.isNotEmpty(select);
+ if (hasSelect) {
+
+ // Limit on wikitty
+ String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY);
+ criteria.addFacetField(selectWikitty);
+
+ // We need no result, just facet
+ criteria.setEndIndex(firstIndex);
+ }
+
+ // Add faceting
+ List<String> facetField = criteria.getFacetField();
+ List<Criteria> facetCriteria = criteria.getFacetCriteria();
+
+ // use to map query string to criteria facet name
+ Map<String, String> facetQueryToName = new HashMap<String, String>();
+
+ if ((facetField != null && !facetField.isEmpty())
+ || (facetCriteria != null && !facetCriteria.isEmpty())) {
+ query.setFacet(true);
+ query.setFacetMinCount(criteria.getFacetMinCount());
+ query.setFacetLimit(criteria.getFacetLimit());
+
+ // field facetisation
+ if (facetField != null) {
+ for (String fqfieldName : facetField) {
+ String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
+ query.addFacetField(tranform);
+ }
+ }
+
+ // query facetisation
+ if (facetCriteria != null) {
+ for (Criteria facet : facetCriteria) {
+ String queryFacet =
+ restriction2Solr.toSolr(facet.getRestriction(), solrServer);
+ facetQueryToName.put(queryFacet, facet.getName());
+ query.addFacetQuery(queryFacet);
+ }
+ }
+ }
+
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, query);
+ SolrDocumentList solrResults = resp.getResults();
+
+ Map<String, List<org.nuiton.wikitty.search.FacetTopic>> facets = new HashMap<String, List<org.nuiton.wikitty.search.FacetTopic>>();
+ if (facetField != null && !facetField.isEmpty()) {
+ for (FacetField facet : resp.getFacetFields()) {
+ String facetName = fieldModifier.convertToField(transaction, facet.getName());
+ List<org.nuiton.wikitty.search.FacetTopic> topics = new ArrayList<org.nuiton.wikitty.search.FacetTopic>();
+ if (facet.getValues() != null) {
+ for (FacetField.Count value : facet.getValues()) {
+ String topicName = value.getName();
+ int topicCount = (int) value.getCount();
+ org.nuiton.wikitty.search.FacetTopic topic = new org.nuiton.wikitty.search.FacetTopic(facetName, topicName, topicCount);
+ topics.add(topic);
+ }
+ }
+ facets.put(facetName, topics);
+ }
+ }
+ if (facetCriteria != null && !facetCriteria.isEmpty()) {
+ for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
+ String facetName = facet.getKey();
+ // don't use contains because, map can have key with null value
+ if (null != facetQueryToName.get(facetName)) {
+ facetName = facetQueryToName.get(facetName);
+ }
+ Integer count = facet.getValue();
+ List<org.nuiton.wikitty.search.FacetTopic> topics = new ArrayList<org.nuiton.wikitty.search.FacetTopic>();
+ org.nuiton.wikitty.search.FacetTopic topic = new org.nuiton.wikitty.search.FacetTopic(facetName, facetName, count);
+ topics.add(topic);
+ facets.put(facetName, topics);
+ }
+ }
+
+ List<String> ids;
+ int numFound;
+ if (hasSelect) {
+
+ // Get select facet
+ List<org.nuiton.wikitty.search.FacetTopic> facetTopics = facets.get(select);
+
+ // Remove this one
+ facets.remove(select);
+
+ // Total found
+ numFound = facetTopics.size();
+
+ // Extract ids starting on firstIndex
+ ids = new ArrayList<String>();
+
+ // If all must be return, use nbRows
+ endIndex = (endIndex == -1 ? nbRows : endIndex);
+ for (int i = firstIndex;i <= endIndex && i < numFound;i++) {
+
+ org.nuiton.wikitty.search.FacetTopic topic = facetTopics.get(i);
+ ids.add(topic.getTopicName());
+ }
+
+ } else {
+
+ // Extract ids
+ ids = new ArrayList<String>(solrResults.size());
+ for (SolrDocument doc : solrResults) {
+
+ String id = SolrUtil.getStringFieldValue(doc, SOLR_ID);
+ ids.add(id);
+ }
+
+ // Get total num found
+ numFound = (int)resp.getResults().getNumFound();
+ }
+
+ // Build paged result
+ PagedResult<String> result = new PagedResult<String>(
+ criteria.getName(),
+ firstIndex, numFound, queryString, facets, ids);
+
+ return result;
+ } catch (SolrServerException eee) {
+ throw new WikittyException(String.format(
+ "Error during find of criteria '%s'", criteria), eee);
+ }
+ }
+
+ /**
+ * Si l'argument n'est pas un TreeNode, une exception est levee
+ *
+ * @param transaction wikitty transaction
+ * @param wikittyId l'objet root du resultat
+ * @param depth profondeur souhaite pour la recherche des fils
+ * @param count vrai si l'on souhaite avoir le nombre d'attachment associe
+ * au noeud retourne
+ * @param filter filtre utilise pour compter le nombre d'attachment
+ * @return all childrens count
+ */
+ @Override
+ public TreeNodeResult<String> findAllChildrenCount(
+ WikittyTransaction transaction,
+ String wikittyId, int depth, boolean count, Criteria filter) {
+ try {
+ TreeNodeResult<String> result = null;
+
+ SolrDocument doc = SolrUtil.findById(solrServer, wikittyId);
+ if (doc != null) {
+ // on verifie que l'argument est bien un TreeNode
+ if (doc.containsKey(TREENODE_DEPTH)) {
+
+ Search treeSearch = Search.query().and().eq(TREENODE_PARENTS, wikittyId);
+ if (depth >= 0) {
+ Integer d = SolrUtil.getIntFieldValue(doc, TREENODE_DEPTH);
+ treeSearch = treeSearch.bw(TREENODE_DEPTH,
+ String.valueOf(d),
+ String.valueOf(d + depth));
+ }
+ Criteria treeCriteria = treeSearch.criteria();
+
+ // on a dans treeSearch uniquement le noeud passe en parametre
+ // et ses enfants jusqu'a la profondeur demandee
+ Restriction2Solr restriction2Solr =
+ new Restriction2Solr(transaction, fieldModifier);
+ String queryString = restriction2Solr.toSolr(
+ treeCriteria.getRestriction(), solrServer);
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+ QueryResponse resp = SolrUtil.executeQuery(solrServer, query);
+ SolrDocumentList solrResults = resp.getResults();
+
+ Map<String, Integer> counts = new HashMap<String, Integer>();
+ // recuperation si demande du nombre d'attachment par noeud
+ if (count) {
+ // TODO poussin 20110128 regarder si on ne peut pas
+ // restreindre les facettes aux noeuds trouve dans la recherche
+ // precedente
+ Criteria attCriteria = Search.query(filter).eq(
+ TREENODE_ATTACHED_ALL, wikittyId).criteria()
+ .setFirstIndex(0).setEndIndex(0)
+ .addFacetField(TREENODE_ATTACHED_ALL);
+ PagedResult<String> attSearch =
+ findAllByCriteria(transaction, attCriteria);
+ List<org.nuiton.wikitty.search.FacetTopic> topics = attSearch.getTopic(TREENODE_ATTACHED_ALL);
+ if (topics != null) {
+ for (org.nuiton.wikitty.search.FacetTopic topic : topics) {
+ String topicName = topic.getTopicName();
+ int topicCount = topic.getCount();
+ counts.put(topicName, topicCount);
+ }
+ }
+ }
+
+ // construction du resultat, il proceder en 2 phases car
+ // sinon si on construit un fils avant son pere, il ne sera
+ // jamais associe
+ Map<String, TreeNodeResult<String>> allTreeNodeResult =
+ new HashMap<String, TreeNodeResult<String>>();
+ // key: id de l'enfant, value: l'id du parent
+ Map<String, String> childParent = new HashMap<String, String>();
+ // construction de tous les TreeNodeResult qui permettront
+ // de construire l'arbre
+ for (SolrDocument d : solrResults) {
+ String id = SolrUtil.getStringFieldValue(d, SOLR_ID);
+
+ String parentId = SolrUtil.getStringFieldValue(d,
+ WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT,
+ TYPE.WIKITTY);
+ int nb = counts.containsKey(id) ? counts.get(id) : 0;
+ TreeNodeResult<String> child = new TreeNodeResult<String>(id, nb);
+ allTreeNodeResult.put(id, child);
+ childParent.put(id, parentId);
+ }
+ // construction de l'arbre avant de le retourner
+ for(Map.Entry<String, TreeNodeResult<String>> e : allTreeNodeResult.entrySet()) {
+ String id = e.getKey();
+ String parentId = childParent.get(id);
+ if (allTreeNodeResult.containsKey(parentId)) {
+ TreeNodeResult<String> child = e.getValue();
+ TreeNodeResult<String> parent = allTreeNodeResult.get(parentId);
+ if (parent != child) {
+ parent.add(child);
+ }
+ }
+ }
+ result = allTreeNodeResult.get(wikittyId);
+ } else {
+ throw new WikittyException(String.format(
+ "Wikitty '%s' do not handle extension %s",
+ wikittyId, WikittyTreeNode.EXT_WIKITTYTREENODE));
+ }
+ }
+ return result;
+ } catch (SolrServerException eee) {
+ throw new WikittyException("Error during find", eee);
+ }
+
+ }
+
}
1
0