Author: bpoussin Date: 2013-02-25 01:57:54 +0100 (Mon, 25 Feb 2013) New Revision: 1554 Url: http://nuiton.org/projects/wikitty/repository/revisions/1554 Log: fixes #2544: Improve WikittyQueryResult, result must have wikitty id and select result in same time Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionAvg.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionCount.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionDistinct.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFieldValue.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFusion.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMax.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMin.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionSum.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionValue.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunction.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunctionWrapper.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -37,6 +37,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -775,7 +776,7 @@ if (queries != null) { if (clazz != null && BusinessEntity.class.isAssignableFrom(clazz)) { // on demande un business entity donc on modifie - // pas les criteres pour ajouter les contraintes sur les + // les criteres pour ajouter les contraintes sur les // extensions // newInstance only return BusinessEntityWikittyImpl @@ -1010,7 +1011,7 @@ long start = TimeLog.getTime(); List<WikittyQueryResult<Map<String, Object>>> result = null; if (query != null) { - result = wikittyService.<Map<String, Object>>findAllByQuery(securityToken, query); + result = wikittyService.findAllByQuery(securityToken, query); } timeLog.log(start, "findAllByQuery(List)"); return result; @@ -1757,214 +1758,6 @@ return user; } - -// /** -// * Convert all objects in list parameter to the wanted type and return -// * new List. -// * For business object transformation, if some -// * result don't have the right extension (clazz) this extension is -// * automatically added. -// * -// * If possible this method don't instanciated new Object. If e is Wikitty -// * and wanted target is Wikitty a simple cast is done. -// * -// * @param target to cast into. -// * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[] -// * @param objects objects to convert -// * @return List objects in right class or Exception. -// * if conversion is impossible -// * @since 3.4 -// */ -// public <E, F> List<E> castTo(Class<E> target, List<F> objects) { -// List<E> result; -// -// if (objects == null) { -// result = null; -// } else if (target.isAssignableFrom(Object.class)) { -// // on demande la conversion en Object, donc aucune conversion -// result = new ArrayList<E>((List<E>)objects); -// }else if (objects.size() == 0) { -// // on ne fait rien on met juste une nouvelle liste vide -// result = new ArrayList<E>(); -// } else if (Wikitty.class.isAssignableFrom(target)) { -// // On veut des Wikitties en sortie -// -// Object first = objects.get(0); -// if (first instanceof Wikitty) { -// // W, rien a faire -// result = (List<E>)objects; -// } else if (first instanceof BusinessEntityImpl) { -// // BusinessEntityImpl, il faut recuperer les wikitty -// result = new ArrayList<E>(objects.size()); -// for (BusinessEntityImpl e : (List<BusinessEntityImpl>)objects) { -// result.add((E)e.getWikitty()); -// } -// } else if (first instanceof BusinessEntity) { -// // BusinessEntity, il faut faire un restore puis remettre la -// // valeur des champs dans les wikitties recuperes -// -// // on collecte tous les ids -// List<String> ids = new ArrayList(objects.size()); -// for (BusinessEntity e : (List<BusinessEntity>)objects) { -// ids.add(e.getWikittyId()); -// } -// -// List<BusinessEntity> business = (List<BusinessEntity>)objects; -// List<Wikitty> wikitties = restore(ids); -// Class entityClass = first.getClass(); -// -// result = (List<E>)createWikittyFromBusinessEntity(entityClass, business, wikitties); -// } else if (first 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>) objects; -// result = (List<E>)restore(ids); -// } else { -// throw new ClassCastException("WikittyQueryResult don't contains" -// + " object convertible to Wikitty" -// + " (accepted Wikitty, BusinessEntityImpl, String id) but not " -// + first.getClass()); -// } -// } else if (BusinessEntity.class.isAssignableFrom(target)) { -// // on commence par tout mettre en Wikitty, en utilisant le if du dessus -// List<Wikitty> resultTmp = castTo(Wikitty.class, objects); -// result = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp); -// } else if (Number.class.isAssignableFrom(target)) { -// result = new ArrayList<E>(objects.size()); -// for (Object o : objects) { -// BigDecimal v = WikittyUtil.toBigDecimal(o); -// Number n = WikittyUtil.toNumber(target, v); -// result.add((E)n); -// } -// } else if (Date.class.isAssignableFrom(target)) { -// result = new ArrayList<E>(objects.size()); -// for (Object o : objects) { -// Date v = WikittyUtil.toDate(o); -// result.add((E)v); -// } -// } else if (Boolean.class.isAssignableFrom(target)) { -// result = new ArrayList<E>(objects.size()); -// for (Object o : objects) { -// Boolean v = WikittyUtil.toBoolean(o); -// result.add((E)v); -// } -// } else if (byte[].class.isAssignableFrom(target)) { -// result = new ArrayList<E>(objects.size()); -// for (Object o : objects) { -// byte[] v = WikittyUtil.toBinary(o); -// result.add((E)v); -// } -// } else if (String.class.isAssignableFrom(target)) { -// result = new ArrayList<E>(objects.size()); -// for (Object o : objects) { -// String v = WikittyUtil.toString(o); -// result.add((E)v); -// } -// }else { -// throw new ClassCastException(String.format( -// "Object list don't contains" -// + " object convertible to %s" -// + " (accepted Wikitty, BusinessEntityImpl, String id, Date," -// + " BigDecimal, Boolean, byte[]) but not '%s'", -// target.getName(), objects.get(0).getClass())); -// } -// -// return result; -// } -// -// /** -// * Convert all objects in list parameter to the wanted type and return -// * new List. -// * For business object transformation, if some -// * result don't have the right extension (clazz) this extension is -// * automatically added. -// * -// * If possible this method don't instanciated new Object. If e is Wikitty -// * and wanted target is Wikitty a simple cast is done. -// * -// * @param target to cast into. -// * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[] -// * @param objects objects to convert -// * @return List objects in right class or Exception. -// * if conversion is impossible -// * @since 3.4 -// */ -// public <E, F> List<Map<String, E>> castToMap(Class<E> target, List<Map> objects) { -// List<Map<String, E>> result; -// -// if (objects == null) { -// result = null; -// } else if (target.isAssignableFrom(Object.class)) { -// // on demande la conversion en Object, donc aucune conversion -// result = new ArrayList(objects); -// } else if (objects.size() == 0) { -// // on ne fait rien on met juste une nouvelle liste vide -// result = new ArrayList<Map<String, E>>(); -// } else { -// for (Map map : objects) { -// if (map != null) { -// Set<Map.Entry> s = map.entrySet(); -// for (Map.Entry entry : s) { -// Object value = entry.getValue(); -// if (Wikitty.class.isAssignableFrom(target)) { -// // On veut des Wikitties en sortie -// if (value == null) { -// // rien a faire -// } else if (value instanceof Wikitty) { -// // W, rien a faire -// } else if (value 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 :) -// entry.setValue((E)restore((String)value)); -// } else { -// throw new ClassCastException("WikittyQueryResult don't contains" -// + " object convertible to Wikitty" -// + " (accepted Wikitty, String id) but not " -// + value.getClass()); -// } -// } else if (BusinessEntity.class.isAssignableFrom(target)) { -// // on commence par tout mettre en Wikitty, en utilisant le if du dessus -// Wikitty resultTmp = castTo(Wikitty.class, value); -// E business = (E)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp); -// entry.setValue(business); -// } else if (Number.class.isAssignableFrom(target)) { -// BigDecimal v = WikittyUtil.toBigDecimal(value); -// Number n = WikittyUtil.toNumber(target, v); -// entry.setValue((E)n); -// } else if (Date.class.isAssignableFrom(target)) { -// Date v = WikittyUtil.toDate(value); -// entry.setValue((E)v); -// } else if (Boolean.class.isAssignableFrom(target)) { -// Boolean v = WikittyUtil.toBoolean(value); -// entry.setValue((E)v); -// } else if (byte[].class.isAssignableFrom(target)) { -// byte[] v = WikittyUtil.toBinary(value); -// entry.setValue((E)v); -// } else if (String.class.isAssignableFrom(target)) { -// String v = WikittyUtil.toString(value); -// entry.setValue((E)v); -// }else { -// throw new ClassCastException(String.format( -// "Object list don't contains" -// + " object convertible to %s" -// + " (accepted Wikitty, BusinessEntityImpl, String id, Date," -// + " BigDecimal, Boolean, byte[]) but not '%s'", -// target.getName(), objects.get(0).getClass())); -// } -// } -// } -// } -// // tous les objets ont ete converti, on force le cast -// result = (List)objects; -// } -// -// return result; -// } - /** * Convert e parameter to the wanted type and return it. * For business object transformation, if some @@ -2008,24 +1801,7 @@ */ public <E> WikittyQueryResult<E> castTo(Class<E> target, WikittyQueryResult queryResult) { - WikittyQueryResult<E> result; - - if (target == null || Map.class.isAssignableFrom(target)) { - result = (WikittyQueryResult<E>)queryResult; - } else { - long startTime = System.nanoTime(); - WikittyQueryResult queryResultFlated = queryResult.convertMapToSimple(); - - List<E> castedResult = castTo(target, queryResultFlated.getAll()); - long estimatedTime = System.nanoTime() - startTime; - - result = new WikittyQueryResult<E>( - queryResult.getQueryName(), - queryResult.getOffset(), queryResult.getTotalResult(), - queryResult.getQueryString(), queryResult.getFacets(), - castedResult, queryResult.getTimeQuery(), estimatedTime); - } - + WikittyQueryResult<E> result = queryResult.castTo(this, target); return result; } @@ -2041,28 +1817,12 @@ * @return new WikittyQueryResult with element in right class or Exception * if conversion is impossible */ - public <E> WikittyQueryResult<Map<String, E>> castToMap(Class<E> target, - WikittyQueryResult<Map> queryResult) { - WikittyQueryResult<Map<String, E>> result; - - long startTime = System.nanoTime(); - - List<Map<String, E>> castedResult = castToMap(target, queryResult.getAll()); - long estimatedTime = System.nanoTime() - startTime; - - result = new WikittyQueryResult<Map<String, E>>( - queryResult.getQueryName(), - queryResult.getOffset(), queryResult.getTotalResult(), - queryResult.getQueryString(), queryResult.getFacets(), - castedResult, - queryResult.getTimeQuery(), estimatedTime); - + public <E, F> WikittyQueryResult<Map<String, E>> castToMap(Class<E> target, + WikittyQueryResult<Map<String, F>> queryResult) { + WikittyQueryResult<Map<String, E>> result = queryResult.castToMap(this, target); return result; } - - - public <O, N, E extends Map<String, O>, F extends Map<String, N>> List<E> castToMap(Class<O> target, List<F> objects) { List result = castTo(target, objects); return result; @@ -2160,54 +1920,4 @@ return result; } - - - - -// -// protected List<Wikitty> createWikittyFromBusinessEntity(Class entityClass, List<BusinessEntity> objects, List<Wikitty> w) { -// // on copie les champs des entities dans les wikitties recuperes -// // try settings all fields except version -// try { -// // les entites a mettre dans les wikitties -// BusinessEntity[] entities = objects.toArray(new BusinessEntity[objects.size()]); -// // les wikitties qui seront les resultats -// Wikitty[] wikitties = w.toArray(new Wikitty[w.size()]); -// -// //get all fields -// 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())); -// -// for(int i=0; i<entities.length; i++) { -// if (wikitties[i] != null) { -// // le wikitty peut etre null, par exemple a cause de la security -// Object value = m.invoke(entities[i]); -// wikitties[i].setFqField(fieldFQN, value); -// } -// } -// } -// } -// //manually set version -// for(int i=0; i<entities.length; i++) { -// if (wikitties[i] != null) { -// // le wikitty peut etre null, par exemple a cause de la security -// wikitties[i].setWikittyVersion(entities[i].getWikittyVersion()); -// } -// } -// return w; -// } catch (Exception eee) { -// throw new WikittyException("Could not transform entity to Wikitty", eee); -// } -// -// } } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -366,7 +366,10 @@ * @param queries * @return wikitty id object or null * @since 3.3 + * @deprecated since 3.10 use {@link #findAllByQuery(java.lang.String, java.util.List)} + * with singleton list or encapsulate WikittyService in {@link WikittyClient} to use findBy method */ + @Deprecated public List<Map<String, Object>> findByQuery(String securityToken, List<WikittyQuery> queries); /* Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -399,8 +399,8 @@ WikittyQueryResult<Wikitty> queryResult = new WikittyQueryResult( pagedResult.getCriteriaName(), pagedResult.getFirstIndice(), - pagedResult.getNumFound(), pagedResult.getQueryString(), facet, - pagedResult.getAll(), 0, 0); + pagedResult.getNumFound(), null, pagedResult.getQueryString(), + pagedResult.getAll(), null, null, facet, 0, 0); exportWriter(client, writer, queryResult); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -221,8 +221,8 @@ WikittyQueryResult<Wikitty> queryResult = new WikittyQueryResult( pagedResult.getCriteriaName(), pagedResult.getFirstIndice(), - pagedResult.getNumFound(), pagedResult.getQueryString(), null, - pagedResult.getAll(), 0, 0); + pagedResult.getNumFound(), null, pagedResult.getQueryString(), + pagedResult.getAll(), null, null,null, 0, 0); exportWriter(client, result, queryResult); } 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 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -215,12 +215,40 @@ /** * Indique si la query commence par une clause Select * @return + * @since 3.9 */ public boolean isSelectQuery() { boolean result = condition instanceof Select; return result; } + /** + * Retourne la clause Select de la Query, ou null si la query n'a pas de select + * @return + * @since 3.10 + */ + public Select getSelect() { + Select result = null; + if (isSelectQuery()) { + result = (Select)getCondition(); + } + return result; + } + + /** + * retourne la clause where de la query, la clause where peut-etre la meme + * chose que le {@link #getCondition} si la clause n'a pas de select + * @return + * @since 3.10 + */ + public Condition getWhere() { + Condition result = getCondition(); + if (isSelectQuery()) { + result = getSelect().getSubCondition(); + } + return result; + } + public void accept(WikittyQueryVisitor visitor) { boolean walk = visitor.visitEnter(this); if (walk && condition != null) { @@ -323,8 +351,9 @@ return this; } - public void setFacetSort(FacetSortType facetSort) { + public WikittyQuery setFacetSort(FacetSortType facetSort) { this.facetSort = facetSort; + return this; } public FacetSortType getFacetSort() { 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 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -32,10 +32,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyClient; import org.nuiton.wikitty.WikittyUtil; +import org.nuiton.wikitty.entities.BusinessEntity; import org.nuiton.wikitty.entities.Element; /** @@ -65,15 +67,24 @@ protected int totalResult; /** query really executed (internal representation depend of search engine used */ protected String queryString; + /** query used to produce initial WikittyQueryResult */ + protected WikittyQuery query; + /** list of result in the wanted interval */ protected List<T> results; + /** Wikitty ids resulting of where clause */ + protected List<String> wikittyIdResult; + /** if query contains select clause, contains select result */ + protected List<Map<String, Object>> selectResult; /** 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; + transient protected Map<String, Map<String, FacetTopic>> facetsAsMap = null; + /** temps (nanoseconde) mis pour faire la requete (calcul cote serveur)*/ protected long timeQuery; /** temps (nanoseconde) de transformation des resultats bruts en un autre type(calcul cote client)*/ @@ -92,15 +103,21 @@ * @param results list of result in the wanted interval */ public WikittyQueryResult(String queryName, - int offset, int totalResult, String queryString, - Map<String, List<FacetTopic>> facets, List<T> results, + int offset, int totalResult, WikittyQuery query, String queryString, + List<T> results, + List<Map<String, Object>> selectResult, + List<String> wikittyIdResult, + Map<String, List<FacetTopic>> facets, long timeQuery, long timeConvertion) { this.queryName = queryName; this.offset = offset; this.totalResult = totalResult; + this.query = query; this.queryString = queryString; + this.results = Collections.unmodifiableList(results); + this.selectResult = selectResult; + this.wikittyIdResult = wikittyIdResult; this.facets = facets; - this.results = Collections.unmodifiableList(results); this.timeQuery = timeQuery; this.timeConvertion = timeConvertion; } @@ -131,8 +148,9 @@ } result = new WikittyQueryResult<E>( - queryName, offset, totalResult, queryString, facets, - data, timeQuery, timeConvertion); + queryName, offset, totalResult, query, queryString, + data, selectResult, wikittyIdResult, facets, + timeQuery, timeConvertion); } return result; @@ -147,12 +165,14 @@ } WikittyQueryResult<String> result = new WikittyQueryResult<String>( - queryName, offset, totalResult, queryString, facets, - data, timeQuery, timeConvertion); + queryName, offset, totalResult, query, queryString, + data, selectResult, wikittyIdResult, facets, + timeQuery, timeConvertion); return result; } + /** nom du critere qui a ete uitilise (peut-etre null) si le critete n'avait pas de nom */ public String getQueryName() { return queryName; } @@ -166,19 +186,176 @@ return offset; } + /** indice of offset result in global search result */ public int getOffset() { return offset; } + /** total number of result if we call the query for all possible result */ public int getTotalResult() { return totalResult; } + /** query really executed (internal representation depend of search engine used */ public String getQueryString() { return queryString; } /** + * Return query used to initialise the first WikittyQueryResult (before + * some transformation with getSelect or getWikitties). This query is + * query realy send to server after some modification by WikittyClient if + * necessary + * @return + * @since 3.10 + */ + public WikittyQuery getQuery() { + return query; + } + + /** + * retourne le nombre de wikitty actuellement disponible dans le resultat + * @return + * @since 3.10 + */ + public int getWikittyResultSize() { + int result = 0; + if (wikittyIdResult != null) { + result = wikittyIdResult.size(); + } + return result; + } + + /** + * Retourne un nouveau WikittyQueryResult avec comme resultat la liste + * des ids des wikitties selectionnes par la Query initiale + * @return + * @since 3.10 + */ + public WikittyQueryResult<String> getWikittyResult() { + WikittyQueryResult<String> result = new WikittyQueryResult<String>( + queryName, offset, totalResult, query, queryString, + wikittyIdResult, selectResult, wikittyIdResult, facets, + timeQuery, timeConvertion); + return result; + } + + /** + * Retourne un nouveau WikittyQueryResult avec comme resultat une liste + * de BusinessEntity du type de la class passee en parametre a partir + * des ids des wikitties selectionnes par la Query initiale + * @return + * @since 3.10 + */ + public <E extends BusinessEntity> WikittyQueryResult<E> getWikittyResult( + WikittyClient client, Class<E> clazz) { + WikittyQueryResult<E> result = getWikittyResult().castTo(client, clazz); + return result; + } + + /** + * Indique s'il y a des resultats de select on non + * @return + * @since 3.10 + */ + public boolean hasSelectResult() { + boolean result = CollectionUtils.isNotEmpty(selectResult); + return result; + } + + /** + * Le nombre de map contenu dans le resultat de select + * @return + * @since 3.10 + */ + public int selectResultSize() { + int result = 0; + if (hasSelectResult()) { + result = selectResult.size(); + } + return result; + } + + /** + * Retourne la liste liste des noms disponible comme resulat de select + * @return + * @since 3.10 + */ + public List<String> getSelectResultName() { + List<String> result = null; + if (hasSelectResult()) { + Map<String, Object> first = selectResult.get(0); + result = new ArrayList<String>(first.keySet()); + } + return result; + } + + /** + * Retourne les resultats de select + * @return + * @since 3.10 + */ + public WikittyQueryResult<Map<String, Object>> getSelectResult() { + WikittyQueryResult<Map<String, Object>> result = null; + if (hasSelectResult()) { + result = new WikittyQueryResult<Map<String, Object>>( + queryName, offset, totalResult, query, queryString, + selectResult, selectResult, wikittyIdResult, facets, + timeQuery, timeConvertion); + } + return result; + } + + /** + * Retourne les resultats de select transforme en objet de type clazz + * + * @param <E> + * @param client + * @param clazz + * @return + * @since 3.10 + */ + public <E> WikittyQueryResult<Map<String, E>> getSelectResult( + WikittyClient client, Class<E> clazz) { + WikittyQueryResult<Map<String, E>> result = getSelectResult().castToMap(client, clazz); + return result; + } + + /** + * Retourne les resultats de select pour le champs demande + * + * @param resultName + * @return + * @since 3.10 + */ + public WikittyQueryResult<Object> getSelectResult(String resultName) { + List<Object> data = new ArrayList(selectResultSize()); + for (Map<String, Object> m : selectResult) { + data.add(m.get(resultName)); + } + WikittyQueryResult<Object> result = new WikittyQueryResult<Object>( + queryName, offset, totalResult, query, queryString, + data, selectResult, wikittyIdResult, facets, + timeQuery, timeConvertion); + return result; + } + + /** + * Retourne les resultats de select pour le champs demande et le transforme + * en objet de type clazz + * + * @param resultName + * @return + * @since 3.10 + */ + public <E> WikittyQueryResult<E> getSelectResult( + WikittyClient client, Class<E> clazz, String resultName) { + WikittyQueryResult<E> result = getSelectResult(resultName).castTo(client, clazz); + return result; + } + + + /** * Return name of all facet used in query. * * @return result's facets names @@ -376,4 +553,70 @@ return result; } + + /** + * 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, Number (returned is BigDecimal), Boolean, byte[] + * @return new WikittyQueryResult with element in right class or Exception + * if conversion is impossible + * @since 3.10 + */ + public <E> WikittyQueryResult<E> castTo(WikittyClient client, Class<E> target) { + WikittyQueryResult<E> result; + + if (target == null || Map.class.isAssignableFrom(target)) { + result = (WikittyQueryResult<E>)this; + } else { + long startTime = System.nanoTime(); + WikittyQueryResult queryResultFlated = convertMapToSimple(); + + List<E> castedResult = client.castTo(target, queryResultFlated.getAll()); + long estimatedTime = System.nanoTime() - startTime; + + result = new WikittyQueryResult<E>( + queryName, offset, totalResult, query, queryString, + castedResult, selectResult, wikittyIdResult, facets, + timeQuery, estimatedTime); + } + + return result; + } + + /** + * 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, Number (returned is BigDecimal), Boolean, byte[] + * @return new WikittyQueryResult with element in right class or Exception + * if conversion is impossible + * @since 3.10 + */ + public <E, F> WikittyQueryResult<Map<String, E>> castToMap( + WikittyClient client, Class<E> target) { + WikittyQueryResult<Map<String, E>> result; + + long startTime = System.nanoTime(); + + List<Map<String, E>> castedResult = client.castToMap(target, + (List<Map<String, F>>)this.getAll()); + long estimatedTime = System.nanoTime() - startTime; + + result = new WikittyQueryResult<Map<String, E>>( + queryName, offset, totalResult, query, queryString, + castedResult, selectResult, wikittyIdResult, facets, + timeQuery, estimatedTime); + + return result; + } + } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionAvg.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionAvg.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionAvg.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -73,11 +73,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - data = f.call(searchEngine, tx, query, data); + data = f.call(query, data); BigDecimal total = new BigDecimal(0); int cpt = 0; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionCount.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionCount.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionCount.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -70,11 +70,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - data = f.call(searchEngine, tx, query, data); + data = f.call(query, data); int cpt = 0; for (Map<String, Object> o : data) { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionDistinct.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionDistinct.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionDistinct.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -61,14 +61,13 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { List<List<Map<String, Object>>> extractedData = new ArrayList<List<Map<String, Object>>>(); for (WikittyQueryFunction f : getArgs()) { - List<Map<String, Object>> r = f.call(searchEngine, tx, query, data); + List<Map<String, Object>> r = f.call(query, data); extractedData.add(r); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFieldValue.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFieldValue.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFieldValue.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -74,11 +74,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - List<Map<String, Object>> fieldName = f.call(searchEngine, tx, query, data); + List<Map<String, Object>> fieldName = f.call(query, data); String field = getUniqueValue(fieldName).toString(); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFusion.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFusion.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionFusion.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -63,13 +63,12 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { try { List<List<Map<String, Object>>> all = new ArrayList<List<Map<String, Object>>>(); for (WikittyQueryFunction f : getArgs()) { - all.add(f.call(searchEngine, tx, query, data)); + all.add(f.call(query, data)); } List<Map<String, Object>> result = fusion(all); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMax.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMax.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMax.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -70,11 +70,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - data = f.call(searchEngine, tx, query, data); + data = f.call(query, data); Comparable candidate = null; for (Map<String, Object> m : data) { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMin.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMin.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionMin.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -70,11 +70,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - data = f.call(searchEngine, tx, query, data); + data = f.call(query, data); Comparable candidate = null; for (Map<String, Object> m : data) { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionSum.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionSum.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionSum.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -72,11 +72,10 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { WikittyQueryFunction f = getArgs().get(0); - data = f.call(searchEngine, tx, query, data); + data = f.call(query, data); BigDecimal total = new BigDecimal(0); for (Map<String, Object> o : data) { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionValue.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionValue.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/FunctionValue.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -69,7 +69,6 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { ListObjectOrMap result = new ListObjectOrMap(); result.add(getName(), getValue()); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunction.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunction.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunction.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -31,9 +31,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.ConstructorUtils; @@ -73,6 +70,8 @@ /** le nombre d'argument que la function peut prendre. Integer.MAX_VALUE = infini */ protected int numArg = Integer.MAX_VALUE; + abstract public List<Map<String, Object>> call( + WikittyQuery query, List<Map<String, Object>> data); static public WikittyQueryFunction createFusionIfNeeded(List<WikittyQueryFunction> args) { WikittyQueryFunction result; @@ -226,10 +225,6 @@ return result; } - abstract public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, - WikittyQuery query, List<Map<String, Object>> data); - @Override public String toString() { WikittyQueryVisitorToString v = new WikittyQueryVisitorToString(); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunctionWrapper.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunctionWrapper.java 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/function/WikittyQueryFunctionWrapper.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -65,13 +65,12 @@ @Override public List<Map<String, Object>> call( - WikittySearchEngine searchEngine, WikittyTransaction tx, WikittyQuery query, List<Map<String, Object>> data) { List<List<Map<String, Object>>> param = new ArrayList<List<Map<String, Object>>>(); // on evalue les parametres que l'on passera a la fonction for (WikittyQueryFunction f : getArgs()) { - param.add(f.call(searchEngine, tx, query, data)); + param.add(f.call(query, data)); } // on recherche la fonction et on instancie si besoin un objet pour l'executer 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 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -25,11 +25,11 @@ package org.nuiton.wikitty.services; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -45,10 +45,13 @@ import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.WikittyServiceFactory; +import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.Element; +import org.nuiton.wikitty.query.ListObjectOrMap; import org.nuiton.wikitty.query.WikittyQuery; import org.nuiton.wikitty.query.WikittyQueryResult; import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; +import org.nuiton.wikitty.query.conditions.Select; import org.nuiton.wikitty.search.Search; import org.nuiton.wikitty.search.TreeNodeResult; @@ -392,7 +395,7 @@ throw new UnsupportedOperationException("Not supported yet."); } - // FIXME poussin 20130218 a revoir car, lorsqu'elle a ete implanter, on ne retournait que des ids. Il est maintenantes possible de retourner des Maps + // FIXME poussin 20130218 a revoir car les order by, les facets, limit et offset ne sont pas respecte :( @Override public List<WikittyQueryResult<Map<String, Object>>> findAllByQuery( String securityToken, List<WikittyQuery> queries) { @@ -404,6 +407,7 @@ List<WikittyQueryResult<Map<String, Object>>> result = new ArrayList<WikittyQueryResult<Map<String, Object>>>(resultWsList.size()); for (int i=0; i<queries.size(); i++) { + WikittyQuery query = queries.get(i); WikittyQueryResult<Map<String, Object>> resultTx = resultTxList.get(i); WikittyQueryResult<Map<String, Object>> resultWs = resultWsList.get(i); // Il faut fusionner les deux resultats @@ -412,19 +416,46 @@ // en respectant l'ordre de tri demande (comment faire?) // - fusionner les facettes (comment faire ?) // - respecter le range demander (comment faire, avec les suppressions possible ?) - LinkedHashSet<Map<String, Object>> ids = - new LinkedHashSet<Map<String, Object>>(resultTx.size() + resultWs.size()); - ids.addAll(resultTx.getAll()); - for (Map<String, Object> map : resultWs.getAll()) { - String id = (String)map.get(Element.ID.getValue()); + LinkedHashSet<String> ids = + new LinkedHashSet<String>(resultTx.getWikittyResultSize() + resultWs.getWikittyResultSize()); + ids.addAll(resultTx.getWikittyResult().getAll()); + for (String id : resultWs.getWikittyResult().getAll()) { if ((!tx.exists(securityToken, id) || !tx.isDeleted(securityToken, id))) { - ids.add(map); + ids.add(id); } else { // pas un id, donc on ne sais pas encore comment faire :(. On l'ajoute - ids.add(map); + ids.add(id); } } + List<String> wikittyId = new ArrayList<String>(ids); + List<Map<String, Object>> selectFusion = null; + if (query.isSelectQuery()) { + List<Map<String, Object>> values = new ArrayList<Map<String, Object>>(wikittyId.size()); + List<Wikitty> wikitties = restore(securityToken, wikittyId); + for (Wikitty w : wikitties) { + Map<String, Object> map = new LinkedHashMap<String, Object>(w.getFieldValue()); + map.put(org.nuiton.wikitty.entities.Element.ID.getValue(), w.getWikittyId()); + values.add(map); + } + + Select select = (Select)query.getCondition(); + selectFusion = select.getFunction().call(query, values); + } + + List<Map<String, Object>> results; + if (query.isSelectQuery()) { + // on met selectFusion dans result + results = selectFusion; + } else { + // on met les ids dans results + results = new ArrayList<Map<String, Object>>(ids.size()); + String key = Element.ID.getValue(); + for (String id : ids) { + results.add(WikittyUtil.singletonMap(key, id)); + } + } + String queryName = resultWs.getQueryName(); int firstIndice = resultWs.getOffset(); // FIXME le resultat est faux, le nombre total n'est pas la somme des deux :( @@ -432,11 +463,12 @@ String queryString = resultWs.getQueryString(); // FIXME les facettes sont fausses :( Map<String, List<org.nuiton.wikitty.query.FacetTopic>> facets = resultWs.getFacets(); - List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(ids); long timeQuery = resultTx.getTimeQuery() + resultWs.getTimeQuery(); - result.add(new WikittyQueryResult<Map<String, Object>>(queryName, - firstIndice, numFound, queryString, facets, results, timeQuery, 0)); + result.add(new WikittyQueryResult<Map<String, Object>>( + queryName, firstIndice, numFound, query, queryString, + results, selectFusion, wikittyId, facets, + timeQuery, 0)); } if (queries.size() != result.size()) { 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 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -370,6 +370,7 @@ } List<Map<String, Object>> values = new ArrayList<Map<String, Object>>(ids.size()); + List<Map<String, Object>> selectResult = null; if (select == null) { String idTag = org.nuiton.wikitty.entities.Element.ID.getValue(); for (Object id : ids) { @@ -384,13 +385,16 @@ values.add(map); } - values = select.getFunction().call(this, transaction, query, values); + values = select.getFunction().call(query, values); + selectResult = values; } - WikittyQueryResult<Map<String, Object>> result = new WikittyQueryResult<Map<String, Object>>(queryWithoutSelect.getName(), - offset, totalResult, queryWithoutSelect.getCondition().toString(), - facets.getFacets(), values, 0, 0); + WikittyQueryResult<Map<String, Object>> result = + new WikittyQueryResult<Map<String, Object>>( + queryWithoutSelect.getName(), offset, totalResult, + query, queryWithoutSelect.getCondition().toString(), + values, selectResult, ids, facets.getFacets(), 0, 0); return result; } 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 2013-02-24 13:10:11 UTC (rev 1553) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2013-02-25 00:57:54 UTC (rev 1554) @@ -75,6 +75,8 @@ import org.nuiton.wikitty.storage.WikittyExtensionStorage; import org.nuiton.wikitty.storage.WikittySearchEngine; +import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_ID; + /** * * @author poussin @@ -679,15 +681,16 @@ } @Override - public WikittyQueryResult<Map<String, Object>> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) { + public WikittyQueryResult<Map<String, Object>> findAllByQuery( + WikittyTransaction transaction, WikittyQuery query) { try { // la condition select du query, sera traite a la fin Select select = null; WikittyQuery queryWithoutSelect = query; - if (query.getCondition() instanceof Select) { - select = (Select)query.getCondition(); + if (query.isSelectQuery()) { + select = query.getSelect(); Condition newCond = select.getSubCondition(); if (newCond == null) { newCond = new org.nuiton.wikitty.query.conditions.True(); @@ -818,13 +821,20 @@ // Get total num found int numFound = (int)resp.getResults().getNumFound(); + // collecte des id + List<String> wikittyId = new ArrayList<String>(solrResults.size()); + for (SolrDocument doc : solrResults) { + String id = SolrUtil.getStringFieldValue(doc, SOLR_ID); + wikittyId.add(id); + } + + List<Map<String, Object>> selectResult = null; List<Map<String, Object>> values = - new ArrayList<Map<String, Object>>(solrResults.size()); + new ArrayList<Map<String, Object>>(wikittyId.size()); if (select == null) { // Extract ids String idTag = org.nuiton.wikitty.entities.Element.ID.getValue(); - for (SolrDocument doc : solrResults) { - Object id = SolrUtil.getStringFieldValue(doc, SOLR_ID); + for (Object id : wikittyId) { values.add(WikittyUtil.singletonMap(idTag, id)); } } else { @@ -834,14 +844,16 @@ values.add(map); } - values = select.getFunction().call(this, transaction, query, values); - + values = select.getFunction().call(query, values); + selectResult = values; } // Build paged result - WikittyQueryResult result = new WikittyQueryResult(query.getName(), - offset, numFound, queryString, facets, values, 0, 0); + WikittyQueryResult result = new WikittyQueryResult( + query.getName(), offset, numFound, query, queryString, + values, selectResult, wikittyId, facets, + 0, 0); return result; } catch (SolrServerException eee) {