Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- 1653 discussions
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
r1261 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators
by bpoussin@users.nuiton.org 28 Dec '11
by bpoussin@users.nuiton.org 28 Dec '11
28 Dec '11
Author: bpoussin
Date: 2011-12-28 19:55:40 +0100 (Wed, 28 Dec 2011)
New Revision: 1261
Url: http://nuiton.org/repositories/revision/wikitty/1261
Log:
on remet les fichiers qui viennent d'etre effacer
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java 2011-12-28 18:55:40 UTC (rev 1261)
@@ -0,0 +1,141 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id: Contains.java 1136 2011-08-12 14:24:03Z tchemit $
+ * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-api/src/main/java/org/nuito… $
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.wikitty.search.operators;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Contains operator is used to build restriction containing "(element like
+ * *value1 or element like value1*) and (element like *value2 or element like
+ * value2*)" where element could be a String, a multimedia, a text or an xhtml
+ * <br>
+ * <br>
+ * For example, use:
+ * <ul>
+ * <li>RestrictionHelper.contains( myElement , "value1" )</li>
+ * <li>RestrictionHelper.contains( myElement , "value1", "value2", ... )</li>
+ * <li>RestrictionHelper.contains( myElement ,
+ * a_list_containing_at_least_one_string )</li>
+ * </ul>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
+public class Contains extends Restriction implements Serializable {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+ protected List<String> value;
+
+ /**
+ * Default constructor
+ */
+ public Contains() {
+ super();
+ }
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param value
+ */
+ public Contains(Element element, List<String> value) {
+ this.element = element;
+ this.value = value;
+ }
+
+ /**
+ * Return element
+ *
+ * @return
+ */
+ public Element getElement() {
+ return element;
+ }
+
+ /**
+ * Set a value to parameter element.
+ *
+ * @param element
+ */
+ public void setElement(Element element) {
+ this.element = element;
+ }
+
+ /**
+ * Return value
+ *
+ * @return
+ */
+ public List<String> getValue() {
+ return value;
+ }
+
+ /**
+ * Set a value to parameter value.
+ *
+ * @param value
+ */
+ public void setValue(List<String> value) {
+ this.value = value;
+ }
+
+ /**
+ * Equality test based attributes values
+ *
+ * @param value
+ * Value to compare
+ */
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof Contains)) {
+ return false;
+ }
+
+ final Contains contains = (Contains) other;
+
+ if ((element == null && contains.getElement() != null)
+ || (element != null && !element.equals(contains.getElement())))
+ return false;
+ if ((value == null && contains.getValue() != null)
+ || (value != null && !value.equals(contains.getValue())))
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ // equals use objects that are not constant through time
+ // then, unable to create hashCode from those objects
+ // returning a constant hash-code
+ return Contains.class.hashCode();
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java 2011-12-28 18:55:40 UTC (rev 1261)
@@ -0,0 +1,143 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id: In.java 1136 2011-08-12 14:24:03Z tchemit $
+ * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-api/src/main/java/org/nuito… $
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.wikitty.search.operators;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Contains operator is used to build restriction containing "(element like
+ * *value1 or element like value1*) and (element like *value2 or element like
+ * value2*)" where element could be a String, a multimedia, a text or an xhtml
+ * <br>
+ * <br>
+ * For example, use:
+ * <ul>
+ * <li>RestrictionHelper.contains( myElement , "value1" )</li>
+ * <li>RestrictionHelper.contains( myElement , "value1", "value2", ... )</li>
+ * <li>RestrictionHelper.contains( myElement ,
+ * a_list_containing_at_least_one_string )</li>
+ * </ul>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
+public class In extends Restriction implements Serializable {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+ protected List<String> value;
+
+ /**
+ * Default constructor
+ */
+ public In() {
+ super();
+ name = RestrictionName.IN;
+ }
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param value
+ */
+ public In(Element element, List<String> value) {
+ this.element = element;
+ this.value = value;
+ name = RestrictionName.IN;
+ }
+
+ /**
+ * Return element
+ *
+ * @return
+ */
+ public Element getElement() {
+ return element;
+ }
+
+ /**
+ * Set a value to parameter element.
+ *
+ * @param element
+ */
+ public void setElement(Element element) {
+ this.element = element;
+ }
+
+ /**
+ * Return value
+ *
+ * @return
+ */
+ public List<String> getValue() {
+ return value;
+ }
+
+ /**
+ * Set a value to parameter value.
+ *
+ * @param value
+ */
+ public void setValue(List<String> value) {
+ this.value = value;
+ }
+
+ /**
+ * Equality test based attributes values
+ *
+ * @param value
+ * Value to compare
+ */
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof In)) {
+ return false;
+ }
+
+ final In contains = (In) other;
+
+ if ((element == null && contains.getElement() != null)
+ || (element != null && !element.equals(contains.getElement())))
+ return false;
+ if ((value == null && contains.getValue() != null)
+ || (value != null && !value.equals(contains.getValue())))
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ // equals use objects that are not constant through time
+ // then, unable to create hashCode from those objects
+ // returning a constant hash-code
+ return In.class.hashCode();
+ }
+
+}
\ No newline at end of file
1
0
r1260 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators
by bpoussin@users.nuiton.org 28 Dec '11
by bpoussin@users.nuiton.org 28 Dec '11
28 Dec '11
Author: bpoussin
Date: 2011-12-28 19:54:56 +0100 (Wed, 28 Dec 2011)
New Revision: 1260
Url: http://nuiton.org/repositories/revision/wikitty/1260
Log:
je veux pas les supprimer, mais je sais pas comment faire :(
Removed:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java
Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java 2011-12-28 18:50:45 UTC (rev 1259)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Contains.java 2011-12-28 18:54:56 UTC (rev 1260)
@@ -1,139 +0,0 @@
-/*
- * #%L
- * Wikitty :: api
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-package org.nuiton.wikitty.search.operators;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Contains operator is used to build restriction containing "(element like
- * *value1 or element like value1*) and (element like *value2 or element like
- * value2*)" where element could be a String, a multimedia, a text or an xhtml
- * <br>
- * <br>
- * For example, use:
- * <ul>
- * <li>RestrictionHelper.contains( myElement , "value1" )</li>
- * <li>RestrictionHelper.contains( myElement , "value1", "value2", ... )</li>
- * <li>RestrictionHelper.contains( myElement ,
- * a_list_containing_at_least_one_string )</li>
- * </ul>
- */
-public class Contains extends Restriction implements Serializable {
-
- // serialVersionUID is used for serialization.
- private static final long serialVersionUID = 1L;
-
- protected Element element;
- protected List<String> value;
-
- /**
- * Default constructor
- */
- public Contains() {
- super();
- }
-
- /**
- * Constructor with all parameters initialized
- *
- * @param element
- * @param value
- */
- public Contains(Element element, List<String> value) {
- this.element = element;
- this.value = value;
- }
-
- /**
- * Return element
- *
- * @return
- */
- public Element getElement() {
- return element;
- }
-
- /**
- * Set a value to parameter element.
- *
- * @param element
- */
- public void setElement(Element element) {
- this.element = element;
- }
-
- /**
- * Return value
- *
- * @return
- */
- public List<String> getValue() {
- return value;
- }
-
- /**
- * Set a value to parameter value.
- *
- * @param value
- */
- public void setValue(List<String> value) {
- this.value = value;
- }
-
- /**
- * Equality test based attributes values
- *
- * @param value
- * Value to compare
- */
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (!(other instanceof Contains)) {
- return false;
- }
-
- final Contains contains = (Contains) other;
-
- if ((element == null && contains.getElement() != null)
- || (element != null && !element.equals(contains.getElement())))
- return false;
- if ((value == null && contains.getValue() != null)
- || (value != null && !value.equals(contains.getValue())))
- return false;
-
- return true;
- }
-
- public int hashCode() {
- // equals use objects that are not constant through time
- // then, unable to create hashCode from those objects
- // returning a constant hash-code
- return Contains.class.hashCode();
- }
-
-}
\ No newline at end of file
Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java 2011-12-28 18:50:45 UTC (rev 1259)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/In.java 2011-12-28 18:54:56 UTC (rev 1260)
@@ -1,141 +0,0 @@
-/*
- * #%L
- * Wikitty :: api
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-package org.nuiton.wikitty.search.operators;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Contains operator is used to build restriction containing "(element like
- * *value1 or element like value1*) and (element like *value2 or element like
- * value2*)" where element could be a String, a multimedia, a text or an xhtml
- * <br>
- * <br>
- * For example, use:
- * <ul>
- * <li>RestrictionHelper.contains( myElement , "value1" )</li>
- * <li>RestrictionHelper.contains( myElement , "value1", "value2", ... )</li>
- * <li>RestrictionHelper.contains( myElement ,
- * a_list_containing_at_least_one_string )</li>
- * </ul>
- */
-public class In extends Restriction implements Serializable {
-
- // serialVersionUID is used for serialization.
- private static final long serialVersionUID = 1L;
-
- protected Element element;
- protected List<String> value;
-
- /**
- * Default constructor
- */
- public In() {
- super();
- name = RestrictionName.IN;
- }
-
- /**
- * Constructor with all parameters initialized
- *
- * @param element
- * @param value
- */
- public In(Element element, List<String> value) {
- this.element = element;
- this.value = value;
- name = RestrictionName.IN;
- }
-
- /**
- * Return element
- *
- * @return
- */
- public Element getElement() {
- return element;
- }
-
- /**
- * Set a value to parameter element.
- *
- * @param element
- */
- public void setElement(Element element) {
- this.element = element;
- }
-
- /**
- * Return value
- *
- * @return
- */
- public List<String> getValue() {
- return value;
- }
-
- /**
- * Set a value to parameter value.
- *
- * @param value
- */
- public void setValue(List<String> value) {
- this.value = value;
- }
-
- /**
- * Equality test based attributes values
- *
- * @param value
- * Value to compare
- */
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (!(other instanceof In)) {
- return false;
- }
-
- final In contains = (In) other;
-
- if ((element == null && contains.getElement() != null)
- || (element != null && !element.equals(contains.getElement())))
- return false;
- if ((value == null && contains.getValue() != null)
- || (value != null && !value.equals(contains.getValue())))
- return false;
-
- return true;
- }
-
- public int hashCode() {
- // equals use objects that are not constant through time
- // then, unable to create hashCode from those objects
- // returning a constant hash-code
- return In.class.hashCode();
- }
-
-}
\ No newline at end of file
1
0
Author: bpoussin
Date: 2011-12-28 19:50:45 +0100 (Wed, 28 Dec 2011)
New Revision: 1259
Url: http://nuiton.org/repositories/revision/wikitty/1259
Log:
Evolution #1863: Create new query api with visitor and better implementation
Evolution #1864: Add query langage syntaxe
old search package and method findXXXbyCriteria have been marked deprecated
Proxy not yet modified
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopic.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResultTreeNode.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/
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/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/ContainsAll.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/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-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/False.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Join.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/True.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
Modified:
trunk/pom.xml
trunk/wikitty-api/pom.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Criteria.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopic.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicCountComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicNameComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/PagedResult.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/TreeNodeResult.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/And.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/AssociatedRestriction.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Between.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/BinaryOperator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Element.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/EndsWith.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Equals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/False.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Greater.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/GreaterOrEqual.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Keyword.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Less.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/LessOrEqual.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Not.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/NotEquals.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Null.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Or.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Restriction.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SearchOperand.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/StartsWith.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SubSearch.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/True.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.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
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/pom.xml 2011-12-28 18:50:45 UTC (rev 1259)
@@ -47,7 +47,7 @@
<maven3Version>3.0.3</maven3Version>
<!-- common versions used in sub-poms -->
- <eugeneVersion>2.4.1-SNAPSHOT</eugeneVersion>
+ <eugeneVersion>2.4.1</eugeneVersion>
<nuitonUtilsVersion>2.2</nuitonUtilsVersion>
<nuitonI18nVersion>2.4.1</nuitonI18nVersion>
<processPluginVersion>1.1</processPluginVersion>
@@ -56,6 +56,7 @@
<struts2Version>2.2.3</struts2Version>
<javassistVersion>3.8.0.GA</javassistVersion>
<jspapiversion>2.1</jspapiversion>
+ <opencsvVersion>2.3</opencsvVersion>
<nuitonProcessessorVersion>1.2.2</nuitonProcessessorVersion>
<nuiton-struts2>1.3</nuiton-struts2>
@@ -66,6 +67,19 @@
<dependencyManagement>
<dependencies>
+
+ <!-- pour le parser de requete -->
+ <dependency>
+ <groupId>org.parboiled</groupId>
+ <artifactId>parboiled-core</artifactId>
+ <version>1.0.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.parboiled</groupId>
+ <artifactId>parboiled-java</artifactId>
+ <version>1.0.2</version>
+ </dependency>
+
<!-- pour la communication client/serveur et la notification sur protocole cajo -->
<dependency>
<groupId>gnu.cajo</groupId>
@@ -241,7 +255,7 @@
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
- <version>2.1</version>
+ <version>${opencsvVersion}</version>
<scope>compile</scope>
</dependency>
Modified: trunk/wikitty-api/pom.xml
===================================================================
--- trunk/wikitty-api/pom.xml 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/pom.xml 2011-12-28 18:50:45 UTC (rev 1259)
@@ -17,7 +17,6 @@
<dependencies>
-
<!-- COMPILE -->
<!-- needed to mutualise some util method (tagValueToString) -->
@@ -27,6 +26,16 @@
<version>${project.version}</version>
</dependency>
+ <!-- pour le parser de requete -->
+ <dependency>
+ <groupId>org.parboiled</groupId>
+ <artifactId>parboiled-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.parboiled</groupId>
+ <artifactId>parboiled-java</artifactId>
+ </dependency>
+
<!-- pour la communication client/serveur et la notification sur protocole cajo -->
<dependency>
<groupId>gnu.cajo</groupId>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -38,6 +38,9 @@
import java.util.Collection;
import java.util.List;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.search.TreeNodeResult;
/**
@@ -316,11 +319,26 @@
* @param securityToken security token
* @param criteria
* @return
+ * @deprecated since 3.3 use {@link #findAllByQuery(java.lang.String, java.util.List)}
*/
+ @Deprecated
public List<PagedResult<String>> findAllByCriteria(
String securityToken, List<Criteria> criteria);
/**
+ * Looking for Wikitty that match criteria. More than one criteria can be
+ * passed in parametre, for each query in parametre there is a WikittyQueryResult
+ * associated with the same index.
+ *
+ * @param securityToken security token
+ * @param query
+ * @return
+ * @since 3.3
+ */
+ public List<WikittyQueryResult<String>> findAllByQuery(
+ String securityToken, List<WikittyQuery> queries);
+
+ /**
* First lonely (or first one) wikitty object that match criteria, if no
* wikitty found or first retrived is not authorized for the user return
* null. for each criteria in parametre there is a result
@@ -329,9 +347,24 @@
* @param securityToken security token
* @param criteria
* @return wikitty id object or null
+ * @deprecated since 3.3 use {@link #findByQuery(java.lang.String, java.util.List) }
*/
+ @Deprecated
public List<String> findByCriteria(String securityToken, List<Criteria> criteria);
+ /**
+ * First lonely (or first one) wikitty object that match query, if no
+ * wikitty found or first retrived is not authorized for the user return
+ * null. for each query in parametre there is a result
+ * associated with the same index.
+ *
+ * @param securityToken security token
+ * @param queries
+ * @return wikitty id object or null
+ * @since 3.3
+ */
+ public List<String> findByQuery(String securityToken, List<WikittyQuery> queries);
+
/*
* Classification
* Most of classification purpose is handle by extension mechanisms
@@ -355,7 +388,7 @@
* <li> 1 return wikittyId passed in argument, and his children
* <li> ...
* <li> negative value return all node
- *
+ *
* if count is true, integer in return map is number of attachment in subtree
* (recursively). If filter is not null only attachments that satisfy filter
* are counted.
@@ -368,12 +401,41 @@
* @param filter filter on attachment count
* @return
* @since 3.1
+ * @deprecated since 3.3 use {@link #findTreeNode(java.lang.String, java.lang.String, int, boolean, org.nuiton.wikitty.query.WikittyQuery) }
*/
+ @Deprecated
public TreeNodeResult<String> findTreeNode(
String securityToken, String wikittyId,
int depth, boolean count, Criteria filter);
+ /**
+ * Retrieve all node from wikittyId, this node is returned too.
+ * Returned wikitty must include the 'WikittyTreeNode' extension.
+ *
+ * depth ask the recursively level:
+ * <li> 0 return only wikittyId passed in argument
+ * <li> 1 return wikittyId passed in argument, and his children
+ * <li> ...
+ * <li> negative value return all node
+ *
+ * if count is true, integer in return map is number of attachment in subtree
+ * (recursively). If filter is not null only attachments that satisfy filter
+ * are counted.
+ * if count is false, all integer are fixed to 0
+ *
+ * @param securityToken security token
+ * @param wikittyId root node to begin
+ * @param depth depth of node returned
+ * @param count if true return count of attachment
+ * @param filter filter on attachment count
+ * @return
+ * @since 3.3
+ */
+ public WikittyQueryResultTreeNode<String> findTreeNode(
+ String securityToken, String wikittyId,
+ int depth, boolean count, WikittyQuery filter);
+
/*
* history
*/
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-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -48,6 +48,7 @@
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
@@ -110,7 +111,7 @@
static private Log log = LogFactory.getLog(WikittyUtil.class);
/** used to format date for solr */
- protected static TimeZone CANONICAL_TZ = TimeZone.getTimeZone("UTC");
+ protected static final TimeZone CANONICAL_TZ = TimeZone.getTimeZone("UTC");
protected static final Locale CANONICAL_LOCALE = Locale.US;
// FastDateFormat is thread-safe
@@ -501,6 +502,13 @@
return result;
}
+ /**
+ * Convert Object to String representation if value is not null
+ * Wikitty is converted to id, and Date to SolrDateFormat
+ *
+ * @param value value to convert
+ * @return String representation or null
+ */
static public String toString(Object value) {
String result = null;
if (value != null) {
@@ -512,6 +520,8 @@
result = ((BusinessEntity) value).getWikittyId();
} else if (value instanceof Date) {
result = solrDateFormat.format((Date) value);
+ } else if (value instanceof Calendar) {
+ result = solrDateFormat.format((Calendar)value);
} else {
// try to convert to String
result = value.toString();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -141,7 +141,7 @@
* @param value value to convert
* @return object in type of this FieldType
*/
- protected Object getContainedValidObject( Object value ) {
+ public Object getContainedValidObject( Object value ) {
Object result = null;
switch (type) {
case BINARY:
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopic.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopic.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopic.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,54 @@
+package org.nuiton.wikitty.query;
+
+import java.io.Serializable;
+
+/**
+ * Represente un topic d'une facet. Les topic sont utilise dans les resultats
+ * de requete
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class FacetTopic implements Serializable {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 1408493244549775810L;
+
+ protected String facetName;
+
+ protected String topicName;
+
+ protected int count;
+
+ public FacetTopic(String facetName, String topicName, int count) {
+ this.facetName = facetName;
+ this.topicName = topicName;
+ this.count = count;
+ }
+
+ public String getFacetName() {
+ return facetName;
+ }
+
+ public String getTopicName() {
+ return topicName;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ @Override
+ public String toString() {
+ String result = String.format(
+ "FacetTopic(facet: '%s' topic: '%s' count: '%s')",
+ getFacetName(), getTopicName(), getCount());
+ return result;
+ }
+
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Comparator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Comparateur de topic sur le nombre d'occurence du topic dans la facet.
+ * Cela permet de presenter a l'utilisateur les topics les plus rependu en premier
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class FacetTopicCountComparator implements Comparator<FacetTopic> {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(FacetTopicCountComparator.class);
+
+ public int compare(FacetTopic o1, FacetTopic o2) {
+ int thisVal = o1.getCount();
+ int anotherVal = o2.getCount();
+ // code recupere de Integer.compareTo
+ return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,41 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Comparator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Comparateur de topic sur le nom du topic.
+ * Cela permet de presenter a l'utilisateur les topics dans l'ordre alphabetique
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class FacetTopicNameComparator implements Comparator<FacetTopic> {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(FacetTopicNameComparator.class);
+
+ protected boolean ignoreCase = true;
+
+ public FacetTopicNameComparator() {
+ }
+
+ public FacetTopicNameComparator(boolean ignoreCase) {
+ this.ignoreCase = ignoreCase;
+ }
+
+ public int compare(FacetTopic o1, FacetTopic o2) {
+ int result;
+ if (ignoreCase) {
+ result = o1.getTopicName().compareToIgnoreCase(o2.getTopicName());
+ } else {
+ result = o1.getTopicName().compareTo(o2.getTopicName());
+ }
+ return result;
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,325 @@
+package org.nuiton.wikitty.query;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.query.conditions.Condition;
+
+/**
+ * Classe permettant de faire des recherches dans les données.
+ * <p>
+ * Pour creer facilement la condition le plus simple est d'utiliser
+ * {@link WikittyQueryMaker} pour creer le WikittyQuery en appelant la
+ * method {@link WikittyQueryMaker#end()} a la fin.
+ * <p>
+ * Pour offrir au utilisateur de vos applications la possibilite d'ecrire
+ * eux meme des requetes vous pouvez utiliser {@link WikittyQueryParser}
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQuery implements Serializable {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQuery.class);
+
+ private static final long serialVersionUID = 1L;
+
+ /** Use to not limit result. */
+ static final public int MAX = -1;
+
+ /** query name */
+ protected String name;
+ /** 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. */
+ protected int limit = 100;
+
+ /**
+ * nombre minimum de valeur pour qu'une valeur apparaisse dans les facets.
+ * par defaut, il doit y avoir plus que 1 valeur.
+ */
+ protected int facetMinCount = 1;
+ /**
+ * Nombre maximum de facet a retourner apres la requete. Par default on en
+ * retourne 100.
+ */
+ protected int facetLimit = 100;
+
+ /** Facet on condition. */
+ protected List<Condition> facetCriteria;
+ /** Facet on field. */
+ protected List<String> facetField;
+ /** if true facet is done on extension name */
+ protected boolean facetExtension = false;
+
+ /** Sort ascending on fields. */
+ protected List<String> sortAscending;
+ /** Sort descending on fields. */
+ protected List<String> sortDescending;
+
+
+ /** create anonymous query */
+ public WikittyQuery() {
+ }
+
+ public WikittyQuery(Condition condition) {
+ setCondition(condition);
+ }
+
+ public WikittyQuery copy() {
+ WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy();
+ accept(v);
+ return v.getQuery();
+ }
+
+ @Override
+ public String toString() {
+ WikittyQueryVisitorToString v = new WikittyQueryVisitorToString();
+ accept(v);
+ String result = v.getText();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ boolean result;
+
+ if (o == null) {
+ result = false;
+ } else if (ObjectUtils.equals(this.getClass(), o.getClass())) {
+ WikittyQuery other = (WikittyQuery)o;
+ 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.getFacetField(), other.getFacetField()) &&
+ ObjectUtils.equals(this.getSortAscending(), other.getSortAscending()) &&
+ 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.getCondition(), other.getCondition());
+ } else {
+ result = false;
+ }
+
+ return result;
+ }
+
+ /**
+ * Inefficiant hashCode method but necessary with overloading of equals method
+ * This method return hashCode of object class. There is no better way to
+ * compute stable hashCode in time
+ *
+ * @return
+ */
+ @Override
+ public int hashCode() {
+ int result = getClass().hashCode();
+ return result;
+ }
+
+ /** create named query */
+ public WikittyQuery(String name) {
+ this.name = name;
+ }
+
+ /** create named query with condition*/
+ public WikittyQuery(String name, Condition condition) {
+ this.name = name;
+ setCondition(condition);
+ }
+
+ public void accept(WikittyQueryVisitor visitor) {
+ boolean walk = visitor.visitEnter(this);
+ if (walk && condition != null) {
+ condition.accept(visitor);
+ }
+ visitor.visitLeave(this, walk);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public WikittyQuery setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public String getSelect() {
+ return select;
+ }
+
+ public WikittyQuery setSelect(String select) {
+ this.select = select;
+ return this;
+ }
+
+ public int getFirst() {
+ return first;
+ }
+
+ public WikittyQuery setFirst(int first) {
+ this.first = first;
+ return this;
+ }
+
+ public int getLimit() {
+ return limit;
+ }
+
+ public WikittyQuery setLimit(int count) {
+ this.limit = count;
+ return this;
+ }
+
+ public int getFacetMinCount() {
+ return facetMinCount;
+ }
+
+ public WikittyQuery setFacetMinCount(int facetMinCount) {
+ this.facetMinCount = facetMinCount;
+ return this;
+ }
+
+ public int getFacetLimit() {
+ return facetLimit;
+ }
+
+ public WikittyQuery setFacetLimit(int facetLimit) {
+ this.facetLimit = facetLimit;
+ return this;
+ }
+
+ public List<Condition> getFacetCriteria() {
+ if (facetCriteria == null) {
+ facetCriteria = new LinkedList<Condition>();
+ }
+ return facetCriteria;
+ }
+
+ public WikittyQuery addFacetCriteria(Condition criteria) {
+ getFacetCriteria().add(criteria);
+ return this;
+ }
+
+ public WikittyQuery setFacetCriteria(Condition ... facetCriteria) {
+ this.facetCriteria = new LinkedList<Condition>(Arrays.asList(facetCriteria));
+ return this;
+ }
+
+ public List<String> getFacetField() {
+ if (facetField == null) {
+ facetField = new LinkedList<String>();
+ }
+ return facetField;
+ }
+
+ public WikittyQuery addFacetField(String field) {
+ getFacetField().add(field);
+ return this;
+ }
+
+ public WikittyQuery setFacetField(String ... facetField) {
+ this.facetField = new LinkedList<String>(Arrays.asList(facetField));
+ return this;
+ }
+
+ public WikittyQuery setFacetField(List<String> facetField) {
+ this.facetField = facetField;
+ return this;
+ }
+
+ public boolean isFacetExtension() {
+ return facetExtension;
+ }
+
+ public WikittyQuery setFacetExtension(boolean facetExtension) {
+ this.facetExtension = facetExtension;
+ return this;
+ }
+
+
+ /**
+ * Get field names where sort is configured ascending.
+ *
+ * @return field names
+ */
+ public List<String> getSortAscending() {
+ if (sortAscending == null) {
+ sortAscending = new LinkedList<String>();
+ }
+ return sortAscending;
+ }
+
+ public WikittyQuery addSortAscending(String ... field) {
+ getSortAscending().addAll(Arrays.asList(field));
+ return this;
+ }
+
+ public WikittyQuery setSortAscending(String ... sortAscending) {
+ this.sortAscending = new LinkedList<String>(Arrays.asList(sortAscending));
+ return this;
+ }
+
+ public WikittyQuery setSortAscending(List<String> sortAscending) {
+ this.sortAscending = sortAscending;
+ return this;
+ }
+
+ /**
+ * Get field names where sort is configured descending.
+ *
+ * @return field names
+ */
+ public List<String> getSortDescending() {
+ if (sortDescending == null) {
+ sortDescending = new LinkedList<String>();
+ }
+ return sortDescending;
+ }
+
+ public WikittyQuery addSortDescending(String ... field) {
+ getSortDescending().addAll(Arrays.asList(field));
+ return this;
+ }
+
+ public WikittyQuery setSortDescending(String ... sortDescending) {
+ this.sortDescending = new LinkedList<String>(Arrays.asList(sortDescending));
+ return this;
+ }
+
+ public WikittyQuery setSortDescending(List<String> sortDescending) {
+ this.sortDescending = sortDescending;
+ return this;
+ }
+
+ public Condition getCondition() {
+ return condition;
+ }
+
+ public WikittyQuery setCondition(Condition condition) {
+ this.condition = condition;
+ return this;
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,844 @@
+package org.nuiton.wikitty.query;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.List;
+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.query.conditions.And;
+import org.nuiton.wikitty.query.conditions.Between;
+import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ContainsAll;
+import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.Element;
+import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.ElementId;
+import org.nuiton.wikitty.query.conditions.Equals;
+import org.nuiton.wikitty.query.conditions.False;
+import org.nuiton.wikitty.query.conditions.Greater;
+import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
+import org.nuiton.wikitty.query.conditions.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;
+
+/**
+ * Cette objet sert a construire une condition a la facon d'un flux.
+ * <p>
+ * Condition c = new WikittyQueryMaker().and().eq("ext.field", "toto").eq("ext.field2", 10).getCondition();
+ * <p>
+ * On peut aussi vouloir continuer avec un WikittyQuery pour cela on peut faire.
+ * <p>
+ * WikittyQuery q = new WikittyQueryMaker().and().[other condition].end();
+ * <p>
+ * Si un {@link WikittyQuery} est passé en parametre du constructeur et que la
+ * method {@link #end()} est appeler alors la condition creee est envoyee dans
+ * le WikittyQuery et le constructeur est fermer (on ne peut plus ajouter de
+ * condition)
+ * <p>
+ * Le WikittyQuery lie avec cet objet lorsqu'on le recupere via la method
+ * {@link #getQuery()} a en interne comme condition la valuer courante de la
+ * condition en cours d'ecriture
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQueryMaker {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryMaker.class);
+
+ /** query where to send condition when end() method called */
+ protected WikittyQuery query;
+
+ /** query condition */
+ protected Condition condition;
+ /** stack des conditions non terminales ouvertes */
+ protected Deque<Condition> openStack = new LinkedList<Condition>();
+
+ public WikittyQueryMaker() {
+ }
+
+ public WikittyQueryMaker(WikittyQuery query) {
+ this.query = query;
+ }
+
+ public Condition getCondition() {
+ return condition;
+ }
+
+ /**
+ * La query passee dans le constructeur ou une nouvelle query si aucune
+ * query n'avait ete passee dans le constructeur
+ *
+ * @return
+ */
+ public WikittyQuery getQuery() {
+ if (query == null) {
+ query = new WikittyQuery();
+ }
+ // la condition de la query doit toujours refleter la valeur courante
+ // de la condition en cours de creation
+ query.setCondition(getCondition());
+ return query;
+ }
+
+ /**
+ * Retourne le stack courant des conditions, si le stack est null cela
+ * veut dire que le maker ne permet plus de modification
+ * @return
+ */
+ protected Deque<Condition> getOpenStack() {
+ if (openStack == null) {
+ throw new WikittyException(
+ "You can't create condition if you have used setCondition method"
+ + " or close last condition");
+ }
+ return openStack;
+ }
+
+ /** Ajout une condition terminal */
+ protected void addCondition(Condition c) {
+ Condition parent = getOpenStack().peek();
+
+ if (parent == null) {
+ // il n'y a rien dans la stack donc rien dans condition, il faut
+ // mettre cette condition dedans
+ condition = c;
+ // on ne met les conditions terminal dans le stack, que lorsque
+ // c'est la premiere (cela permet d'indiquer a l'utilisateur
+ // qu'il faut commencer par un or, and, not car une exception sera
+ // levee
+ getOpenStack().push(c);
+ } else {
+ parent.addCondition(c);
+ }
+ }
+
+ /**
+ * Ajout d'une condition non terminal (or, and, not, join)
+ * @param c
+ */
+ protected void addOnStack(Condition c) {
+ Condition parent = getOpenStack().peek();
+ getOpenStack().push(c);
+
+ if (parent == null) {
+ // il n'y a rien dans la stack donc rien dans condition, il faut
+ // mettre cette condition dedans
+ condition = c;
+ } else {
+ parent.addCondition(c);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Q U E R Y F L O W C R E A T I O N
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ // eq(Wikitty|Date|Number|Boolean|String)
+
+ /**
+ * Convertie une liste d'objet en une liste de String representant
+ * les objets
+ *
+ * @param l
+ * @return
+ */
+ static public List<String> convertToQueryStringList(Collection l) {
+ List<String> result;
+ if (l == null) {
+ result = Collections.emptyList();
+ } else {
+ result = new ArrayList<String>(l.size());
+ for (Object o : l) {
+ String s = WikittyUtil.toString(o);
+ result.add(s);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Contains.
+ *
+ * Search on lists (multivalued fields) that a field contains all the values
+ * of the list given in parameter.
+ *
+ * Ex : The field with value [toto,titi,tutu] contains [titi,tutu] but not
+ * [titi,tutu,tata]
+ *
+ * @param element the element on which the restriction is put
+ * @param values the values to search in the element
+ * @return {@code this} with the {@code contains} restriction added.
+ * @see {@link ContainsAll}
+ */
+ public <E> WikittyQueryMaker containsAll(String fqfield, Collection<E> values) {
+ return containsAll(new ElementField(fqfield), values);
+ }
+
+ /**
+ *
+ * @param element
+ * @param values
+ * @return
+ * @see {@link ContainsAll}
+ */
+ public <E> WikittyQueryMaker containsAll(Element element, Collection<E> values) {
+ addCondition(new ContainsAll(element,
+ convertToQueryStringList(values)));
+ return this;
+ }
+
+ /**
+ * Search on lists (multivalued fields) that a field contains all the values
+ * given in parameter.
+ *
+ * Ex : The field with value [toto,titi,tutu] contains [titi,tutu] but not
+ * [titi,tutu,tata]
+ *
+ * Ps : Use wildcards if you search for substrings.
+ *
+ * @param element the element on which the restriction is put
+ * @param value1 first value to search in the field
+ * @param values list of values to search in the field
+ * @return {@code this} with the {@code contains} restriction added.
+ * @see {@link ContainsAll}
+ */
+ public <E> WikittyQueryMaker containsAll(String fqfield, E value1, E ... values) {
+ List<E> l = new LinkedList<E>();
+ l.add(value1);
+ l.addAll(Arrays.asList(values));
+ return containsAll(fqfield, l);
+ }
+
+ /**
+ * Search if a field is contained in the list of values in parameter
+ *
+ * Ex : The field with value titi is in [titi,tutu] but not in
+ * [tutu,tata]
+ *
+ * @param element the element on which the restriction is put
+ * @param values list of values the field must be in
+ * @return {@code this} with the {@code in} restriction added.
+ * @see {@link ContainsOne}
+ */
+ public <E> WikittyQueryMaker containsOne(String fqfield, Collection<E> values) {
+ return containsOne(new ElementField(fqfield), values);
+ }
+
+ /**
+ *
+ * @param element
+ * @param values
+ * @return
+ * @see {@link ContainsOne}
+ */
+ public <E> WikittyQueryMaker containsOne(Element element, Collection<E> values) {
+ addCondition(new ContainsOne(element,
+ convertToQueryStringList(values)));
+ return this;
+ }
+
+ /**
+ * Search if a field is contained in the list of values in parameter
+ *
+ * Ex : The field with value titi is in [titi,tutu] but not in
+ * [tutu,tata]
+ *
+ * Ps : Use wildcards in the values if you search for substrings.
+ *
+ * @param element the element on which the restriction is put
+ * @param value1 first value the field must be in
+ * @param values list of values the field must be in
+ * @return {@code this} with the {@code in} restriction added.
+ * @see {@link ContainsOne}
+ */
+ public <E> WikittyQueryMaker containsOne(String fqfield, E value1, E ... values) {
+ List<E> l = new LinkedList<E>();
+ l.add(value1);
+ l.addAll(Arrays.asList(values));
+ return containsOne(fqfield, l);
+ }
+
+ /**
+ * Equals.
+ *
+ * Restrict search so that the field value equals the parameter.
+ *
+ * You might use patterns in your equality.
+ *
+ * @param element the field on which the search is made
+ * @param value the value the element must be equals to
+ * @return {@code this}
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker eq(String fqfield, Object value) {
+ return eq(new ElementField(fqfield), value);
+ }
+
+ /**
+ *
+ * @param element
+ * @param value
+ * @return
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker eq(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new Equals(element, s));
+ return this;
+ }
+
+ /**
+ * Extension equals.
+ *
+ * Restrict search to wikitties that got the extension in parameter.
+ *
+ * @param s the extension to restrict the results to
+ * @return {@code this} with the {@code exteq} restriction added.
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker exteq(String extensionName) {
+ return eq(new ElementExtension(), extensionName);
+ }
+
+ /**
+ * Id equals.
+ *
+ * Restrict search to wikitties that got the id in parameter.
+ *
+ * @param value the id or wikitty to restrict the results to
+ * @return {@code this} with the {@code ideq} restriction added.
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker ideq(Object idOrWikitty) {
+ return eq(new ElementId(), idOrWikitty);
+ }
+
+ /**
+ * Extension equals.
+ *
+ * Restrict search to wikitties that got all the extensions in parameter.
+ *
+ * @param extensionNames list of the extension to restrict the results to
+ * @return {@code this} with the {@code exteq} restriction added.
+ * @see {@link ContainsAll}
+ */
+ public WikittyQueryMaker extContainsAll(Collection<String> extensionNames) {
+ return containsAll(new ElementExtension(), extensionNames);
+ }
+
+ /**
+ * @see {@link ContainsAll}
+ */
+ public WikittyQueryMaker extContainsAll(String ext1, String ... exts) {
+ List<String> l = new LinkedList<String>();
+ l.add(ext1);
+ l.addAll(Arrays.asList(exts));
+ return containsAll(new ElementExtension(), l);
+ }
+
+ /**
+ * Not equals.
+ *
+ * Restrict search to elements that are not equals to the value given in
+ * parameter.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value the value the element must not be equals to.
+ * @return {@code this} with the {@code neq} restriction added.
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker ne(String fqfield, Object value) {
+ return ne(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker ne(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new NotEquals(element, s));
+ return this;
+ }
+
+ /**
+ * Extension not equals.
+ *
+ * Restrict search to wikitties that do not get the extension given in
+ * parameter.
+ *
+ * @param extensionName the extension that the wikitties must not have.
+ * @return {@code this} with the {@code extneq} restriction added.
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker extneq(String extensionName) {
+ return ne(new ElementExtension(), extensionName);
+ }
+
+ /**
+ * Id not equals.
+ *
+ * Restrict search to wikitties that do not have the id given in parameter.
+ *
+ * @param idOrWikitty the id the wikitties must not have.
+ * @return {@code this} with the {@code idneq} restriction added.
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker idneq(Object idOrWikitty) {
+ return ne(new ElementId(), idOrWikitty);
+ }
+
+ /**
+ * Greater than.
+ *
+ * Search if an element value is greater than the parameter.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value the value to be compared to
+ * @return {@code this} with the {@code gt} restriction added.
+ * @see {@link Greater}
+ */
+ public WikittyQueryMaker gt(String fqfield, Object value) {
+ return gt(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Greater}
+ */
+ public WikittyQueryMaker gt(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new Greater(element, s));
+ return this;
+ }
+
+ /**
+ * Greater than or equals.
+ *
+ * Search if an element value is greater than or equals to the parameter.
+ *
+ * @param fqfield the field on which the search is made
+ * @param value the value to be compared to
+ * @return {@code this} with the {@code ge} restriction added.
+ * @see {@link GreaterOrEquals}
+ */
+ public WikittyQueryMaker ge(String fqfield, Object value) {
+ return ge(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link GreaterOrEquals}
+ */
+ public WikittyQueryMaker ge(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new GreaterOrEquals(element, s));
+ return this;
+ }
+
+ /**
+ * Less than.
+ *
+ * Search if an element value is less than the parameter.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value the value to be compared to
+ * @return {@code this} with the {@code lt} restriction added.
+ * @see {@link Less}
+ */
+ public WikittyQueryMaker lt(String fqfield, Object value) {
+ return lt(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Less}
+ */
+ public WikittyQueryMaker lt(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new Less(element, s));
+ return this;
+ }
+
+ /**
+ * Less than or equals.
+ *
+ * Search if an element value is less than or equals to the parameter.
+ *
+ * @param fqfield the element on which the restriction is put.
+ * @param value the value to be compared to.
+ * @return {@code this} with the {@code le} restriction added.
+ * @see {@link LessOrEquals}
+ */
+ public WikittyQueryMaker le(String fqfield, Object value) {
+ return le(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link LessOrEquals}
+ */
+ public WikittyQueryMaker le(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new LessOrEquals(element, s));
+ return this;
+ }
+
+ /**
+ * Between.
+ *
+ * Restrict search so that the element value is between the lower and upper
+ * values (it can also be equals).
+ *
+ * @param fqfield the element on which the restriction is put.
+ * @param lowerValue the lower bound.
+ * @param upperValue the upper bound.
+ * @return {@code this} with the {@code le} restriction added.
+ * @see {@link Between}
+ */
+ public WikittyQueryMaker bw(String fqfield, Object lowerValue, Object upperValue) {
+ return bw(new ElementField(fqfield), lowerValue, upperValue);
+ }
+
+ /**
+ * @see {@link Between}
+ */
+ public WikittyQueryMaker bw(Element element, Object lowerValue, Object upperValue) {
+ String min = WikittyUtil.toString(lowerValue);
+ String max = WikittyUtil.toString(upperValue);
+ addCondition(new Between(element, min, max));
+ return this;
+ }
+
+ /**
+ * Starts with.
+ *
+ * Search if an element starts with the value in parameter.
+ *
+ * @param fqfield the element on which the restriction is put.
+ * @param value the value the element must start with.
+ * @return {@code this} with the {@code sw} restriction added.
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker sw(String fqfield, Object value) {
+ return sw(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker sw(Element element, Object value) {
+ String s = WikittyUtil.toString(value) + "*";
+ addCondition(new Equals(element, s));
+ return this;
+ }
+
+ /**
+ * Not starts with.
+ *
+ * Search if an element does not starts with the value in parameter.
+ *
+ * @param fqfield the element on which the restriction is put.
+ * @param value the value the element must not start with.
+ * @return {@code this} with the {@code nsw} restriction added.
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker notsw(String fqfield, Object value) {
+ return notsw(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker notsw(Element element, Object value) {
+ String s = WikittyUtil.toString(value) + "*";
+ addCondition(new NotEquals(element, s));
+ return this;
+ }
+
+ /**
+ * Ends with.
+ *
+ * Search if an element ends with the value in parameter.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value the value the element must ends with.
+ * @return {@code this} with the {@code ew} restriction added.
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker ew(String fqfield, Object value) {
+ return ew(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Equals}
+ */
+ public WikittyQueryMaker ew(Element element, Object value) {
+ String s = "*" + WikittyUtil.toString(value);
+ addCondition(new Equals(element, s));
+ return this;
+ }
+
+ /**
+ * Not ends with.
+ *
+ * Search if an element does not ends with the value in parameter.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value the value the element must not ends with.
+ * @return {@code this} with the {@code notew} restriction added.
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker notew(String fqfield, Object value) {
+ return notew(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link NotEquals}
+ */
+ public WikittyQueryMaker notew(Element element, Object value) {
+ String s = "*" + WikittyUtil.toString(value);
+ addCondition(new NotEquals(element, s));
+ return this;
+ }
+
+ /**
+ * Keyword.
+ *
+ * Search if the value in parameter is present in any field of any
+ * extension.
+ *
+ * @param value the value to find.
+ * @return {@code this} with the {@code keyword} restriction added.
+ * @see {@link Keyword}
+ */
+ public WikittyQueryMaker keyword(Object value) {
+ String s = WikittyUtil.toString(value);
+ addCondition(new Keyword(s));
+ return this;
+ }
+
+ /**
+ * Is null.
+ *
+ * Check that a field is null.
+ *
+ * @param fqfield the field that must be null.
+ * @return {@code this} with the {@code isNull} restriction added.
+ * @see {@link Null}
+ */
+ public WikittyQueryMaker isNull(String fqfield) {
+ return isNull(new ElementField(fqfield));
+ }
+
+ /**
+ * @see {@link Null}
+ */
+ public WikittyQueryMaker isNull(Element element) {
+ addCondition(new Null(element));
+ return this;
+ }
+
+ /**
+ * Is not null.
+ *
+ * Check that a field is not null.
+ *
+ * @param fqfield the field that must not be null.
+ * @return {@code this} with the {@code isNotNull} restriction added.
+ * @see {@link NotNull}
+ */
+ public WikittyQueryMaker isNotNull(String fqfield) {
+ return isNotNull(new ElementField(fqfield));
+ }
+
+ /**
+ * @see {@link NotNull}
+ */
+ public WikittyQueryMaker isNotNull(Element element) {
+ addCondition(new NotNull(element));
+ return this;
+ }
+
+ /**
+ * False.
+ *
+ * Add a restriction that always return false.
+ *
+ * @return {@code this} with the {@code rFalse} restriction added.
+ * @see {@link False}
+ */
+ public WikittyQueryMaker rFalse() {
+ addCondition(new False());
+ return this;
+ }
+
+ /**
+ * True.
+ *
+ * Add a restriction that always return true.
+ *
+ * @return {@code this} with the {@code rTrue} restriction added.
+ * @see {@link True}
+ */
+ public WikittyQueryMaker rTrue() {
+ addCondition(new True());
+ return this;
+ }
+
+ /**
+ * Like.
+ *
+ * Check that a string is present in a field. For example "tric" is present
+ * in "Restriction".
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value
+ * @param searchAs
+ * @return {@code this}
+ * @see {@link Like}
+ */
+ public WikittyQueryMaker like(String fqfield, Object value) {
+ return like(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Like}
+ */
+ public WikittyQueryMaker like(Element element, Object value) {
+ String s = WikittyUtil.toString(value);
+ Like c = new Like(element, s);
+ addCondition(c);
+ return this;
+ }
+
+ /**
+ * Unlike.
+ *
+ * @param fqfield the element on which the restriction is put
+ * @param value
+ * @param searchAs
+ * @return {@code this}
+ * @see {@link Unlike}
+ */
+ public WikittyQueryMaker unlike(String fqfield, String value) {
+ return unlike(new ElementField(fqfield), value);
+ }
+
+ /**
+ * @see {@link Unlike}
+ */
+ public WikittyQueryMaker unlike(Element element, String value) {
+ String s = WikittyUtil.toString(value);
+ Unlike c = new Unlike(element, s);
+ addCondition(c);
+ return this;
+ }
+
+ /**
+ * Not (sub query). To close this sub query you must used {@link #close()}
+ * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
+ *
+ * @see {@link Not}
+ */
+ public WikittyQueryMaker not() {
+ Condition child = new Not();
+ addOnStack(child);
+ return this;
+ }
+
+ /**
+ * Or (sub query). To close this sub query you must used {@link #close()}
+ * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
+ *
+ * @see {@link Or}
+ */
+ public WikittyQueryMaker or() {
+ Condition child = new Or();
+ addOnStack(child);
+ return this;
+ }
+
+ /**
+ * And (sub query). To close this sub query you must used {@link #close()}
+ * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
+ *
+ * @see {@link And}
+ */
+ public WikittyQueryMaker and() {
+ Condition child = new And();
+ addOnStack(child);
+
+ return this;
+ }
+
+ /**
+ * Add {@link Join} 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}
+ */
+ public WikittyQueryMaker join(String foreignFieldName) {
+ return join(new ElementField(foreignFieldName));
+ }
+
+ /*
+ * @see {@link Join}
+ */
+ public WikittyQueryMaker join(Element element) {
+ Condition child = new Join(element);
+ addOnStack(child);
+ return this;
+ }
+
+ /**
+ * Close last non terminal condition (or, and, not, join).
+ * <li>ex: WikittyQueryMaker().not().rTrue().close().and().rTrue().rFalse().close().or().rTrue().rFalse().close();
+ * @return
+ */
+ public WikittyQueryMaker close() {
+ getOpenStack().pop();
+ if (getOpenStack().size() == 0) {
+ // we just close last open condition, set stack to null, to prevent
+ // next condition add that is mistake
+ openStack = null;
+ }
+ return this;
+ }
+
+ /**
+ * Ferme la construction de la condition et la met en place dans la
+ * WikittyQuery qui sera retournee
+ *
+ * @return un objet WikittyQuery soit un nouveau soit celui passe dans le
+ * constructeur
+ */
+ public WikittyQuery end() {
+ WikittyQuery result = getQuery();
+ result.setCondition(getCondition());
+ // on interdit les modifications futur
+ openStack = null;
+
+ return result;
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,338 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang.StringUtils;
+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.Between;
+import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ContainsAll;
+import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.Element;
+import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
+import org.nuiton.wikitty.query.conditions.ElementId;
+import org.nuiton.wikitty.query.conditions.Equals;
+import org.nuiton.wikitty.query.conditions.False;
+import org.nuiton.wikitty.query.conditions.Greater;
+import org.nuiton.wikitty.query.conditions.GreaterOrEquals;
+import org.nuiton.wikitty.query.conditions.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.Or;
+import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.NotNull;
+import org.nuiton.wikitty.query.conditions.Null;
+import org.nuiton.wikitty.query.conditions.True;
+import org.nuiton.wikitty.query.conditions.Unlike;
+import org.parboiled.BaseParser;
+import org.parboiled.Parboiled;
+import org.parboiled.Rule;
+import org.parboiled.annotations.BuildParseTree;
+import org.parboiled.errors.ErrorUtils;
+import org.parboiled.parserunners.RecoveringParseRunner;
+import org.parboiled.parserunners.ReportingParseRunner;
+import org.parboiled.support.ParseTreeUtils;
+import org.parboiled.support.ParsingResult;
+import org.parboiled.support.Var;
+
+/**
+ * Cette classe permet d'interpreter une requete faite textuellement en la
+ * convertisant en sa representation objet.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+@BuildParseTree
+public class WikittyQueryParser extends BaseParser<Object> {
+ 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 LITERAL_CLOSE = "\"";
+ public static final String LITERAL_OPEN = "\"";
+ public static final String NULL = "NULL";
+ public static final String TO = "TO";
+ public static final String TRUE = "TRUE";
+ public static final String UNLIKE = "UNLIKE";
+ public static final String AND = "AND";
+ public static final String COMMA = ",";
+ public static final String CURLY_BRACKET_CLOSE = "}";
+ public static final String CURLY_BRACKET_OPEN = "{";
+ public static final String EQUALS = "=";
+ public static final String GREATER = ">";
+ public static final String GREATER_OR_EQUALS = ">=";
+ public static final String LESS = "<";
+ public static final String LESS_OR_EQUALS = "<=";
+ public static final String LIKE = "LIKE";
+ public static final String NOT = "NOT";
+ public static final String NOT_EQUALS = "!=";
+ public static final String OR = "OR";
+ public static final String BRACKET_CLOSE = ")";
+ public static final String BRACKET_OPEN = "(";
+ public static final String SQUARE_BRACKET_CLOSE = "]";
+ public static final String SQUARE_BRACKET_OPEN = "[";
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryParser.class);
+
+ protected Map<String, String> fieldAlias = new HashMap<String, String>();
+ protected Map<String, String> valueAlias = new HashMap<String, String>();
+
+ public WikittyQueryParser() {
+ }
+
+ static public WikittyQuery parse(String queryString) {
+ WikittyQueryParser parser = Parboiled.createParser(WikittyQueryParser.class);
+
+// ParsingResult<?> result = new RecoveringParseRunner(parser.start()).run(query);
+ ParsingResult<?> result = new ReportingParseRunner(parser.start()).run(queryString);
+
+ if (result.hasErrors() || !result.matched) {
+ System.out.println("\nParse Errors:\n" + ErrorUtils.printParseErrors(result));
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("\nParse Tree:\n" + ParseTreeUtils.printNodeTree(result) + '\n');
+ }
+// System.out.println("\nParse Tree:\n" + ParseTreeUtils.printNodeTree(result) + '\n');
+
+ Condition c = (Condition)result.resultValue;
+
+ WikittyQuery query = new WikittyQuery(c);
+ return query;
+ }
+
+ /**
+ * can be field, extension name or id element
+ * @param v
+ * @return
+ */
+ protected Element toElement(String v) {
+ Element result;
+ if (ID.equals(v)) {
+ result = new ElementId();
+ } else if (EXTENSION.equals(v)) {
+ result = new ElementExtension();
+ } else {
+ result = new ElementField(v);
+ }
+ return result;
+ }
+
+ /**
+ * Remove quote at beginning and ending of String in parameter if necessary
+ *
+ * <li>"toto" return toto
+ * <li>"toto return "toto
+ * <li> toto return toto"
+ * <li> to"to return to"to
+ *
+ * @param s
+ * @return
+ */
+ protected String removeQuote(String s) {
+ String result = s;
+ if (StringUtils.startsWith(s, LITERAL_OPEN)
+ && StringUtils.startsWith(s, LITERAL_CLOSE)) {
+ result = StringUtils.substring(s, 1, -1);
+ }
+ return result;
+ }
+
+ Rule start() {
+ return Sequence(or(), EOI);
+ }
+
+ Rule or() {
+ return Sequence(and(), ZeroOrMore(space(), OR, space(), and(),
+ push(new Or((Condition)pop(1), (Condition)pop()))));
+ }
+
+ Rule and() {
+ return Sequence(term(), ZeroOrMore(
+ // when no AND or OR is used, AND is default
+ // don't change order of FirstOf, this order is important
+ FirstOf(Sequence(space(), AND, space()), Sequence(space(), TestNot(OR))),
+ term(),
+ push(new And((Condition)pop(1), (Condition)pop()))));
+ }
+
+ Rule term() {
+ return FirstOf(condition(), Parens());
+ }
+
+ Rule Parens() {
+ return Sequence(space(), BRACKET_OPEN, space(), or(), space(), BRACKET_CLOSE, space());
+ // FIXME
+ }
+
+ Rule condition() {
+ return FirstOf(
+ not(), isNull(), isNotNull(),
+ eq(), neq(), less(), lesseq(), greater(), greatereq(), like(), notlike(),
+ between(), containsAll(), containsOne(),
+ associated(), rTrue(), rFalse(), keyword()
+ );
+ }
+
+ Rule not() {
+ return Sequence(space(), NOT, space(), term(),
+ push(new Not((Condition)pop())));
+ }
+
+ /**
+ * gere eq, startsWith, endsWith, isNull
+ * @return
+ */
+ Rule isNull() {
+ return Sequence(field(), push(match()), space(), EQUALS, space(), IgnoreCase(NULL),
+ push(new Null(toElement(pop().toString()))));
+ }
+
+ /**
+ * gere eq, isNull
+ * @return
+ */
+ Rule isNotNull() {
+ return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), IgnoreCase(NULL),
+ push(new NotNull(toElement(pop().toString()))));
+ }
+
+ /**
+ * gere eq, startsWith, endsWith, isNull
+ * @return
+ */
+ Rule eq() {
+ return Sequence(field(), push(match()), space(), EQUALS, space(), value(),
+ push(new Equals(toElement(pop().toString()), removeQuote(match()))));
+ }
+
+ /**
+ * gere eq, isNull
+ * @return
+ */
+ Rule neq() {
+ return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), value(),
+ push(new NotEquals(toElement(pop().toString()), removeQuote(match()))));
+ }
+
+ Rule less() {
+ return Sequence(field(), push(match()), space(), LESS, space(), value(),
+ push(new Less(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule lesseq() {
+ return Sequence(field(), push(match()), space(), LESS_OR_EQUALS, space(), value(),
+ push(new LessOrEquals(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule greater() {
+ return Sequence(field(), push(match()), space(), GREATER, space(), value(),
+ push(new Greater(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule greatereq() {
+ return Sequence(field(), push(match()), space(), GREATER_OR_EQUALS, space(), value(),
+ push(new GreaterOrEquals(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule like() {
+ return Sequence(field(), push(match()), space(), LIKE, space(), value(),
+ push(new Like(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule notlike() {
+ return Sequence(field(), push(match()), space(), UNLIKE, space(), value(),
+ push(new Unlike(toElement(pop().toString()), removeQuote(match()))));
+ }
+ Rule between() {
+ return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(),
+ value(), push(removeQuote(match())), space(), TO, space(),
+ value(), push(removeQuote(match())), space(), SQUARE_BRACKET_CLOSE,
+ push(new Between(toElement(pop(2).toString()), pop(1).toString(), pop().toString())));
+ }
+ Rule containsAll() {
+ Var<List<String>> elems = new Var<List<String>>(new LinkedList<String>());
+ return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(),
+ value(), elems.get().add(removeQuote(match())), space(), ZeroOrMore(COMMA, space(),
+ value(), elems.get().add(removeQuote(match())), space()), SQUARE_BRACKET_CLOSE,
+ push(new ContainsAll(toElement(pop().toString()), elems.get())));
+ }
+ Rule containsOne() {
+ Var<List<String>> elems = new Var<List<String>>(new LinkedList<String>());
+ return Sequence(field(), push(match()), space(), EQUALS, space(), CURLY_BRACKET_OPEN, space(),
+ value(), elems.get().add(removeQuote(match())), space(), ZeroOrMore(COMMA, space(),
+ value(), elems.get().add(removeQuote(match())), space()), CURLY_BRACKET_CLOSE,
+ 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())));
+ }
+ Rule keyword() {
+ return Sequence(value(), push(new Keyword(removeQuote(match()))));
+ }
+
+ Rule field() {
+ return OneOrMore(FirstOf(CharRange('0', '9'), CharRange('a', 'z'), CharRange('A', 'Z'), AnyOf("_.*")));
+ }
+
+ Rule rTrue() {
+ return Sequence(IgnoreCase(TRUE), push(new True()));
+ }
+
+ Rule rFalse() {
+ return Sequence(IgnoreCase(FALSE), push(new False()));
+ }
+
+ Rule value() {
+ return FirstOf(IgnoreCase(TRUE), IgnoreCase(FALSE), IgnoreCase(NULL), field(), StringLiteral());
+ }
+
+ Rule StringLiteral() {
+ return Sequence(
+ LITERAL_OPEN,
+ ZeroOrMore(
+ FirstOf(
+ Escape(),
+ Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_OPEN+LITERAL_CLOSE)), ANY)
+ )
+ ).suppressSubnodes(),
+ LITERAL_CLOSE
+ );
+ }
+
+ Rule Escape() {
+ return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_OPEN+LITERAL_CLOSE), OctalEscape(), UnicodeEscape()));
+ }
+
+ Rule OctalEscape() {
+ return FirstOf(
+ Sequence(CharRange('0', '3'), CharRange('0', '7'), CharRange('0', '7')),
+ Sequence(CharRange('0', '7'), CharRange('0', '7')),
+ CharRange('0', '7')
+ );
+ }
+
+ Rule UnicodeEscape() {
+ return Sequence(OneOrMore('u'), HexDigit(), HexDigit(), HexDigit(), HexDigit());
+ }
+
+ Rule HexDigit() {
+ return FirstOf(CharRange('a', 'f'), CharRange('A', 'F'), CharRange('0', '9'));
+ }
+
+ Rule space() {
+ return ZeroOrMore(AnyOf(" \t\f"));
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,343 @@
+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;
+import java.util.Iterator;
+import java.util.List;
+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;
+
+/**
+ * Represente un resultat de requete {@link WikittyQuery}
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQueryResult<T> implements Serializable, Iterable<T> {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryResult.class);
+
+ private static final long serialVersionUID = 1L;
+
+ /** nom du critere qui a ete uitilise (peut-etre null) si le critete n'avait pas de nom */
+ protected String queryName;
+ /** indice element in global search result */
+ protected int first;
+ /** total number of result if we call the query for all possible result */
+ protected int totalResult;
+ /** query really executed (internal representation depend of search engine used */
+ protected String queryString;
+ /** list of result in the wanted interval */
+ protected List<T> results;
+ /** facet asked or null if no facet */
+ protected Map<String, List<FacetTopic>> facets;
+ /** facet asked of null if no facet, FacetTopic are put in map with key topic name,
+ * To use this variable, you must used getter, because, this variable is
+ * lazy loaded from facets variable.
+ */
+ protected Map<String, Map<String, FacetTopic>> facetsAsMap = null;
+
+
+ /**
+ * Init paged result.
+ *
+ * we don't initialize securityToken
+ *
+ * @param first indice element in global search result
+ * @param totalResult total number of result if we call the query for all possible result
+ * @param queryString query really executed
+ * @param facets facet asked or null if no facet
+ * @param results list of result in the wanted interval
+ */
+ public WikittyQueryResult(String queryName,
+ int first, int totalResult, String queryString,
+ Map<String, List<FacetTopic>> facets, List<T> results) {
+ this.queryName = queryName;
+ this.first = first;
+ this.totalResult = totalResult;
+ this.queryString = queryString;
+ this.facets = facets;
+ 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;
+ }
+
+ public int getFirst() {
+ return first;
+ }
+
+ public int getTotalResult() {
+ return totalResult;
+ }
+
+ public String getQueryString() {
+ return queryString;
+ }
+
+ /**
+ * Return name of all facet used in query.
+ *
+ * @return result's facets names
+ */
+ public Collection<String> getFacetNames() {
+ Collection<String> result = facets.keySet();
+ return result;
+ }
+
+ /**
+ * Return all topic for the specified facet.
+ *
+ * @param facetName name of the wanted facet
+ * @return facet's topics
+ */
+ public List<FacetTopic> getTopic(String facetName) {
+ List<FacetTopic> result = facets.get(facetName);
+ return result;
+ }
+
+ /**
+ * Return topic for the specified facet and topic name.
+ *
+ * @param facetName name of the wanted facet
+ * @param topicName name of the wanted topic
+ * @return topic
+ */
+ public FacetTopic getTopic(String facetName, String topicName) {
+ FacetTopic result = getFacetsAsMap().get(facetName).get(topicName);
+ return result;
+ }
+
+ /**
+ * Return topic count for the specified facet and topic name. If facet or
+ * topic don't exist, return 0.
+ *
+ * @param facetName name of the wanted facet
+ * @param topicName name of the wanted topic
+ * @return topic count or 0
+ */
+ public int getTopicCount(String facetName, String topicName) {
+ int result = 0;
+ if (getFacetsAsMap() != null) {
+ Map<String, FacetTopic> topics = getFacetsAsMap().get(facetName);
+ if (topics != null) {
+ FacetTopic topic = topics.get(topicName);
+ if (topic != null) {
+ result = topic.getCount();
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get map represent facets.
+ *
+ * @return all facets
+ */
+ public Map<String, List<FacetTopic>> getFacets() {
+ return facets;
+ }
+
+ public Map<String, Map<String, FacetTopic>> getFacetsAsMap() {
+ if (facetsAsMap == null && facets != null) {
+ // use local variable to prevent multi-thread problem (multiple add)
+ Map<String, Map<String, FacetTopic>> localFacetsAsMap =
+ new HashMap<String, Map<String, FacetTopic>>();
+ for (Map.Entry<String, List<FacetTopic>> e : getFacets().entrySet()) {
+ Map<String, FacetTopic> topics = new HashMap<String, FacetTopic>();
+ localFacetsAsMap.put(e.getKey(), topics);
+ for (FacetTopic t : e.getValue()) {
+ topics.put(t.getTopicName(), t);
+ }
+ }
+ facetsAsMap = localFacetsAsMap;
+ }
+ return facetsAsMap;
+ }
+
+
+
+ /**
+ * Return the first element in result
+ *
+ * Can throw an exception if no element available
+ * @return first element
+ */
+ public T peek() {
+ T result = get(0);
+ return result;
+ }
+
+ /**
+ * Return element at index.
+ *
+ * @param i index
+ * @return element at index
+ */
+ public T get(int i) {
+ T result = results.get(i);
+ return result;
+ }
+
+ /**
+ * Return unmodifiable list of all result.
+ *
+ * @return all results
+ */
+ public List<T> getAll() {
+ return results;
+ }
+
+ /**
+ * Return the number of result in this object.
+ *
+ * @return result number
+ */
+ public int size() {
+ int result = results.size();
+ return result;
+ }
+
+ /**
+ * Iterate on result, same as getAll().iterator().
+ * @return
+ */
+ public Iterator<T> iterator() {
+ Iterator<T> result = getAll().iterator();
+ return result;
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResultTreeNode.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResultTreeNode.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResultTreeNode.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,238 @@
+package org.nuiton.wikitty.query;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.tree.DefaultMutableTreeNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Represente le resultat de recherche sur un arbre.
+ * L'iteration se fait en profondeur
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQueryResultTreeNode<T extends Serializable> extends DefaultMutableTreeNode implements Iterable<WikittyQueryResultTreeNode<T>> {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryResultTreeNode.class);
+
+ private static final long serialVersionUID = 31L;
+
+ /** optional user object */
+ protected T object;
+
+ /**
+ * Visitor for TreeNodeResult
+ * @param <T>
+ */
+ static public interface Visitor<T extends Serializable> {
+ /**
+ *
+ * @param node node to visit
+ * @return if true visit this element
+ */
+ public boolean visitEnter(WikittyQueryResultTreeNode<T> node);
+ /**
+ *
+ * @param node node visited
+ * @return if true visit next element
+ */
+ public boolean visitLeave(WikittyQueryResultTreeNode<T> node);
+ }
+
+ protected int attCount;
+
+ /**
+ *
+ * @param object L'id, le wikitty ou le BusinessEntity suivant le type de T
+ * @param attCount le nombre d'attachment pour ce noeud (avec les sous noeud)
+ */
+ public WikittyQueryResultTreeNode(T object, int attCount) {
+ this(object);
+ this.attCount = attCount;
+ }
+
+ /**
+ * sletellier 20110516 : override all methods using userObject,
+ * because this one is transient and getter and setters are not used
+ */
+
+ /**
+ * Creates a tree node with no parent, no children, but which allows
+ * children, and initializes it with the specified user object.
+ *
+ * @param userObject an Object provided by the user that constitutes
+ * the node's data
+ */
+ public WikittyQueryResultTreeNode(T userObject) {
+ this(userObject, true);
+ }
+
+ /**
+ * Creates a tree node with no parent, no children, initialized with
+ * the specified user object, and that allows children only if
+ * specified.
+ *
+ * @param userObject an Object provided by the user that constitutes
+ * the node's data
+ * @param allowsChildren if true, the node is allowed to have child
+ * nodes -- otherwise, it is always a leaf node
+ */
+ public WikittyQueryResultTreeNode(T userObject, boolean allowsChildren) {
+ super(userObject, allowsChildren);
+ this.object = userObject;
+ }
+
+ /**
+ * Sets the user object for this node to <code>userObject</code>.
+ *
+ * @param userObject the Object that constitutes this node's
+ * user-specified data
+ * @see #getUserObject
+ * @see #toString
+ */
+ public void setUserObject(T userObject) {
+ super.setUserObject(userObject);
+ this.object = userObject;
+ }
+
+ /**
+ * Returns this node's user object.
+ *
+ * @return the Object stored at this node by the user
+ * @see #toString
+ */
+ @Override
+ public T getUserObject() {
+ return object;
+ }
+
+ /**
+ * Returns the result of sending <code>toString()</code> to this node's
+ * user object, or null if this node has no user object.
+ *
+ * @see #getUserObject
+ */
+ @Override
+ public String toString() {
+ T userObject = getUserObject();
+ if (userObject == null) {
+ return null;
+ } else {
+ return userObject.toString();
+ }
+ }
+
+ /**
+ * Visite en profondeur de l'arbre, il est possible d'arreter la visite
+ * soit en entrant dans le noeud soit en sortant du noeud, si respectivement
+ * visitEnter ou visitLeave retourne false.
+ *
+ * @param visitor
+ */
+ public boolean acceptVisitor(Visitor<T> visitor) {
+ if (visitor.visitEnter(this)) {
+ for (Enumeration e = children(); e.hasMoreElements();) {
+ WikittyQueryResultTreeNode<T> child = (WikittyQueryResultTreeNode<T>) e.nextElement();
+ if (!child.acceptVisitor(visitor)) {
+ break;
+ }
+ }
+ }
+ boolean result = visitor.visitLeave(this);
+ return result;
+ }
+
+ /**
+ * Get direct children of this node
+ *
+ * @return
+ */
+ public List<WikittyQueryResultTreeNode<T>> getChildren() {
+ List<WikittyQueryResultTreeNode<T>> result;
+ if (children == null) {
+ result = Collections.emptyList();
+ } else {
+ result = Collections.unmodifiableList(
+ new ArrayList<WikittyQueryResultTreeNode<T>>(children));
+ }
+ return result;
+ }
+
+ /**
+ * Iterate on all children or sub-children, in depth first
+ * @return
+ */
+ @Override
+ public Iterator<WikittyQueryResultTreeNode<T>> iterator() {
+ Iterator<WikittyQueryResultTreeNode<T>> result = new Iterator<WikittyQueryResultTreeNode<T>>() {
+
+ protected Enumeration enumDepth = WikittyQueryResultTreeNode.this.depthFirstEnumeration();
+
+ @Override
+ public boolean hasNext() {
+ return enumDepth.hasMoreElements();
+ }
+
+ @Override
+ public WikittyQueryResultTreeNode<T> next() {
+ WikittyQueryResultTreeNode<T> result = (WikittyQueryResultTreeNode<T>)enumDepth.nextElement();
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+ };
+ return result;
+ }
+
+ /**
+ * Retourne l'objet associe avec ce noeud (id, wikitty ou BusinessEntity)
+ * @return l'objet associe avec ce noeud (id, wikitty ou BusinessEntity)
+ */
+ public T getObject() {
+ return getUserObject();
+ }
+
+ /**
+ * Return TreeNodeResult where object in TreeNodeResult equals child in
+ * parameter
+ * @param child
+ * @return
+ */
+ public WikittyQueryResultTreeNode<T> getChild(T child) {
+ WikittyQueryResultTreeNode<T> result = null;
+ if (child != null) {
+ for (Enumeration e = children(); e.hasMoreElements();) {
+ WikittyQueryResultTreeNode<T> r = (WikittyQueryResultTreeNode<T>) e.nextElement();
+ if (child.equals(r.getObject())) {
+ result = r;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Retourn le nombre d'attachment pour ce noeud (avec les sous noeud)
+ * @return
+ */
+ public int getAttCount() {
+ return attCount;
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitor.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,280 @@
+package org.nuiton.wikitty.query;
+
+import java.lang.reflect.Method;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.query.conditions.And;
+import org.nuiton.wikitty.query.conditions.Join;
+import org.nuiton.wikitty.query.conditions.Between;
+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.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;
+
+/**
+ * Permet d'implanter un visiteur de Query ou Condition. Une fois que vous avez
+ * cree votre propre Visiteur pour l'utiliser
+ *
+ * <pre>
+ * WikittyQuery q = ...;
+ * MyVisitor v = new MyVisitor();
+ * q.accept(v);
+ * v.getXXXX()
+ * </pre>
+ *
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class WikittyQueryVisitor {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryVisitor.class);
+
+ /**
+ * 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(WikittyQuery 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(WikittyQuery 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(And o);
+ /**
+ * True if we want visit others elements, otherwize false. If false
+ * visitMiddle for this node is never called
+ * @param o
+ * @return True if we want visit others elements, otherwize false
+ */
+ abstract public boolean visitMiddle(And 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(And o, boolean enterOrMiddleResult);
+ /**
+ * True if we want visit sub-element, otherwize false
+ * visitMiddle for this node is never called
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
+ abstract public boolean visitEnter(Or o);
+ /**
+ * True if we want visit others elements, otherwize false
+ * @param o
+ * @return True if we want visit others elements, otherwize false
+ */
+ abstract public boolean visitMiddle(Or 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(Or 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(Join 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(Join 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
+ * arguement
+ *
+ * @param o
+ * @param enterOrMiddleResult result returned by visitEnter method
+ */
+ abstract public void visitLeave(Not o, boolean enterOrMiddleResult);
+
+ abstract public void visit(Between o);
+ /**
+ * Can be used for id, extension or field
+ * @param o
+ */
+ abstract public void visit(ContainsAll o);
+ /**
+ * Can be used for id, extension or field
+ * @param o
+ */
+ abstract public void visit(ContainsOne o);
+ /**
+ * Can be used for id, extension or field
+ * @param o
+ */
+ abstract public void visit(Equals o);
+ /**
+ * Can be used for id, extension or field
+ * @param o
+ */
+ abstract public void visit(NotEquals o);
+ abstract public void visit(False o);
+ abstract public void visit(True o);
+ abstract public void visit(Greater o);
+ abstract public void visit(GreaterOrEquals o);
+ abstract public void visit(Keyword o);
+ abstract public void visit(Less o);
+ abstract public void visit(LessOrEquals o);
+ abstract public void visit(Like o);
+ abstract public void visit(Unlike o);
+ abstract public void visit(Null o);
+ abstract public void visit(NotNull o);
+
+ abstract public void defaultVisit(Object o);
+ /**
+ * True if we want visit sub-element, otherwize false
+ * @param o
+ * @return True if we want visit sub-element, otherwize false
+ */
+ abstract public boolean defaultVisitEnter(Object o);
+ /**
+ * True if we want visit others elements, otherwize false
+ * visitMiddle for this node is never called
+ * @param o
+ * @return True if we want visit others elements, otherwize false
+ */
+ abstract public boolean defaultVisitMiddle(Object 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 defaultVisitLeave(Object o, boolean enterOrMiddleResult);
+
+ public void visit(Object object) {
+ try {
+ Method downPolymorphic = this.getClass().getMethod("visit",
+ new Class[] { object.getClass() });
+
+ if (downPolymorphic == null) {
+ defaultVisit(object);
+ } else {
+ try {
+ downPolymorphic.invoke(this, new Object[] {object});
+ } catch (Exception eee) {
+ throw new WikittyException("Error during visitor call", eee);
+ }
+ }
+ }
+ catch (NoSuchMethodException eee) {
+ log.debug("Can't call specific visit method, call defaultVisit", eee);
+ this.defaultVisit(object);
+ }
+ }
+ public boolean visitEnter(Object object) {
+ boolean result;
+ try {
+ Method downPolymorphic = this.getClass().getMethod("visitEnter",
+ new Class[] { object.getClass() });
+
+ if (downPolymorphic == null) {
+ result = defaultVisitEnter(object);
+ } else {
+ try {
+ result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
+ } catch (Exception eee) {
+ throw new WikittyException("Error during visitor call", eee);
+ }
+ }
+ }
+ catch (NoSuchMethodException eee) {
+ log.debug("Can't call specific visit method, call defaultVisitEnter", eee);
+ result = defaultVisitEnter(object);
+ }
+ return result;
+ }
+
+ public boolean visitMiddle(Object object) {
+ boolean result;
+ try {
+ Method downPolymorphic = this.getClass().getMethod("visitMiddle",
+ new Class[] { object.getClass() });
+
+ if (downPolymorphic == null) {
+ result = defaultVisitMiddle(object);
+ } else {
+ try {
+ result = (Boolean)downPolymorphic.invoke(this, new Object[] {object});
+ } catch (Exception eee) {
+ throw new WikittyException("Error during visitor call", eee);
+ }
+ }
+ }
+ catch (NoSuchMethodException eee) {
+ log.debug("Can't call specific visit method, call defaultVisitMiddle", eee);
+ result = defaultVisitMiddle(object);
+ }
+ return result;
+ }
+
+ public void visitLeave(Object object, boolean enterOrMiddleResult) {
+ try {
+ Method downPolymorphic = this.getClass().getMethod("visitLeave",
+ new Class[] { object.getClass(), Boolean.TYPE });
+
+ if (downPolymorphic == null) {
+ defaultVisitLeave(object, enterOrMiddleResult);
+ } else {
+ try {
+ downPolymorphic.invoke(this, new Object[] {object, enterOrMiddleResult});
+ } catch (Exception eee) {
+ throw new WikittyException("Error during visitor call", eee);
+ }
+ }
+ }
+ catch (NoSuchMethodException eee) {
+ log.debug("Can't call specific visit method, call defaultVisitLeave", eee);
+ this.defaultVisitLeave(object, enterOrMiddleResult);
+ }
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,241 @@
+package org.nuiton.wikitty.query;
+
+import java.util.ArrayList;
+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.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;
+
+/**
+ * This visitor make a deep copy of WikittyQuery.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ * @see {@link WikittyQuery#copy()}
+ */
+public class WikittyQueryVisitorCopy extends WikittyQueryVisitor {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryVisitorCopy.class);
+
+ protected WikittyQueryMaker queryMaker;
+
+ protected WikittyQueryMaker getQueryMaker() {
+ if (queryMaker == null) {
+ queryMaker = new WikittyQueryMaker();
+ }
+ return queryMaker;
+ }
+
+ public WikittyQuery getQuery() {
+ WikittyQuery result = getQueryMaker().getQuery();
+ return result;
+ }
+
+ @Override
+ public boolean visitEnter(WikittyQuery o) {
+ WikittyQuery q = getQuery();
+ q.setFacetField(new ArrayList<String>(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()));
+
+ for (Condition c : o.getFacetCriteria()) {
+ WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy();
+ c.accept(v);
+ Condition facetCriteria = v.getQueryMaker().getCondition();
+ q.addFacetCriteria(facetCriteria);
+ }
+ return true;
+ }
+
+ @Override
+ public void visitLeave(WikittyQuery o, boolean enterResult) {
+ }
+
+ @Override
+ public boolean visitEnter(And o) {
+ getQueryMaker().and();
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(And o) {
+ return true;
+ }
+
+ @Override
+ public void visitLeave(And o, boolean enterResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
+ public boolean visitEnter(Or o) {
+ getQueryMaker().or();
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(Or o) {
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Or o, boolean enterResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
+ public boolean visitEnter(Join o) {
+ getQueryMaker().join(o.getElement());
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Join o, boolean enterResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
+ public boolean visitEnter(Not o) {
+ getQueryMaker().not();
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Not o, boolean enterResult) {
+ getQueryMaker().close();
+ }
+
+ @Override
+ public void visit(Between o) {
+ getQueryMaker().bw(o.getElement(), o.getMin(), o.getMax());
+ }
+
+ @Override
+ public void visit(ContainsAll o) {
+ getQueryMaker().containsAll(o.getElement(), new ArrayList<String>(o.getValues()));
+ }
+
+ @Override
+ public void visit(ContainsOne o) {
+ getQueryMaker().containsOne(o.getElement(), new ArrayList<String>(o.getValues()));
+ }
+
+ @Override
+ public void visit(Equals o) {
+ getQueryMaker().eq(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(False o) {
+ getQueryMaker().rFalse();
+ }
+
+ @Override
+ public void visit(Greater o) {
+ getQueryMaker().gt(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(GreaterOrEquals o) {
+ getQueryMaker().ge(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(Keyword o) {
+ getQueryMaker().keyword(o.getValue());
+ }
+
+ @Override
+ public void visit(Less o) {
+ getQueryMaker().lt(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(LessOrEquals o) {
+ getQueryMaker().le(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(Like o) {
+ getQueryMaker().like(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(NotEquals o) {
+ getQueryMaker().ne(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void visit(Null o) {
+ getQueryMaker().isNull(o.getElement());
+ }
+
+ @Override
+ public void visit(NotNull o) {
+ getQueryMaker().isNotNull(o.getElement());
+ }
+
+ @Override
+ public void visit(True o) {
+ getQueryMaker().rTrue();
+ }
+
+ @Override
+ public void visit(Unlike o) {
+ getQueryMaker().unlike(o.getElement(), o.getValue());
+ }
+
+ @Override
+ public void defaultVisit(Object o) {
+ throw new UnsupportedOperationException(
+ "Not supported (" + o.getClass().getSimpleName() + ").");
+ }
+
+ @Override
+ public boolean defaultVisitEnter(Object o) {
+ throw new UnsupportedOperationException(
+ "Not supported (" + o.getClass().getSimpleName() + ").");
+ }
+
+ @Override
+ public boolean defaultVisitMiddle(Object o) {
+ throw new UnsupportedOperationException(
+ "Not supported (" + o.getClass().getSimpleName() + ").");
+ }
+
+ @Override
+ public void defaultVisitLeave(Object o, boolean enterResult) {
+ throw new UnsupportedOperationException(
+ "Not supported (" + o.getClass().getSimpleName() + ").");
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,263 @@
+package org.nuiton.wikitty.query;
+
+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.Between;
+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.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;
+
+/**
+ * Genere un texte representant une query tel qu'un homme pourrait l'ecrire
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQueryVisitorToString extends WikittyQueryVisitor {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryVisitorToString.class);
+
+ public String text = "";
+
+ public String getText() {
+ return text;
+ }
+ @Override
+ public boolean visitEnter(WikittyQuery o) {
+ text += o.getName() + "(";
+ return true;
+ }
+
+ @Override
+ public void visitLeave(WikittyQuery o, boolean enterResult) {
+ text += ")";
+ }
+
+ @Override
+ public boolean visitEnter(And o) {
+ text += WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(And o) {
+ text += " " + WikittyQueryParser.AND + " ";
+ return true;
+ }
+
+ @Override
+ public void visitLeave(And o, boolean enterResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
+ public boolean visitEnter(Or o) {
+ text += WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(Or o) {
+ text += " " + WikittyQueryParser.OR + " ";
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Or o, boolean enterResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
+ public boolean visitEnter(Join o) {
+ text += o.getElement().getValue() + WikittyQueryParser.JOIN + WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Join o, boolean enterResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
+ public boolean visitEnter(Not o) {
+ text += WikittyQueryParser.NOT + WikittyQueryParser.BRACKET_OPEN;
+ return true;
+ }
+
+ @Override
+ public void visitLeave(Not o, boolean enterResult) {
+ text += WikittyQueryParser.BRACKET_CLOSE;
+ }
+
+ @Override
+ public void visit(Between o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.EQUALS + WikittyQueryParser.SQUARE_BRACKET_OPEN
+ + WikittyQueryParser.LITERAL_OPEN
+ + o.getMin()
+ + WikittyQueryParser.LITERAL_CLOSE
+ + " " + WikittyQueryParser.TO + " "
+ + WikittyQueryParser.LITERAL_OPEN
+ + o.getMax()
+ + WikittyQueryParser.LITERAL_CLOSE
+ + WikittyQueryParser.SQUARE_BRACKET_CLOSE;
+ }
+
+ @Override
+ public void visit(ContainsAll o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.EQUALS + WikittyQueryParser.SQUARE_BRACKET_OPEN;
+ String sep = "";
+ for(String e : o.getValues()) {
+ text += sep + WikittyQueryParser.LITERAL_OPEN + e + WikittyQueryParser.LITERAL_CLOSE;
+ sep = WikittyQueryParser.COMMA;
+ }
+ text += WikittyQueryParser.SQUARE_BRACKET_CLOSE;
+ }
+
+ @Override
+ public void visit(ContainsOne o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.EQUALS + WikittyQueryParser.CURLY_BRACKET_CLOSE;
+ String sep = "";
+ for(String e : o.getValues()) {
+ text += sep + WikittyQueryParser.LITERAL_OPEN + e + WikittyQueryParser.LITERAL_CLOSE;
+ sep = WikittyQueryParser.COMMA;
+ }
+ text += WikittyQueryParser.CURLY_BRACKET_CLOSE;
+ }
+
+ @Override
+ public void visit(Equals o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.EQUALS + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(False o) {
+ text += WikittyQueryParser.FALSE;
+ }
+
+ @Override
+ public void visit(Greater o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.GREATER + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(GreaterOrEquals o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.GREATER_OR_EQUALS + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(Keyword o) {
+ text += WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(Less o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.LESS + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(LessOrEquals o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.LESS_OR_EQUALS + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(Like o) {
+ text += o.getElement().getValue()
+ + " " + WikittyQueryParser.LIKE + " " + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(NotEquals o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.NOT_EQUALS + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void visit(Null o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.EQUALS + WikittyQueryParser.NULL;
+ }
+
+ @Override
+ public void visit(NotNull o) {
+ text += o.getElement().getValue()
+ + WikittyQueryParser.NOT_EQUALS + WikittyQueryParser.NULL;
+ }
+
+ @Override
+ public void visit(True o) {
+ text += WikittyQueryParser.TRUE;
+ }
+
+ @Override
+ public void visit(Unlike o) {
+ text += o.getElement().getValue()
+ + " " + WikittyQueryParser.UNLIKE + " " + WikittyQueryParser.LITERAL_OPEN
+ + o.getValue()
+ + WikittyQueryParser.LITERAL_CLOSE;
+ }
+
+ @Override
+ public void defaultVisit(Object o) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
+ }
+
+ @Override
+ public boolean defaultVisitEnter(Object o) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
+ }
+
+ @Override
+ public boolean defaultVisitMiddle(Object o) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
+ }
+
+ @Override
+ public void defaultVisitLeave(Object o, boolean enterResult) {
+ throw new UnsupportedOperationException("Not supported:" + o.getClass());
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/And.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,42 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * And operator is used to build conjunctive restriction for request on content.
+ * It take at least 2 args. <br>
+ * <br>
+ * For example, use:
+ * <ul>
+ * <li>{@link WikittyQueryMaker}.and( restriction1, restriction2 )</li>
+ * <li>{@link WikittyQueryMaker}.and( restriction1, restriction2, restriction3 )</li>
+ * <li>{@link WikittyQueryMaker}.and( my_JavaUtilList_Of_Restriction_Witch_Size_Is_Upper_Than2 )</li>
+ * </ul>
+
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class And extends ConditionNary{
+
+ private static final long serialVersionUID = 1L;
+
+ public And(Condition ... c) {
+ super(Arrays.asList(c));
+ }
+
+ /**
+ * Constructor with all parameters initialized, parameter list is copied
+ * internaly
+ *
+ * @param restrictions
+ */
+ public And(List<Condition> restrictions) {
+ super(restrictions);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Between.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,32 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Between operator is used to build restriction containing "min < element
+ * < max" where element could be a Integer, a Float or a Date. <br>
+ * <br>
+ * For example, use: RestrictionHelper.between( myElement , "15.5" , "22.5" )
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Between extends TerminalTernaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param min
+ * @param max
+ */
+ public Between(Element element, String min, String max) {
+ super(element, min, max);
+ }
+
+}
\ No newline at end of file
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Condition.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,119 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.io.Serializable;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.query.WikittyQueryVisitor;
+import org.nuiton.wikitty.query.WikittyQueryVisitorToString;
+
+/**
+ * This element is a symbolic interface implemented by all operators used to
+ * request contents (And, Or, Not, Equals, NotEquals, EndsWith, ...).
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class Condition implements Serializable {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Default constructor
+ */
+ public Condition() {
+ super();
+ }
+
+ /**
+ * For non terminal condition this method add subCondition.
+ * For terminal this method must return an exception
+ *
+ * @param c
+ */
+ public void addCondition(Condition c) {
+ throw new WikittyException("Add condition is not allowed in this condition type");
+ }
+
+ public void accept(WikittyQueryVisitor visitor) {
+ visitor.visit(this);
+ }
+
+
+// /**
+// * Constructor with all parameters initialized
+// *
+// * @param name
+// */
+// public Restriction(RestrictionName name) {
+// this();
+// this.name = name;
+// }
+
+// /**
+// * Return name
+// *
+// * @return
+// */
+// public RestrictionName getName() {
+// return name;
+// }
+//
+// /**
+// * Set a value to parameter name.
+// *
+// * @param name
+// */
+// public void setName(RestrictionName name) {
+// this.name = name;
+// }
+
+ /**
+ * Equality test based on class equality
+ *
+ * @param other Value to compare
+ */
+ @Override
+ public boolean equals(Object other) {
+ boolean result;
+ if (other == null) {
+ result = false;
+ } else if (this == other) {
+ result = true;
+ }else if (this.getClass().equals(other.getClass())) {
+ result = equalsDeep(other);
+ } else {
+ return false;
+ }
+ return result;
+ }
+
+ /**
+ * Sub class must override this method to check if internal state is same
+ * in two object (this and other)
+ *
+ * @param other other parameter is same type that this object
+ * @return true if other and this are equals
+ */
+ abstract boolean equalsDeep(Object other);
+
+ @Override
+ public int hashCode() {
+ // equals use objects that are not constant through time
+ // then, unable to create hashCode from those objects
+ // returning a constant hash-code
+ return this.getClass().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ WikittyQueryVisitorToString v = new WikittyQueryVisitorToString();
+ accept(v);
+ String result = v.getText();
+ return result;
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionNary.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,87 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.query.WikittyQueryVisitor;
+
+/**
+ * Cette classe est la classe parente de tous les objets ayant en interne
+ * une liste de restrictions non terminale (ex: And, Or)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class ConditionNary extends Condition {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ConditionNary.class);
+
+ protected List<Condition> conditions;
+
+ public ConditionNary() {
+ }
+
+ /**
+ * Initialyse condition with list passed in argument, parameter list is
+ * copied internaly to prevent extern modification
+ *
+ * @param c
+ */
+ public ConditionNary(List<Condition> c) {
+ this.conditions = new LinkedList<Condition>(c);
+ }
+
+ @Override
+ public void accept(WikittyQueryVisitor visitor) {
+ boolean walk = visitor.visitEnter(this);
+ if (walk && conditions != null) {
+ boolean notFirst = false;
+ for (Condition r : conditions) {
+ if (notFirst) {
+ walk = visitor.visitMiddle(this);
+ if (!walk) {
+ // le visiteur demande l'arret de la visite
+ break;
+ }
+ } else {
+ notFirst = true;
+ }
+ r.accept(visitor);
+ }
+ }
+ visitor.visitLeave(this, walk);
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ ConditionNary op = (ConditionNary)other;
+ boolean result = ObjectUtils.equals(
+ this.getConditions(), op.getConditions());
+ return result;
+ }
+
+ /**
+ * Return Restriction list. This list is never null, but can be empty
+ * @return
+ */
+ public List<Condition> getConditions() {
+ if (conditions == null) {
+ conditions = new LinkedList<Condition>();
+ }
+ return conditions;
+ }
+
+ @Override
+ public void addCondition(Condition c) {
+ getConditions().add(c);
+ }
+
+
+}
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ConditionUnary.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,63 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.query.WikittyQueryVisitor;
+
+/**
+ * Cette classe est la classe parente de tous les objets ayant en interne
+ * une restriction non terminale (ex: Not)
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class ConditionUnary extends Condition {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ConditionUnary.class);
+
+ protected Condition subCondition;
+
+ public ConditionUnary() {
+ }
+
+ public ConditionUnary(Condition restriction) {
+ this.subCondition = restriction;
+ }
+
+ @Override
+ public void addCondition(Condition c) {
+ if (subCondition == null) {
+ this.subCondition = c;
+ } else {
+ throw new WikittyException("ConditionUnary ("+getClass().getSimpleName()+") can't have more than one condition");
+ }
+ }
+
+ @Override
+ public void accept(WikittyQueryVisitor visitor) {
+ boolean walk = visitor.visitEnter(this);
+ if (walk && subCondition != null) {
+ subCondition.accept(visitor);
+ }
+ visitor.visitLeave(this, walk);
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ ConditionUnary op = (ConditionUnary)other;
+ boolean result = ObjectUtils.equals(
+ this.getSubCondition(), op.getSubCondition());
+ return result;
+ }
+
+ public Condition getSubCondition() {
+ return subCondition;
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsAll.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,41 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.Collection;
+
+/**
+ * ContainsAll permet de definir qu'un champs doit avoir toutes une serie de
+ * valeur en meme temps. Cette condition ne s'applique donc qu'a des champs de
+ * type Collection (sauf si on fait un ContainsAll avec une seul valeur, ce qui
+ * revient a faire un {@link Equals})
+ * <p>
+ * For example, use:
+ * <ul>
+ * <li>RestrictionHelper.containsAll( myElement , "value1" )</li>
+ * <li>RestrictionHelper.containsAll( myElement , "value1", "value2", ... )</li>
+ * <li>RestrictionHelper.containsAll( myElement ,
+ * a_list_containing_at_least_one_string )</li>
+ * </ul>
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ContainsAll extends TerminalBinaryListOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param value
+ */
+ public ContainsAll(Element element, Collection<String> values) {
+ super(element, values);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ContainsOne.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,65 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id: ContainsOne.java -1 $
+ * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-api/src/main/java/org.nuito… $
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.Collection;
+
+/**
+ * ContainsOne permet de definir qu'un champs doit avoir au moins une des valeurs
+ * d'une serie de valeurs. Si cette condition est utilisee avec une seul valeur,
+ * cela revient a faire un {@link Equals})
+ * <p>
+ * For example, use:
+ * <ul>
+ * <li>RestrictionHelper.containsOne( myElement , "value1" )</li>
+ * <li>RestrictionHelper.containsOne( myElement , "value1", "value2", ... )</li>
+ * <li>RestrictionHelper.containsOne( myElement ,
+ * a_list_containing_at_least_one_string )</li>
+ * </ul>
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ContainsOne extends TerminalBinaryListOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param value
+ */
+ public ContainsOne(Element element, Collection<String> values) {
+ super(element, values);
+ }
+
+
+}
\ No newline at end of file
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Element.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,65 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.io.Serializable;
+import org.apache.commons.lang.ObjectUtils;
+
+/**
+ * Class mere qui determine sur quoi porte une condition. Les classes filles
+ * possible sont par exemple: ElementField, ElementId, ElementExtension
+ *
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Element implements Serializable {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ protected String value;
+
+ public Element() {
+ }
+
+ public Element(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ boolean result;
+
+ if (this == obj) {
+ result = true;
+ } else if (obj == null) {
+ result = false;
+ } else if (ObjectUtils.equals(this.getClass(), obj.getClass())) {
+ Element e = (Element)obj;
+ result = ObjectUtils.equals(this.getValue(), e.getValue());
+ } else {
+ result = false;
+ }
+ return result;
+ }
+
+ @Override
+ public int hashCode() {
+ // a priori, pas de probleme pour utiliser value pour la hash car pas
+ // moyen de changer sa valeur, une fois l'objet cree
+ return ObjectUtils.hashCode(this.getValue());
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+}
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementExtension.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.query.WikittyQueryParser;
+
+/**
+ * Un element qui represente les extensions
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ElementExtension extends Element {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ElementExtension.class);
+
+ private static final long serialVersionUID = 1L;
+
+ public ElementExtension() {
+ super(WikittyQueryParser.EXTENSION);
+ }
+
+
+}
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,35 @@
+package org.nuiton.wikitty.query.conditions;
+
+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
+ * extname.fieldname. Mais extname ou fieldname ou les deux peuvent etre
+ * remplace par des *. Au lieu de faire '*.*' il est preferable d'utiliser
+ * {@link #ALL_FIELD}
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ElementField extends Element {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ElementField.class);
+
+ 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);
+ }
+
+
+}
Added: 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 (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementId.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.query.WikittyQueryParser;
+
+/**
+ * Element qui represente l'Id
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ElementId extends Element {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ElementId.class);
+
+ private static final long serialVersionUID = 1L;
+
+ public ElementId() {
+ super(WikittyQueryParser.ID);
+ }
+
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Equals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,56 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id: Equals.java 1136 2011-08-12 14:24:03Z tchemit $
+ * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-api/src/main/java/org.nuito… $
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.wikitty.query.conditions;
+
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+
+/**
+ * Equals operator is used to build restriction containing "field == value"
+ * where value could be an Id, a String, an Integer, a Float or a Date, ...
+ * <p>
+ * For example, use: {@link WikittyQueryMaker}.eq( myElement , "REF1234567890" )
+ * <p>
+ * This operator used for String check strict equality (case sensitive)
+ * You can used '*' in expression at beginning or ending for String equality.
+ *
+ * <li> {@link WikittyQueryMaker}.eq("myext.myfield", "*jour") match field "bonjour" but not "BONJOUR"
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Equals extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Equals(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/False.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/False.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/False.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,24 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Always False
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class False extends TerminalOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Default constructor
+ */
+ public False() {
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Greater.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,27 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+
+/**
+ * Greater operator is used to build restriction containing "field > value"
+ * where value could be a Integer, a Float or a Date, String (must be comparable). <br>
+ * <br>
+ * For example, use: {@link WikittyQueryMaker}.less( myField , new Date())
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Greater extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Greater(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/GreaterOrEquals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,27 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+
+/**
+ * GreatOrEqual operator is used to build restriction containing "element >=
+ * value" where element could be a Integer, a Float, a Date, ... (must be Comparable)<br>
+ * <br>
+ * For example, use: {@link WikittyQueryMaker}.greatEq( myElement, new Date())
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class GreaterOrEquals extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public GreaterOrEquals(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Join.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Join.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Join.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,51 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+
+/**
+ * Join is used to join to Wikitty type.
+ *
+ * ex:
+ * <li> {@link WikittyQueryMaker}.join(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 Join extends ConditionUnary {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+
+ public Join(Element element) {
+ this.element = element;
+ }
+
+ public Join(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) {
+ Join op = (Join)other;
+ result = ObjectUtils.equals(this.getElement(), op.getElement());
+ }
+ return result;
+ }
+
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Keyword.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Search keyword in all wikitty. All field is converted to String
+ * representation and comparaison is done in ignore case mode, if one field
+ * contains value the wikitty must be returned.
+ *
+ * ex:
+ * <li>field value is 'bonjour le monde'
+ * <li>keyword is 'le' or 'bon' or 'nde'
+ *
+ * wikitty with this field must be returned
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Keyword extends TerminalBinaryOperator {
+
+ private static final long serialVersionUID = 1L;
+
+ public Keyword(String value) {
+ super(ElementField.ALL_FIELD, value);
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Less.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,27 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+
+/**
+ * Less operator is used to build restriction containing "element < value"
+ * where element could be a Integer, a Float, a Date, .... (must be Comparable) <br>
+ * <br>
+ * For example, use: {@link WikittyQueryMaker}.less( myElement, new Date())
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Less extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Less(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/LessOrEquals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,25 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * LessOrEqual operator is used to build restriction containing "element <=
+ * value" where element could be a Integer, a Float, a Date, ... (must be comparable) <br>
+ * <br>
+ * For example, use: RestrictionHelper.lessEq( myElement, new Date())
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class LessOrEquals extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public LessOrEquals(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Like.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,27 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Like is use on String field type, you can use '*' at beginning or ending
+ * to match all char. (ex: ext.field LIKE 'deb*' match 'debut' or 'debout' ...
+ * <p>
+ * comparaison is done in ignore case mode, if you wan't case sensitive
+ * comparaison you must used {@link Equals}
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+
+
+public class Like extends TerminalBinaryOperator {
+ // serialVersionUID is used for serialization.
+
+ private static final long serialVersionUID = 1L;
+
+ public Like(Element element, String value) {
+ super(element, value);
+ }
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Not.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,30 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Not operator is used to build negative restriction for request on content.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Not extends ConditionUnary {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Not() {
+ }
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param restriction
+ */
+ public Not(Condition restriction) {
+ super(restriction);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotEquals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,31 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * NotEquals operator is used to build restriction containing "element != value"
+ * where element could be an Id, a String, an Integer, a Float, a Date ... <br>
+ * <br>
+ * For example, use: {@link WikittyQueryMaker}.neq( myElement , "REF1234567890" )
+ * <p>
+ * <p>
+ * This operator used for String check strict equality (case sensitive)
+ * You can used '*' in expression at beginning or ending for String equality.
+ *
+ * <li> {@link WikittyQueryMaker}.ne("myext.myfield", "*jour") not match field "bonjour" but match "BONJOUR"
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class NotEquals extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public NotEquals(Element element, String value) {
+ super(element, value);
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/NotNull.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,21 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Is not null restriction, check if field has value (not null)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class NotNull extends TerminalBinaryOperator {
+
+ private static final long serialVersionUID = 1L;
+
+ public NotNull(Element element) {
+ super(element, null);
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Null.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,21 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * Is null restriction, check if field has no value (null)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Null extends TerminalBinaryOperator {
+
+ private static final long serialVersionUID = 1L;
+
+ public Null(Element element) {
+ super(element, null);
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Or.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,40 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Or operator is used to build disjunctive restriction for request on content.
+ * It take at least 2 args. <br>
+ * <br>
+ * For example, use:
+ * <ul>
+ * <li>{@link WikittyQueryMaker}.or( restriction1, restriction2 )</li>
+ * <li>{@link WikittyQueryMaker}.or( restriction1, restriction2, restriction3 )</li>
+ * <li>{@link WikittyQueryMaker}.or( my_JavaUtilList_Of_Restriction_Witch_Size_Is_Upper_Than2 )</li>
+ * </ul>
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Or extends ConditionNary {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Or(Condition ... c) {
+ super(Arrays.asList(c));
+ }
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param restrictions
+ */
+ public Or(List<Condition> conditions) {
+ super(conditions);
+ }
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryListOperator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,50 @@
+package org.nuiton.wikitty.query.conditions;
+
+import java.util.Collection;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Classe mere des des operateurs binaire prenant une liste comme valeur possible
+ * (ex: ContainsAll, ContainsOne)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class TerminalBinaryListOperator extends TerminalOperator{
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(TerminalBinaryListOperator.class);
+
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+ protected Collection<String> values;
+
+ public TerminalBinaryListOperator(Element element, Collection<String> values) {
+ this.element = element;
+ this.values = values;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+
+ public Collection<String> getValues() {
+ return values;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ TerminalBinaryListOperator op = (TerminalBinaryListOperator)other;
+ boolean result = ObjectUtils.equals(this.getElement(), op.getElement())
+ && ObjectUtils.equals(this.getValues(), op.getValues());
+ return result;
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalBinaryOperator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,53 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+
+/**
+ * classe mere des operateurs unaire et binaire. Lorsqu'on l'utilise pour un
+ * unaire seul element ou value est different de null, mais pas les deux en
+ * meme temps.
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class TerminalBinaryOperator extends TerminalOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+ protected String value;
+
+ /**
+ * Constructor with all parameters initialized
+ *
+ * @param element
+ * @param value
+ */
+ public TerminalBinaryOperator(Element element, String value) {
+ this.element = element;
+ this.value = value;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ TerminalBinaryOperator op = (TerminalBinaryOperator)other;
+ boolean result = ObjectUtils.equals(this.getElement(), op.getElement())
+ && ObjectUtils.equals(this.getValue(), op.getValue());
+ return result;
+ }
+
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalOperator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,36 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Class mere de tous les operateurs terminaux sans parametre
+ * (ex: True, False)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class TerminalOperator extends Condition {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(TerminalOperator.class);
+
+ public TerminalOperator() {
+ }
+
+ /**
+ * Pour les operateurs sans paramatre, le {@link Restriction#equals} est
+ * suffisant car il verifie deja que les classes des objets sont idendiques
+ * @param other
+ * @return
+ */
+ @Override
+ boolean equalsDeep(Object other) {
+ return true;
+ }
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/TerminalTernaryOperator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,56 @@
+package org.nuiton.wikitty.query.conditions;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Classe mere des operateurs ternaire (ex: Between)
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public abstract class TerminalTernaryOperator extends TerminalOperator {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(TerminalTernaryOperator.class);
+
+ private static final long serialVersionUID = 1L;
+
+ protected Element element;
+ protected String min;
+ protected String max;
+
+ public TerminalTernaryOperator(Element element, String min, String max) {
+ this.element = element;
+ this.min = min;
+ this.max = max;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+
+ public String getMin() {
+ return min;
+ }
+
+ public String getMax() {
+ return max;
+ }
+
+ @Override
+ boolean equalsDeep(Object other) {
+ TerminalTernaryOperator op = (TerminalTernaryOperator)other;
+ boolean result = ObjectUtils.equals(this.getElement(), op.getElement())
+ && ObjectUtils.equals(this.getMin(), op.getMin())
+ && ObjectUtils.equals(this.getMax(), op.getMax());
+ return result;
+ }
+
+
+}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/True.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/True.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/True.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,24 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * always True
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class True extends TerminalOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Default constructor
+ */
+ public True() {
+ }
+
+}
\ No newline at end of file
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/Unlike.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,23 @@
+package org.nuiton.wikitty.query.conditions;
+
+/**
+ * UnLike is use on String field type, you can use '*' at beginning or ending
+ * to match all char. (ex: ext.field UNLIKE 'deb*' not match 'debut' or 'debout' ...
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class Unlike extends TerminalBinaryOperator {
+
+ // serialVersionUID is used for serialization.
+ private static final long serialVersionUID = 1L;
+
+ public Unlike(Element element, String value) {
+ super(element, value);
+ }
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Criteria.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Criteria.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Criteria.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -52,7 +52,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Criteria implements Serializable, Cloneable {
/** serialVersionUID. */
private static final long serialVersionUID = 2590223960861630283L;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopic.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopic.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopic.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -33,7 +33,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class FacetTopic implements Serializable {
/** serialVersionUID. */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicCountComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicCountComparator.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicCountComparator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -35,7 +35,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class FacetTopicCountComparator implements Comparator<FacetTopic> {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicNameComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicNameComparator.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/FacetTopicNameComparator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -35,7 +35,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class FacetTopicNameComparator implements Comparator<FacetTopic> {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/PagedResult.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/PagedResult.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/PagedResult.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -55,7 +55,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class PagedResult<T> implements Serializable, Iterable<T> {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -81,7 +81,9 @@
* new ElementDto(ElementName.ATTRIBUTE, "ATT_REF_ID", OperandType.STRING), "REF1234567890"))
* );
* </pre>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class RestrictionHelper {
public static Restriction eq(Element element, String value) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -52,7 +52,9 @@
* Some patterns might be available depending on the restriction used. They are :
* * '*' replace any number of characters
* * '?' replace one character
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Search {
/** Default operator type between all search condition. */
@@ -286,7 +288,10 @@
* @param values list of values that the element must be equals to
* @return {@code this} with the {@code ideq} restriction added.
*/
+ @Deprecated
public Search eq(String element, Collection<String> values) {
+ // erreur, car si le search est fait avec un OR au lieu d'un AND
+ // on a pas ce que l'on veut.
for (String value : values) {
restrictions.add(RestrictionHelper.eq(elt(element), value));
}
@@ -302,6 +307,8 @@
* @return {@code this} with the {@code exteq} restriction added.
*/
public Search exteq(Collection<String> values) {
+ // erreur, car si le search est fait avec un OR au lieu d'un AND
+ // on a pas ce que l'on veut.
for (String value : values) {
restrictions.add(RestrictionHelper.eq(elt(Element.ELT_EXTENSION), value));
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/TreeNodeResult.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/TreeNodeResult.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/TreeNodeResult.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -44,7 +44,9 @@
*
* Last update: $Date$
* by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class TreeNodeResult<T extends Serializable> extends DefaultMutableTreeNode implements Iterable<TreeNodeResult<T>> {
/** to use log facility, just put in your code: log.info(\"...\"); */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/And.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/And.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/And.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -38,7 +38,9 @@
* <li>RestrictionHelper.and(
* my_JavaUtilList_Of_Restriction_Witch_Size_Is_Upper_Than2 )</li>
* </ul>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class And extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/AssociatedRestriction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/AssociatedRestriction.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/AssociatedRestriction.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -24,6 +24,10 @@
*/
package org.nuiton.wikitty.search.operators;
+/**
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
public class AssociatedRestriction extends Restriction {
private static final long serialVersionUID = 1L;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Between.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Between.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Between.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -31,7 +31,9 @@
* < max" where element could be a Integer, a Float or a Date. <br>
* <br>
* For example, use: RestrictionHelper.between( myElement , "15.5" , "22.5" )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Between extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/BinaryOperator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/BinaryOperator.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/BinaryOperator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -29,7 +29,9 @@
/**
* This class is an abstract class that's used to factor each operator that
* handle two parameters (=, !=, <, <=, >, >=, end, begin).
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class BinaryOperator extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Element.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Element.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Element.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -30,7 +30,9 @@
* Search on field.
*
* @author ruchaud
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Element implements Serializable {
/** Represent a element on extension */
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/EndsWith.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/EndsWith.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/EndsWith.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* <br>
* For example, use: RestrictionHelper.end( myElement , "value" )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class EndsWith extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Equals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Equals.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Equals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* Integer, a Float or a Date. <br>
* <br>
* For example, use: RestrictionHelper.eq( myElement , "REF1234567890" )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Equals extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/False.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/False.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/False.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -29,7 +29,9 @@
/**
* User: couteau
* Date: 08/04/11
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class False extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Greater.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Greater.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Greater.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* For example, use: RestrictionHelper.less( myElement ,
* RestrictionHelper.DATE_FORMAT.format(new Date()) )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Greater extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/GreaterOrEqual.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/GreaterOrEqual.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/GreaterOrEqual.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* For example, use: RestrictionHelper.greatEq( myElement ,
* RestrictionHelper.DATE_FORMAT.format(new Date()) )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class GreaterOrEqual extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Keyword.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Keyword.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Keyword.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -28,7 +28,9 @@
* Search keyword in all wikitty.
*
* @author ruchaud
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Keyword extends Restriction {
private static final long serialVersionUID = 1L;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Less.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Less.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Less.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* For example, use: RestrictionHelper.less( myElement ,
* RestrictionHelper.DATE_FORMAT.format(new Date()) )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Less extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/LessOrEqual.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/LessOrEqual.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/LessOrEqual.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* For example, use: RestrictionHelper.lessEq( myElement ,
* RestrictionHelper.DATE_FORMAT.format(new Date()) )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class LessOrEqual extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -27,16 +27,16 @@
import java.io.Serializable;
/**
- * Like is use on String field type, to precise some particularity on search.
- *
- * @author ruchaud
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-
-
+ * Like is use on String field type, to precise some particularity on search.
+ *
+ * @author ruchaud
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
public class Like extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Not.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Not.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Not.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* For example, use: RestrictionHelper.not( RestrictionHelper.eq( myElement ,
* "myValue" ) )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Not extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/NotEquals.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/NotEquals.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/NotEquals.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* Integer, a Float or a Date. <br>
* <br>
* For example, use: RestrictionHelper.neq( myElement , "REF1234567890" )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class NotEquals extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Null.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Null.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Null.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -28,7 +28,9 @@
* Is null or is not null restriction
*
* @author ruchaud
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Null extends Restriction {
private static final long serialVersionUID = 1L;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Or.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Or.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Or.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -38,7 +38,9 @@
* <li>RestrictionHelper.or(
* my_JavaUtilList_Of_Restriction_Witch_Size_Is_Upper_Than2 )</li>
* </ul>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Or extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Restriction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Restriction.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Restriction.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -29,7 +29,9 @@
/**
* This element is a symbolic interface implemented by all operators used to
* request contents (And, Or, Not, Equals, NotEquals, EndsWith, ...).
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -29,7 +29,9 @@
* This enum contains all kind of restriction used to request content. It's used
* by parser to create lucene request from RestrictionDto.
* </p>
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public enum RestrictionName {
EQUALS,
NOT_EQUALS,
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SearchOperand.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SearchOperand.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SearchOperand.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -28,7 +28,9 @@
* Represents the possible operands for client search. The supported type of
* each AttributeSearchDto depends of its type.
* @deprecated ne semble pas utilise, interet ???
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public enum SearchOperand {
EQUALS, NOT_EQUALS, LESS, LESS_OR_EQUALS, GREATER, GREATER_OR_EQUALS,
BEGINS_WITH, ENDS_WITH, CONTAINS, NOT_CONTAINS, BETWEEN
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/StartsWith.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/StartsWith.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/StartsWith.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -32,7 +32,9 @@
* <br>
* <br>
* For example, use: RestrictionHelper.start( myElement , "value" )
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class StartsWith extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SubSearch.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SubSearch.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/SubSearch.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -26,6 +26,10 @@
import org.nuiton.wikitty.search.Search;
+/**
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
public class SubSearch extends Search {
protected String foreignName;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/True.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/True.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/True.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -29,7 +29,9 @@
/**
* User: couteau
* Date: 08/04/11
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
*/
+@Deprecated
public class True extends Restriction implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -27,17 +27,17 @@
import java.io.Serializable;
/**
- * UnLike is use on String field type, to precise some particularity on search
- * (case insensitive for example).
- *
- * @author martel
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-
-
+ * UnLike is use on String field type, to precise some particularity on search
+ * (case insensitive for example).
+ *
+ * @author martel
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ * @deprecated since 3.3 use new query api {@link org.nuiton.wikitty.query.WikittyQuery}
+ */
+@Deprecated
public class Unlike extends BinaryOperator implements Serializable {
// serialVersionUID is used for serialization.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -31,6 +31,9 @@
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.search.TreeNodeResult;
/**
@@ -181,8 +184,24 @@
public TreeNodeResult<String> findTreeNode(String securityToken, String wikittyId, int depth, boolean count, Criteria filter) {
return delegate.findTreeNode(securityToken, wikittyId, depth, count, filter);
}
-
+
@Override
+ public List<WikittyQueryResult<String>> findAllByQuery(
+ String securityToken, List<WikittyQuery> queries) {
+ return delegate.findAllByQuery(securityToken, queries);
+ }
+
+ @Override
+ public List<String> findByQuery(String securityToken, List<WikittyQuery> queries) {
+ return delegate.findByQuery(securityToken, queries);
+ }
+
+ @Override
+ public WikittyQueryResultTreeNode<String> findTreeNode(String securityToken, String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ return delegate.findTreeNode(securityToken, wikittyId, depth, count, filter);
+ }
+
+ @Override
public WikittyEvent deleteTree(String securityToken, String wikittyId) {
return delegate.deleteTree(securityToken, wikittyId);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -53,6 +53,10 @@
import org.nuiton.wikitty.entities.WikittyTreeNode;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.WikittyUtil;
+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;
import org.nuiton.wikitty.search.operators.Element;
@@ -368,11 +372,11 @@
// check that all extensions are not used
for(String name : extNames) {
// only name are stored in index, search only on name
- Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, name).criteria();
- criteria.setEndIndex(0); // result is not use, just numFound
- PagedResult<String> wikittyWithExt = findAllByCriteria(
- securityToken, Collections.singletonList(criteria)).get(0);
- int numFound = wikittyWithExt.getNumFound();
+ WikittyQuery query = new WikittyQueryMaker().exteq(name).end();
+ query.setLimit(0); // result is not use, just numFound
+ WikittyQueryResult<String> wikittyWithExt = findAllByQuery(
+ securityToken, Collections.singletonList(query)).get(0);
+ int numFound = wikittyWithExt.getTotalResult();
if (numFound > 0) {
throw new WikittyException(String.format(
"Can't delete %s extension, this extension"
@@ -710,11 +714,11 @@
}
// Store node with have deleted node as parent
- Criteria criteria =
- Search.query().eq(WikittyTreeNode.
- FQ_FIELD_WIKITTYTREENODE_PARENT, id).criteria();
- List<String> wikittyNodesId = findAllByCriteria(
- securityToken, Collections.singletonList(criteria))
+ WikittyQuery query =
+ new WikittyQueryMaker().eq(WikittyTreeNode.
+ FQ_FIELD_WIKITTYTREENODE_PARENT, id).end();
+ List<String> wikittyNodesId = findAllByQuery(
+ securityToken, Collections.singletonList(query))
.get(0).getAll();
for (String wikittyNodeId : wikittyNodesId) {
if (!idSet.contains(wikittyNodeId)) {
@@ -726,10 +730,10 @@
}
// Store node with have deleted child
- criteria = Search.query().eq(WikittyTreeNode.
- FQ_FIELD_WIKITTYTREENODE_ATTACHMENT, id).criteria();
- wikittyNodesId = findAllByCriteria(
- securityToken, Collections.singletonList(criteria))
+ query = new WikittyQueryMaker().eq(WikittyTreeNode.
+ FQ_FIELD_WIKITTYTREENODE_ATTACHMENT, id).end();
+ wikittyNodesId = findAllByQuery(
+ securityToken, Collections.singletonList(query))
.get(0).getAll();
for (String wikittyNodeId : wikittyNodesId) {
if (!idSet.contains(wikittyNodeId)) {
@@ -905,7 +909,104 @@
}
}
+ /**
+ * Assume that this PagedResult contains wikitty id as result and
+ * return new PagedResult with Wikitty instance
+ */
@Override
+ public List<WikittyQueryResult<String>> findAllByQuery(
+ String securityToken, List<WikittyQuery> queries) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
+ List<WikittyQueryResult<String>> result =
+ new ArrayList<WikittyQueryResult<String>>(queries.size());
+ for (WikittyQuery c : queries) {
+ if (c == null) {
+ result.add(null);
+ } else {
+ WikittyQueryResult<String> searchResult =
+ getSearchEngine().findAllByQuery(tx, c);
+ result.add(searchResult);
+ }
+ }
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ if (queries.size() != result.size()) {
+ log.error(String.format("Query input list (%s) has not same size that result list (%s)",
+ queries.size(), result.size()));
+ }
+ return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
+ } catch (Exception eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw new WikittyException("Error during find", eee);
+ }
+ }
+
+ @Override
+ public List<String> findByQuery(String securityToken, List<WikittyQuery> queries) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
+ List<String> result = new ArrayList<String>(queries.size());
+ List<WikittyQuery> queriesLimited = new ArrayList<WikittyQuery>(queries.size());
+ for (WikittyQuery c : queries) {
+ WikittyQuery cLimit = c.copy().setFirst(0).setLimit(1);
+ queriesLimited.add(cLimit);
+ }
+
+ List<WikittyQueryResult<String>> idsList =
+ findAllByQuery(securityToken, queriesLimited);
+
+ for (WikittyQueryResult<String> ids : idsList) {
+ if (ids.size() > 0) {
+ result.add(ids.peek());
+ } else {
+ result.add(null);
+ }
+ }
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ if (queries.size() != result.size()) {
+ log.error(String.format("Query input list (%s) has not same size that result list (%s)",
+ queries.size(), result.size()));
+ }
+ return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
+ } catch (Exception eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw new WikittyException("Error during find", eee);
+ }
+ }
+
+ @Override
public WikittyEvent deleteTree(String securityToken, String thesaurusId) {
WikittyTransaction tx = WikittyTransaction.get();
boolean txBeginHere = false;
@@ -944,12 +1045,11 @@
* @return all id of {@code treeNodeId}'s children
*/
protected List<String> getRecursiveTreeNodeId(String securityToken, String treeNodeId) {
- Search search = Search.query();
- search = search.eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, treeNodeId);
- Criteria criteria = search.criteria();
-
- PagedResult<String> childTreeNodeIds = findAllByCriteria(
- securityToken, Collections.singletonList(criteria)).get(0);
+ WikittyQuery query = new WikittyQueryMaker()
+ .eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, treeNodeId).end();
+
+ WikittyQueryResult<String> childTreeNodeIds = findAllByQuery(
+ securityToken, Collections.singletonList(query)).get(0);
List<String> treeNodeIds = new ArrayList<String>();
treeNodeIds.add(treeNodeId);
for (String childTreeNodeId : childTreeNodeIds.getAll()) {
@@ -995,6 +1095,41 @@
}
@Override
+ public WikittyQueryResultTreeNode<String> findTreeNode(String securityToken,
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
+ WikittyQueryResultTreeNode<String> result = null;
+ Wikitty w = restore(securityToken, wikittyId);
+ if(w != null) {
+ result = getSearchEngine().findAllChildrenCount(
+ tx, wikittyId, depth, count, filter);
+ }
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
+ } catch (Exception eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw new WikittyException("Can't restore children", eee);
+ }
+ }
+
+ @Override
public Wikitty restoreVersion(String securityToken,
String wikittyId, String version) {
throw new UnsupportedOperationException("Not supported yet.");
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2011-12-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -44,6 +44,9 @@
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.WikittyService;
import org.nuiton.wikitty.WikittyServiceFactory;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -360,7 +363,7 @@
Criteria climit = Search.query(c).criteria().setFirstIndex(0).setEndIndex(1);
criteriaLimit.add(climit);
}
-
+
List<PagedResult<String>> idsList = findAllByCriteria(
securityToken, criteriaLimit);
@@ -388,6 +391,89 @@
}
@Override
+ public List<WikittyQueryResult<String>> findAllByQuery(
+ String securityToken, List<WikittyQuery> queries) {
+ List<WikittyQueryResult<String>> resultTxList =
+ tx.findAllByQuery(securityToken, queries);
+ List<WikittyQueryResult<String>> resultWsList =
+ ws.findAllByQuery(securityToken, queries);
+
+ List<WikittyQueryResult<String>> result =
+ new ArrayList<WikittyQueryResult<String>>(resultWsList.size());
+ for (int i=0; i<queries.size(); i++) {
+ WikittyQueryResult<String> resultTx = resultTxList.get(i);
+ WikittyQueryResult<String> resultWs = resultWsList.get(i);
+ // Il faut fusionner les deux resultats
+ // - ne pas avoir de doublon
+ // - ne pas retenir ceux supprimer dans la transaction
+ // - fusionner les facettes (comment faire ?)
+ // - respecter le range demander (comment faire, avec les suppressions possible ?)
+ LinkedHashSet<String> ids =
+ new LinkedHashSet<String>(resultTx.size() + resultWs.size());
+ ids.addAll(resultTx.getAll());
+ for (String id : resultWs.getAll()) {
+ if (!tx.exists(securityToken, id) || !tx.isDeleted(securityToken, id)) {
+ ids.add(id);
+ }
+ }
+
+ String queryName = resultWs.getQueryName();
+ int firstIndice = resultWs.getFirst();
+ // FIXME le resultat est faux, le nombre total n'est pas la somme des deux :(
+ int numFound = resultTx.getTotalResult() + resultWs.getTotalResult();
+ String queryString = resultWs.getQueryString();
+ // FIXME les facettes sont fausses :(
+ Map<String, List<org.nuiton.wikitty.query.FacetTopic>> facets = resultWs.getFacets();
+ List<String> results = new ArrayList<String>(ids);
+
+ result.add(new WikittyQueryResult<String>(queryName,
+ firstIndice, numFound, queryString, facets, results));
+ }
+
+ if (queries.size() != result.size()) {
+ log.error(String.format("Queries input list (%s) has not same size that result list (%s)",
+ queries.size(), result.size()));
+ }
+
+ return result;
+ }
+
+ @Override
+ public List<String> findByQuery(String securityToken, List<WikittyQuery> queries) {
+ List<String> result = new ArrayList<String>(queries.size());
+ List<WikittyQuery> queriesLimited = new ArrayList<WikittyQuery>(queries.size());
+ for (WikittyQuery c : queries) {
+ WikittyQuery climit = c.copy().setFirst(0).setLimit(1);
+ queriesLimited.add(climit);
+ }
+
+ List<WikittyQueryResult<String>> idsList = findAllByQuery(
+ securityToken, queriesLimited);
+
+ for (WikittyQueryResult<String> ids : idsList) {
+ if (ids.size() > 0) {
+ result.add(ids.peek());
+ } else {
+ result.add(null);
+ }
+ }
+
+ if (queries.size() != result.size()) {
+ log.error(String.format("Query input list (%s) has not same size that result list (%s)",
+ queries.size(), result.size()));
+ }
+
+ return result;
+ }
+
+ @Override
+ public WikittyQueryResultTreeNode<String> findTreeNode(String securityToken,
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ // FIXME
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
public WikittyEvent deleteTree(String securityToken, String treeNodeId) {
// FIXME
throw new UnsupportedOperationException("Not supported yet.");
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-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -30,6 +30,9 @@
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
import org.nuiton.wikitty.search.TreeNodeResult;
import org.nuiton.wikitty.services.WikittyTransaction;
@@ -68,8 +71,22 @@
*/
public void delete(WikittyTransaction transaction,
Collection<String> idList) throws WikittyException;
+
+ /**
+ * @deprecated since 3.3 use {@link #findAllByCriteria(org.nuiton.wikitty.services.WikittyTransaction, org.nuiton.wikitty.search.Criteria)}
+ */
+ @Deprecated
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
+ /**
+ * Find all wikitties that satisfy queries constraint
+ *
+ * @param transaction
+ * @param queries
+ * @return id of wikitties
+ * @since 3.3
+ */
+ public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery queries);
/**
* Find all children ids with attachment count for a node wikitty.
@@ -106,8 +123,50 @@
* @param filter filter on attachment count
* @return Tree start with wikittyId as root
* @throws WikittyException if wikittyId is not WikittyTreeNode
+ * @deprecated since 3.3 use {@link #findAllChildrenCount(org.nuiton.wikitty.services.WikittyTransaction, java.lang.String, int, boolean, org.nuiton.wikitty.query.WikittyQuery) }
*/
+ @Deprecated
public TreeNodeResult<String> findAllChildrenCount(WikittyTransaction transaction,
String wikittyId, int depth, boolean count, Criteria filter);
+ /**
+ * Find all children ids with attachment count for a node wikitty.
+ * If same attachment found many time in subtree this attachment is count
+ * only once.
+ *
+ * If we have:
+ * <ul>
+ * <li> w Node (4)
+ * <ul>
+ * <li> child1 (3) </li>
+ * <li> child2 (4) </li>
+ * <li> child3 (2)
+ * <ul>
+ * <li> subchild1 (1) </li>
+ * <li> subchild2 (5) </li>
+ * </ul>
+ * </li>
+ * <li> child4 (3) </li>
+ * <li> child5 (7) </li>
+ * </ul>
+ * </li>
+ * </ul>
+ *
+ * return count for: child1(3), child2(4), child3(8), child4(3), child5(7)
+ * and for the child3 count we have count of subchild1 and subchild2 in
+ *
+ * Node and subchild are returned according to depth
+ *
+ * @param transaction
+ * @param wikittyId root node to begin
+ * @param depth depth of node returned, -1 to retrieve all child level
+ * @param count if true return count of attachment
+ * @param filter filter on attachment count
+ * @return Tree start with wikittyId as root
+ * @throws WikittyException if wikittyId is not WikittyTreeNode
+ * @since 3.3
+ */
+ public WikittyQueryResultTreeNode<String> findAllChildrenCount(WikittyTransaction transaction,
+ String wikittyId, int depth, boolean count, WikittyQuery filter);
+
}
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-01 09:50:20 UTC (rev 1258)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -28,16 +28,45 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.commons.collections.CollectionUtils;
+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.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
+import org.nuiton.wikitty.query.WikittyQueryVisitor;
+import org.nuiton.wikitty.query.conditions.Condition;
+import org.nuiton.wikitty.query.conditions.ContainsAll;
+import org.nuiton.wikitty.query.conditions.ContainsOne;
+import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementId;
+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.Unlike;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.TreeNodeResult;
@@ -60,6 +89,9 @@
public class WikittySearchEngineInMemory implements WikittySearchEngine {
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineInMemory.class);
+
protected WikittyStorageInMemory wikittyStorage;
public WikittySearchEngineInMemory(WikittyStorageInMemory wikittyStorage) {
@@ -73,17 +105,900 @@
@Override
public void store(WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean force) {
+ // do nothing
}
@Override
public void delete(WikittyTransaction transaction, Collection<String> idList) throws WikittyException {
+ // do nothing
}
-// @Override
-// public void delete(Collection<String> idList) throws WikittyException {
-// }
+ private boolean checkRestriction(WikittyTransaction transaction,
+ Condition condition, Wikitty w) {
+ WikittyQueryVisitorCheckCondition v =
+ new WikittyQueryVisitorCheckCondition(this, transaction, w);
+ condition.accept(v);
+ boolean result = v.getResult();
+ return result;
+ }
+
+ @Override
+ public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
+ // throw new UnsupportedOperationException("Not supported yet.");
+ int first = query.getFirst();
+ int limit = query.getLimit();
+ List<String> ids = new LinkedList<String>();
+ int currentIndex = 0;
+ for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
+ Wikitty w = entry.getValue();
+ String id = entry.getKey();
+ Condition c = query.getCondition();
+ if (!w.isDeleted() && checkRestriction(transaction, c, w)) {
+ currentIndex++;
+ if (currentIndex > first) {
+ ids.add(id);
+ }
+ if (ids.size() >= limit) {
+ break;
+ }
+ }
+ }
+ return new WikittyQueryResult<String>(query.getName(),
+ first, ids.size(), query.getCondition().toString(), null, ids);
+ }
- public boolean checkRestriction(WikittyTransaction transaction,
+ @Override
+ public WikittyQueryResultTreeNode<String> findAllChildrenCount(WikittyTransaction transaction,
+ String wikittyId, int depth, boolean count, WikittyQuery filter) {
+ // FIXME
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ static public class WikittyQueryVisitorCheckCondition extends WikittyQueryVisitor {
+
+ protected WikittySearchEngine searchEngine;
+ /** transaction used to check wikitty */
+ protected WikittyTransaction tx;
+ /** wikitty to check */
+ protected Wikitty w;
+ /** la pile d'evaluation des differencetes contraintes */
+ protected Deque<Boolean> evalStack = new LinkedList<Boolean>();
+
+ public boolean getResult() {
+ Boolean result = evalStack.poll();
+ if (result == null) {
+ // s'il n'y avait pas de condition, la stack est vide, donc
+ // c'est vrai
+ result = Boolean.TRUE;
+ }
+ return result;
+ }
+
+ public WikittyQueryVisitorCheckCondition(
+ WikittySearchEngine searchEngine, WikittyTransaction tx, Wikitty w) {
+ this.searchEngine = searchEngine;
+ this.tx = tx;
+ this.w = w;
+ }
+
+ /**
+ * Interface permettant de verifier une condition sur deux collections
+ */
+ static private interface Predicate {
+ /**
+ * retourne vrai si la condition est validee
+ * @param type type des elements des collections. Si null alors les
+ * collection contiennent des String (id ou nom extension)
+ * @param value l'ensemble des valeur du champs
+ * @param expected l'ensemble des valeurs attendue
+ * @return vrai si la condition est validee
+ */
+ boolean check(FieldType type, Collection values, Collection expected);
+ }
+
+ static private Predicate BetweenPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() == 2) {
+ // si on a pas deux valeur, c'est qu'on a pas min et max
+ Iterator i = expected.iterator();
+ Object min = i.next();
+ Object max = i.next();
+ for (Object fieldValue : values) {
+ // fieldValue doit etre comparable
+ if (fieldValue instanceof Comparable) {
+ // recupere le type de la valeur
+
+ result = ((Comparable) fieldValue).compareTo(min) >= 0
+ && ((Comparable) fieldValue).compareTo(max) <= 0;
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate ContainsAllPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+ if (values != null) {
+ expected = CollectionUtils.subtract(expected, values);
+ // si lorsqu'on retire tous les elements en commun avec la valeur
+ // du champs il ne reste plus rien, c'est que le containsAll est
+ // vrai
+ result = expected.isEmpty();
+ }
+ return result;
+
+ }
+ };
+
+ static private Predicate ContainsOnePredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+ if (values != null) {
+ expected = CollectionUtils.retainAll(expected, values);
+ // si lorsqu'on retient tous les elements en commun avec la valeur
+ // du champs il ne reste plus rien, c'est que le containsOne est
+ // faux, donc il faut qu'il en reste
+ result = !expected.isEmpty();
+ }
+ return result;
+ }
+ };
+
+ static private Predicate EqualsPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+ if (values != null && expected.size() > 0) {
+ // gestion des type STRING differement car il peut y avoir des '*'
+ if (type != null && type.getType() == TYPE.STRING) {
+ Iterator i = expected.iterator();
+ String exp = String.valueOf(i.next());
+ for (Object fieldValue : values) {
+ String val = String.valueOf(fieldValue);
+ result = matchString(val, exp, false);
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ } else {
+ expected = CollectionUtils.subtract(expected, values);
+ // si lorsqu'on retire tous les elements en commun avec la valeur
+ // du champs il ne reste plus rien, c'est que le equals est
+ // vrai
+ result = expected.isEmpty();
+ }
+ }
+ return result;
+
+ }
+ };
+
+ static private Predicate NotEqualsPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+ if (values != null && expected.size() > 0) {
+ // gestion des type STRING differement car il peut y avoir des '*'
+ if (type != null && type.getType() == TYPE.STRING) {
+ Iterator i = expected.iterator();
+ String exp = String.valueOf(i.next());
+ for (Object fieldValue : values) {
+ String val = String.valueOf(fieldValue);
+ result = !matchString(val, exp, false);
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ } else {
+ expected = CollectionUtils.subtract(expected, values);
+ // si lorsqu'on retire tous les elements en commun avec la valeur
+ // du champs il ne reste plus rien, c'est que le equals est
+ // vrai et donc le not equals est faux
+ result = !expected.isEmpty();
+ }
+ }
+ return result;
+
+ }
+ };
+
+ static private Predicate GreaterPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ Object val = i.next();
+ for (Object fieldValue : values) {
+ // fieldValue doit etre comparable
+ if (fieldValue instanceof Comparable) {
+ // recupere le type de la valeur
+ result = ((Comparable) fieldValue).compareTo(val) > 0;
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate GreaterOrEqualsPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ Object val = i.next();
+ for (Object fieldValue : values) {
+ // fieldValue doit etre comparable
+ if (fieldValue instanceof Comparable) {
+ // recupere le type de la valeur
+ result = ((Comparable) fieldValue).compareTo(val) >= 0;
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate LessPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ Object val = i.next();
+ for (Object fieldValue : values) {
+ // fieldValue doit etre comparable
+ if (fieldValue instanceof Comparable) {
+ // recupere le type de la valeur
+ result = ((Comparable) fieldValue).compareTo(val) < 0;
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate LessOrEqualsPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ Object val = i.next();
+ for (Object fieldValue : values) {
+ // fieldValue doit etre comparable
+ if (fieldValue instanceof Comparable) {
+ // recupere le type de la valeur
+ result = ((Comparable) fieldValue).compareTo(val) <= 0;
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate KeywordPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ String exp = String.valueOf(i.next());
+ for (Object fieldValue : values) {
+ String val = String.valueOf(fieldValue);
+ // TODO poussin 20111228 verifie que le containsIgnoreCase
+ // supprime les accents, si ce n'est pas le cas, il faut
+ // trouver comment faire
+ result = StringUtils.containsIgnoreCase(val, exp);
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate LikePredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ String exp = String.valueOf(i.next());
+ for (Object fieldValue : values) {
+ String val = String.valueOf(fieldValue);
+ result = matchString(val, exp, true);
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate UnlikePredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = false;
+
+ if (values != null && expected.size() > 0) {
+ // si on a pas une valeur, c'est pas bon :(
+ Iterator i = expected.iterator();
+ String exp = String.valueOf(i.next());
+ for (Object fieldValue : values) {
+ String val = String.valueOf(fieldValue);
+ result = !matchString(val, exp, true);
+ if (result) {
+ // si une des valeurs correspond, on retourne true
+ break;
+ }
+ }
+ }
+ return result;
+ }
+ };
+
+ static private Predicate NullPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = values == null || values.contains(null);
+ return result;
+ }
+ };
+
+ static private Predicate NotNullPredicate = new Predicate() {
+ public boolean check(FieldType type, Collection values, Collection expected) {
+ boolean result = values != null && !values.contains(null);
+ return result;
+ }
+ };
+
+
+
+ /**
+ * check if string match other string.
+ *
+ * @param s string
+ * @param sub string to match with 's' parameter. This string can start
+ * or and with star '*'
+ * @param ignoreCase if true match is done in ingore case mode
+ * @return true if sub match s
+ */
+ static private boolean matchString(String s, String sub, boolean ignoreCase) {
+ // TODO poussin 20111228 verifie que le containsIgnoreCase
+ // supprime les accents, si ce n'est pas le cas, il faut
+ // trouver comment faire
+
+ boolean result = false;
+ if (sub.startsWith("*") && sub.endsWith("*")) {
+ sub = StringUtils.substring(sub, 1, -1);
+ if (ignoreCase) {
+ result = StringUtils.containsIgnoreCase(s, sub);
+ } else {
+ result = StringUtils.contains(s, sub);
+ }
+ } else if (sub.startsWith("*")) {
+ sub = StringUtils.substring(sub, 1);
+ if (ignoreCase) {
+ result = StringUtils.endsWithIgnoreCase(s, sub);
+ } else {
+ result = StringUtils.endsWith(s, sub);
+ }
+ } else if (sub.endsWith("*")) {
+ sub = StringUtils.substring(sub, 0, -1);
+ if (ignoreCase) {
+ result = StringUtils.startsWithIgnoreCase(s, sub);
+ } else {
+ result = StringUtils.startsWith(s, sub);
+ }
+ } else {
+ if (ignoreCase) {
+ result = StringUtils.equalsIgnoreCase(s, sub);
+ } else {
+ result = StringUtils.equals(s, sub);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Collecte les valeur possible de l'element demande
+ *
+ * @param e l'element demande. Peut etre l'id, l'extension ou un champs.
+ * le champs pouvant contenir des * pour remplacer le nom de extension
+ * ou le nom du champs (ex: *.name, myext.*)
+ * @param values une map avec en cle le nom du champs et en valeur
+ * la valeur du champs
+ */
+ protected void collectFieldValue(
+ org.nuiton.wikitty.query.conditions.Element e,
+ Map<String, Collection> values) {
+ if (e instanceof ElementId) {
+ values.put(e.getValue(), Collections.singleton(w.getId()));
+ } else if (e instanceof ElementExtension) {
+ values.put(e.getValue(), w.getExtensionNames());
+ } else {
+ String fqf = e.getValue();
+ if (w.hasField(fqf)) {
+ Object v = w.getFqField(fqf);
+ values.put(fqf, convert(null, v));
+ } else {
+ String extName = WikittyExtension.extractExtensionName(fqf);
+ String fieldName = WikittyExtension.extractFieldName(fqf);
+ if ("*".equals(extName) && "*".equals(fieldName)) {
+ // on ajoute tous les champs de toutes les extensions
+ for (String f : w.getAllFieldNames()) {
+ Object v = w.getFqField(f);
+ values.put(f, convert(null, v));
+ }
+ } else if ("*".equals(fieldName)){
+ // on ajoute tous les champs de l'extension demandee
+ for (String f : w.getExtension(extName).getFieldNames()) {
+ String fq = WikittyUtil.getFQFieldName(extName, f);
+ Object v = w.getFqField(fq);
+ values.put(fq, convert(null, v));
+ }
+ } else if ("*".equals(extName)){
+ // on ajoute tous les champs ayant le nom demande
+ // quelque soit l'extension
+ for (String ext : w.getExtensionNames()) {
+ for (String f : w.getExtension(ext).getFieldNames()) {
+ if (f.equals(fieldName)) {
+ String fq = WikittyUtil.getFQFieldName(ext, f);
+ Object v = w.getFqField(fq);
+ values.put(fq, convert(null, v));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Converti o en une list de valeur compatible avec type
+ * @param type le type dans lequel doit etre converti o
+ * @param o la valeur a convertir, si o est une collection, chaque
+ * element de la collection est converti
+ *
+ * @return une nouvelle collection avec les elements dans le bon type
+ */
+ protected Collection convert(FieldType type, Object o) {
+ Collection result;
+ try {
+ if (o instanceof Collection) {
+ // order of collection must be maintained, for that use LinkedHashSet
+ if (type == null) {
+ // if type is null don't change type (in case of id or extension
+ // or when we know object is already in right type)
+ result = new LinkedHashSet((Collection)o);
+ } else {
+ result = new LinkedHashSet();
+ for (Object v : (Collection)o) {
+ result.add(type.getContainedValidObject(v));
+ }
+ }
+ } else {
+ if (type != null) {
+ // if type is null don't change type (in case of id or extension
+ // or when we know object is already in right type)
+ o = type.getContainedValidObject(o);
+ }
+ result = Collections.singleton(o);
+ }
+ } catch (Exception eee) {
+ // si on arrive pas a convertir on retourne null
+ result = null;
+ if (log.isTraceEnabled()) {
+ log.trace("not an error but can't convert string to wanted type", eee);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Verifie qu'un predicat est vrai pour un element et une valeur attendu
+ * @param predicate le predicat a verifier
+ * @param element l'element mis en cause (id, extension, field)
+ * @param expected la/les valeur(s) attendu(s)
+ * @return vrai si le predicat est verifie
+ */
+ protected boolean check(Predicate predicate,
+ org.nuiton.wikitty.query.conditions.Element element, Object expected) {
+ boolean result = false;
+
+ Map<String, Collection> fieldValues = new HashMap<String, Collection>();
+ collectFieldValue(element, fieldValues);
+ for (String fqf : fieldValues.keySet()) {
+ FieldType type = null;
+ if (w.hasField(fqf)) {
+ type = w.getFieldType(fqf);
+ }
+ Collection<Object> contained = convert(type, expected);
+ if (contained != null) {
+ // si on a reussi a convertir dans le bon type on fait la verif
+ Collection values;
+ values = (Collection)fieldValues.get(fqf);
+
+ result = predicate.check(type, values, contained);
+ if (result) {
+ // on a reussi a verifie le predicat pour au moins un champs
+ // on renvoie donc true
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+
+ @Override
+ public boolean visitEnter(WikittyQuery o) {
+ // nothing to do
+ return true;
+ }
+
+ @Override
+ public void visitLeave(WikittyQuery o, boolean enterOrMiddleResult) {
+ // nothing to do
+ }
+
+ @Override
+ public boolean visitEnter(org.nuiton.wikitty.query.conditions.And o) {
+ evalStack.push(Boolean.TRUE);
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(org.nuiton.wikitty.query.conditions.And o) {
+ // l'evaluation du dernier element du and
+ Boolean last = evalStack.pop();
+ // la valeur courante du and
+ Boolean currentValue = evalStack.pop();
+
+ Boolean result = currentValue && last;
+ evalStack.push(result);
+
+ // si le and est deja faut ca ne sert a rien de d'evaluer la suite
+ return result;
+ }
+
+ @Override
+ public void visitLeave(org.nuiton.wikitty.query.conditions.And o, boolean enterOrMiddleResult) {
+ Boolean last = Boolean.TRUE;
+ if (enterOrMiddleResult && o.getConditions().size()>0) {
+ // si enter ou middle on renvoye false, alors on a pas
+ // de nouvelle condition a prendre dans la pile sinon
+ // l'evaluation du dernier element du and
+ last = evalStack.pop();
+ }
+ // la valeur courante du and
+ Boolean currentValue = evalStack.pop();
+
+ Boolean result = currentValue && last;
+ evalStack.push(result);
+ }
+
+ @Override
+ public boolean visitEnter(org.nuiton.wikitty.query.conditions.Or o) {
+ // si le or n'a aucun element, alors il est vrai
+ if (o.getConditions().isEmpty()) {
+ evalStack.push(Boolean.TRUE);
+ } else {
+ // sinon, il faut qu'un de ses elements soit vrai pour etre vrai
+ evalStack.push(Boolean.FALSE);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean visitMiddle(org.nuiton.wikitty.query.conditions.Or o) {
+ // l'evaluation du dernier element du or
+ Boolean last = evalStack.pop();
+ // la valeur courante du or
+ Boolean currentValue = evalStack.pop();
+
+ Boolean result = currentValue || last;
+ evalStack.push(result);
+
+ // si le or est deja vrai, ca ne sert a rien d'evaluer la suite
+ return !result;
+ }
+
+ @Override
+ public void visitLeave(org.nuiton.wikitty.query.conditions.Or o, boolean enterOrMiddleResult) {
+ Boolean last = Boolean.TRUE;
+ if (enterOrMiddleResult && o.getConditions().size()>0) {
+ // si enter ou middle on renvoye false, alors on a pas
+ // de nouvelle condition a prendre dans la pile sinon
+ // l'evaluation du dernier element du or
+ last = evalStack.pop();
+ }
+ // la valeur courante du or
+ Boolean currentValue = evalStack.pop();
+
+ Boolean result = currentValue || last;
+ evalStack.push(result);
+ }
+
+ @Override
+ public boolean visitEnter(Join 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)) {
+
+ //Get sub-restriction
+ Condition sub = o.getSubCondition();
+
+ WikittyQuery query = new WikittyQuery(sub);
+
+ //find everything that validate the sub-restriction
+ WikittyQueryResult<String> associatedResult =
+ searchEngine.findAllByQuery(tx, query);
+
+ List<String> associatedList = associatedResult.getAll();
+
+ //Check that my field is contained in the sub-restriction results.
+ evalResult = check(ContainsOnePredicate, o.getElement(), associatedList);
+// associatedList.contains(String.valueOf(fieldValue));
+ }
+
+ evalStack.push(evalResult);
+
+ // on ne parcours pas la sous requete
+ return false;
+ }
+
+ @Override
+ public void visitLeave(Join o, boolean enterOrMiddleResult) {
+ // nothing to do
+ }
+
+ @Override
+ public boolean visitEnter(org.nuiton.wikitty.query.conditions.Not o) {
+ // nothing to do
+ return true;
+ }
+
+ @Override
+ public void visitLeave(org.nuiton.wikitty.query.conditions.Not o, boolean enterOrMiddleResult) {
+ Boolean val = evalStack.pop();
+ Boolean result = !val;
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(org.nuiton.wikitty.query.conditions.Between o) {
+ boolean result = false;
+ Collection expected = new ArrayList(2);
+ expected.add(o.getMin());
+ expected.add(o.getMax());
+ result = check(BetweenPredicate, o.getElement(), expected);
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(ContainsAll o) {
+ boolean result = false;
+
+ result = check(ContainsAllPredicate, o.getElement(), o.getValues());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(ContainsOne o) {
+ boolean result = false;
+
+ result = check(ContainsOnePredicate, o.getElement(), o.getValues());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(Equals o) {
+ boolean result = false;
+
+ result = check(EqualsPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(NotEquals o) {
+ boolean result = false;
+
+ result = check(NotEqualsPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(org.nuiton.wikitty.query.conditions.False o) {
+ evalStack.push(Boolean.FALSE);
+ }
+
+ @Override
+ public void visit(org.nuiton.wikitty.query.conditions.True o) {
+ evalStack.push(Boolean.TRUE);
+ }
+
+ @Override
+ public void visit(Greater o) {
+ boolean result = false;
+
+ result = check(GreaterPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(GreaterOrEquals o) {
+ boolean result = false;
+
+ result = check(GreaterOrEqualsPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(org.nuiton.wikitty.query.conditions.Keyword o) {
+ boolean result = false;
+
+ result = check(KeywordPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(Less o) {
+ boolean result = false;
+
+ result = check(LessPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(LessOrEquals o) {
+ boolean result = false;
+
+ result = check(LessOrEqualsPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(Like o) {
+ boolean result = false;
+
+ result = check(LikePredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(Unlike o) {
+ boolean result = false;
+
+ result = check(UnlikePredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(org.nuiton.wikitty.query.conditions.Null o) {
+ boolean result = false;
+
+ result = check(NullPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @Override
+ public void visit(NotNull o) {
+ boolean result = false;
+
+ result = check(NotNullPredicate, o.getElement(), o.getValue());
+
+ evalStack.push(result);
+ }
+
+ @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.");
+ }
+
+ }
+
+
+
+ @Override
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
+ // throw new UnsupportedOperationException("Not supported yet.");
+ int firstIndex = criteria.getFirstIndex();
+ int endIndex = criteria.getEndIndex();
+ List<String> ids = new LinkedList<String>();
+ int currentIndex = 0;
+ for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
+ Wikitty w = entry.getValue();
+ String id = entry.getKey();
+ Restriction dto = criteria.getRestriction();
+ if (!w.isDeleted() && checkRestriction(transaction, dto, w)) {
+ currentIndex++;
+ if (currentIndex > firstIndex) {
+ ids.add(id);
+ }
+ if (endIndex >= 0 && currentIndex >= endIndex) {
+ break;
+ }
+ }
+ }
+ return new PagedResult<String>(criteria.getName(),
+ firstIndex, ids.size(), criteria.getRestriction().toString(), null, ids);
+ }
+
+ @Override
+ public TreeNodeResult<String> findAllChildrenCount(WikittyTransaction transaction,
+ String wikittyId, int depth, boolean count, Criteria filter) {
+ // FIXME
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ private boolean checkRestriction(WikittyTransaction transaction,
Restriction restriction, Wikitty w) {
if (restriction instanceof BinaryOperator) {
BinaryOperator binOp = (BinaryOperator) restriction;
@@ -132,7 +1047,7 @@
if (RestrictionName.NOT_EQUALS == restriction.getName()) {
return true;
}
-
+
return false;
}
// recupere la valeur dans le wikitty
@@ -152,7 +1067,7 @@
}
value = t.getValidValue(value);
boolean checked = false;
-
+
switch (restriction.getName()) {
case EQUALS:
if (value instanceof String && o instanceof String) {
@@ -232,7 +1147,7 @@
}
return checked;
-
+
} else if (restriction instanceof In) {
In in = (In) restriction;
String fqfieldName = in.getElement().getName();
@@ -400,35 +1315,6 @@
}
}
- @Override
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
- // throw new UnsupportedOperationException("Not supported yet.");
- int firstIndex = criteria.getFirstIndex();
- int endIndex = criteria.getEndIndex();
- List<String> ids = new LinkedList<String>();
- int currentIndex = 0;
- for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
- Wikitty w = entry.getValue();
- String id = entry.getKey();
- Restriction dto = criteria.getRestriction();
- if (!w.isDeleted() && checkRestriction(transaction, dto, w)) {
- currentIndex++;
- if (currentIndex > firstIndex) {
- ids.add(id);
- }
- if (endIndex >= 0 && currentIndex >= endIndex) {
- break;
- }
- }
- }
- return new PagedResult<String>(criteria.getName(),
- firstIndex, ids.size(), criteria.getRestriction().toString(), null, ids);
- }
- @Override
- public TreeNodeResult<String> findAllChildrenCount(WikittyTransaction transaction,
- String wikittyId, int depth, boolean count, Criteria filter) {
- // FIXME
- throw new UnsupportedOperationException("Not supported yet.");
- }
+
}
Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java (rev 0)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/query/WikittyQueryTest.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,378 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Date;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Test;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyImpl;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyQueryTest {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyQueryTest.class);
+
+ @Test
+ public void testParseEachElement() throws Exception {
+ Wikitty w = new WikittyImpl();
+
+ {
+ WikittyQuery query = new WikittyQueryMaker().and().rFalse().rFalse().end();
+ String queryString = query.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+
+ {
+ WikittyQuery query = new WikittyQueryMaker().bw("ext.field", 0, 10).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().containsAll("ext.field", new Date(), new Date()).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().extContainsAll("ext1", "ext2").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().eq("ext.field", w).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().exteq("ext").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().rFalse().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().gt("ext.field", 13.3).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().ge("ext.field", 20.5).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().keyword("value").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().lt("ext.field", new Date()).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().le("ext.field", 30).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().like("ext.field", "truc").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().ne("ext.field", w).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().isNotNull("ext.field").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().isNull("ext.field").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().rTrue().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().unlike("ext.field", "titi").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().sw("ext.field", "debut").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().ew("ext.field", "fin").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().notsw("ext.field", "pasdebut").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().notew("ext.field", "pasfin").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().not().rTrue().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().rFalse().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().or().rFalse().rTrue().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().eq("ext.field", w).end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().not().and().eq("ext.field", 1).eq("ext.field", 2).close().close().end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ {
+ WikittyQuery query = new WikittyQueryMaker().eq("ext.field", "truc").end();
+ String queryString = query.getCondition().toString();
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ String queryParsedString = queryParsed.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+ System.out.println("queryParsed:" + queryParsedString);
+ Assert.assertEquals(query, queryParsed);
+ Assert.assertEquals(queryString, queryParsedString);
+ }
+ }
+
+ @Test
+ public void testParse() throws Exception {
+ Wikitty w = new WikittyImpl();
+
+ // creation d'une query avec toutes les conditions possibles
+ // et tous les types possibles (string, boolean, Wikitty, Date)
+ WikittyQueryMaker cc = new WikittyQueryMaker();
+ // on ecrit pas la requete en flux pour savoir s'il y une erreur a dans
+ // quelle methode elle arrive
+ cc.and();
+ cc.bw("ext.field", 0, 10);
+ cc.containsAll("ext.field", new Date(), new Date());
+ cc.extContainsAll("ext1", "ext2");
+ cc.eq("ext.field", w);
+ cc.exteq("ext");
+ cc.rFalse();
+ cc.gt("ext.field", 13.3);
+ cc.ge("ext.field", 20.5);
+ cc.keyword("value");
+ cc.lt("ext.field", new Date());
+ cc.le("ext.field", 30);
+ cc.like("ext.field", "truc");
+ cc.ne("ext.field", w);
+ cc.isNotNull("ext.field");
+ cc.isNull("ext.field");
+ cc.rTrue();
+ cc.unlike("ext.field", "titi");
+ cc.sw("ext.field", "debut");
+ cc.ew("ext.field", "fin");
+ cc.notsw("ext.field", "pasdebut");
+ cc.notew("ext.field", "pasfin");
+ cc.not();
+ cc.rFalse();
+ cc.close();
+ cc.or();
+ cc.eq("ext.field", w);
+ cc.not().and().eq("ext.field", 1).eq("ext.field", 2).close().close();
+ cc.eq("ext.field", "truc");
+ cc.close();
+ WikittyQuery query = cc.end();
+
+ // transformation en string (test du visiteur to String)
+ String queryString = query.getCondition().toString();
+ System.out.println("queryString:" + queryString);
+
+ // test de la copie de query
+ WikittyQuery queryCopy = query.copy();
+ System.out.println("queryCopy:" + queryCopy.getCondition());
+
+ // parsing du query genere
+ WikittyQuery queryParsed = WikittyQueryParser.parse(queryString);
+ System.out.println("queryParsed:" + queryParsed.getCondition());
+
+ String queryCopyString = queryCopy.getCondition().toString();
+ System.out.println("queryCopyString:" + queryCopyString);
+
+ // parsing du query genere a partir de la copy
+ WikittyQuery queryCopyParsed = WikittyQueryParser.parse(queryCopyString);
+ System.out.println("queryParsed:" + queryParsed.getCondition());
+
+ // test d'equalite sur les 2 query
+ Assert.assertEquals(query, queryCopy);
+
+ // test d'equalite sur les representation string des 2 query
+ Assert.assertEquals(queryParsed.toString(), queryCopyParsed.toString());
+ }
+}
Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java (rev 0)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-28 18:50:45 UTC (rev 1259)
@@ -0,0 +1,181 @@
+package org.nuiton.wikitty.storage;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Test;
+import org.nuiton.wikitty.entities.Wikitty;
+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;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ * @since 3.3
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineInMemoryTest {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineInMemoryTest.class);
+
+ @Test
+ public void testfindAllByQuery() throws Exception {
+
+ // initialisation des données
+ WikittyLabelImpl l1 = new WikittyLabelImpl(new WikittyImpl("l1"));
+ l1.addLabels("toutou");
+ l1.addLabels("titi");
+
+ WikittyLabelImpl l2 = new WikittyLabelImpl(new WikittyImpl("l2"));
+
+ WikittyGroupImpl g1 = new WikittyGroupImpl(new WikittyImpl("g1"));
+ g1.setName("MonGroup1");
+ g1.addMembers(l1.getWikittyId());
+
+ WikittyGroupImpl g2 = new WikittyGroupImpl(new WikittyImpl("g2"));
+ g2.setName("MonGroup2");
+ g2.addMembers(l2.getWikittyId());
+
+ WikittyGroupImpl g3 = new WikittyGroupImpl(new WikittyImpl("g3"));
+ g3.setName("MonGroup3");
+ g3.addMembers(l1.getWikittyId());
+ g3.addMembers(l2.getWikittyId());
+
+
+ Collection<Wikitty> wikitties = new LinkedList<Wikitty>();
+ wikitties.add(l1.getWikitty());
+ wikitties.add(l2.getWikitty());
+ wikitties.add(g1.getWikitty());
+ wikitties.add(g2.getWikitty());
+ wikitties.add(g3.getWikitty());
+
+ WikittyStorageInMemory storage = new WikittyStorageInMemory();
+ storage.store(null, wikitties, false);
+
+ WikittySearchEngineInMemory se = new WikittySearchEngineInMemory(storage);
+
+ {
+ // recherche des labels
+ WikittyQuery q = new WikittyQueryMaker().eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "toutou").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // seul l1 doit etre retrouve
+ Assert.assertEquals(1, result.size());
+ Assert.assertEquals(l1.getWikittyId(), result.peek());
+ }
+
+ {
+ // recherche des du keyword 'i'
+ WikittyQuery q = new WikittyQueryMaker().keyword("i").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // seul l1 doit etre retrouve
+ Assert.assertEquals(1, result.size());
+ Assert.assertEquals(l1.getWikittyId(), result.peek());
+ }
+
+ {
+ // recherche des du keyword 'ou'
+ WikittyQuery q = new WikittyQueryMaker().keyword("ou").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // l1 et g1, g2, g3 doivent etre retrouve
+ Assert.assertEquals(4, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ l1.getWikittyId(), g1.getWikittyId(), g2.getWikittyId(), g3.getWikittyId())));
+ }
+
+ {
+ // recherche des du keyword 'ou'
+ WikittyQuery q = new WikittyQueryMaker().and().exteq(WikittyGroup.EXT_WIKITTYGROUP).keyword("ou").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // g1, g2, g3 doivent etre retrouve mais pas l1 (pas la bonne extension)
+ Assert.assertEquals(3, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g1.getWikittyId(), g2.getWikittyId(), g3.getWikittyId())));
+ }
+
+ {
+ // recherche des labels
+ WikittyQuery q = new WikittyQueryMaker().isNull(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS).end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // seul l2 doit etre retrouve
+ Assert.assertEquals(1, result.size());
+ Assert.assertEquals(l2.getWikittyId(), result.peek());
+ }
+
+ {
+ WikittyQuery q = new WikittyQueryMaker().like(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "*P2").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // seul g2 doit etre retrouve
+ Assert.assertEquals(1, result.size());
+ Assert.assertEquals(g2.getWikittyId(), result.peek());
+ }
+
+ {
+ WikittyQuery q = new WikittyQueryMaker().ew(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "p2").end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // seul g2 doit etre retrouve
+ Assert.assertEquals(1, result.size());
+ Assert.assertEquals(g2.getWikittyId(), result.peek());
+ }
+
+ { // test join
+ WikittyQuery q = new WikittyQueryMaker()
+ .join(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS)
+ .eq(WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, "titi")
+ .end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ // g1, g3 doivent etre retrouve via le join
+ Assert.assertEquals(2, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g1.getWikittyId(), g3.getWikittyId())));
+ }
+
+ { // test join
+ WikittyQuery q = new WikittyQueryMaker()
+ .or()
+ .ideq(g2.getWikittyId())
+ .join(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)
+ Assert.assertEquals(3, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g1.getWikittyId(), g2.getWikittyId(), g3.getWikittyId())));
+ }
+
+ { // test join
+ WikittyQuery q = new WikittyQueryMaker()
+ .and()
+ .not().ideq(g1.getWikittyId()).close()
+ .join(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)
+ Assert.assertEquals(1, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g3.getWikittyId())));
+ }
+
+ // TODO poussin 20111228 do more test to test all possible condition
+
+ }
+
+ @Test
+ public void findAllChildrenCount() throws Exception {
+ // don't test it not yet implemented :(
+ }
+
+}
+
1
0
r1258 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities
by bpoussin@users.nuiton.org 01 Dec '11
by bpoussin@users.nuiton.org 01 Dec '11
01 Dec '11
Author: bpoussin
Date: 2011-12-01 10:50:20 +0100 (Thu, 01 Dec 2011)
New Revision: 1258
Url: http://nuiton.org/repositories/revision/wikitty/1258
Log:
change wikitty toString behaviour
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2011-11-28 22:22:29 UTC (rev 1257)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2011-12-01 09:50:20 UTC (rev 1258)
@@ -375,4 +375,9 @@
*/
public String toString(String extName);
+ /**
+ * Print all field of all extension
+ */
+ public String toStringAllField();
+
}
\ No newline at end of file
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2011-11-28 22:22:29 UTC (rev 1257)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2011-12-01 09:50:20 UTC (rev 1258)
@@ -120,6 +120,10 @@
return target.toString(extName);
}
+ public String toStringAllField() {
+ return target.toStringAllField();
+ }
+
@Override
public int hashCode() {
return target.hashCode();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2011-11-28 22:22:29 UTC (rev 1257)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2011-12-01 09:50:20 UTC (rev 1258)
@@ -374,7 +374,14 @@
return tagValues;
}
+ /**
+ * Set all tag values. If argument is null, new empty map is created.
+ *
+ */
public void setTagValues(Map<String, String> tagValues) {
+ if (tagValues == null) {
+ tagValues = new HashMap<String, String>();
+ }
Map<String, String> oldValue = this.tagValues;
this.tagValues = tagValues;
getPropertyChangeSupport().firePropertyChange("tagValues", oldValue, tagValues);
@@ -419,7 +426,7 @@
if (StringUtils.isNotBlank(format)) {
result = WikittyUtil.format(format, wikitty);
} else {
- result = wikitty.toString();
+ result = wikitty.toStringAllField();
}
return result;
}
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-11-28 22:22:29 UTC (rev 1257)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2011-12-01 09:50:20 UTC (rev 1258)
@@ -42,11 +42,13 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ObjectUtil;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.generator.WikittyTransformerUtil;
/**
* Wikitty implementation.
@@ -940,9 +942,44 @@
public boolean isEmpty() {
return fieldValue.isEmpty();
}
-
+
+ /**
+ * Try to find extension with toString tagValue. The first tagValue found
+ * is used. If no toString tagValue found, then {@link #toStringAllField()}
+ * is used.
+ *
+ * @return
+ */
@Override
public String toString() {
+ WikittyExtension extFormat = null;
+ WikittyExtension[] exts =
+ getExtensions().toArray(new WikittyExtension[getExtensions().size()]);
+ // on parcours a l'inverse la liste, car les premieres extensions sont
+ // les extensions requises et donc moins specifiques que les dernieres
+ for (int i=exts.length-1; i>=0; i--) {
+ WikittyExtension ext = exts[i];
+ String format = ext.getTagValue(WikittyTransformerUtil.TAG_TO_STRING);
+ if (StringUtils.isNotBlank(format)) {
+ extFormat = ext;
+ break;
+ }
+ }
+
+ String result;
+ if (extFormat == null) {
+ result = toStringAllField();
+ } else {
+ result = extFormat.toString(this);
+ }
+ return result;
+ }
+
+ /**
+ * Print all field of all extension
+ */
+ @Override
+ public String toStringAllField() {
boolean cr = true;
String str = "[" + getId() + ":" + getVersion() + "] {";
for ( String extName : getExtensionNames() ) {
1
0
Author: maven-release
Date: 2011-11-28 23:22:29 +0100 (Mon, 28 Nov 2011)
New Revision: 1257
Url: http://nuiton.org/repositories/revision/wikitty/1257
Log:
Update mavenpom4redmine to 3.0.6.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-11-22 13:50:13 UTC (rev 1256)
+++ trunk/pom.xml 2011-11-28 22:22:29 UTC (rev 1257)
@@ -6,7 +6,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.5</version>
+ <version>3.0.6</version>
</parent>
<!-- ************************************************************* -->
1
0