r1555 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-api/src/main/java/org/nuiton/wikitty/storage wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
Author: bpoussin Date: 2013-02-25 12:31:36 +0100 (Mon, 25 Feb 2013) New Revision: 1555 Url: http://nuiton.org/projects/wikitty/repository/revisions/1555 Log: factorisation de la recuperation d'une copie de query sans select et utilisation pour WikittyServiceTransaction Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.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/query/WikittyQuery.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2013-02-25 00:57:54 UTC (rev 1554) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2013-02-25 11:31:36 UTC (rev 1555) @@ -249,6 +249,21 @@ return result; } + /** + * retourne une copie de cette query sans la clause select. Si cette + * query n'avait pas de select la query retournee est strictement equivalente. + * + * @return + * @since 3.10 + */ + public WikittyQuery getWhereQuery() { + Condition newCond = getWhere(); + // copy de la query sans le select + WikittyQuery result = this.copy(); + result.setCondition(newCond); + return result; + } + public void accept(WikittyQueryVisitor visitor) { boolean walk = visitor.visitEnter(this); if (walk && condition != null) { 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-25 00:57:54 UTC (rev 1554) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2013-02-25 11:31:36 UTC (rev 1555) @@ -399,18 +399,36 @@ @Override public List<WikittyQueryResult<Map<String, Object>>> findAllByQuery( String securityToken, List<WikittyQuery> queries) { + + // on recree une liste avec seulement les clause where + List<WikittyQuery> queriesWhere = new ArrayList<WikittyQuery>(); + for (WikittyQuery q : queries) { + if (q.isSelectQuery()) { + queriesWhere.add(q.getWhereQuery()); + } else { + queriesWhere.add(q); + } + } + + // on ne joue que les clauses where car le select sera rejouer completement List<WikittyQueryResult<Map<String, Object>>> resultTxList = - tx.findAllByQuery(securityToken, queries); + tx.findAllByQuery(securityToken, queriesWhere); List<WikittyQueryResult<Map<String, Object>>> resultWsList = - ws.findAllByQuery(securityToken, queries); + ws.findAllByQuery(securityToken, queriesWhere); List<WikittyQueryResult<Map<String, Object>>> result = - new ArrayList<WikittyQueryResult<Map<String, Object>>>(resultWsList.size()); + new ArrayList<WikittyQueryResult<Map<String, Object>>>(queries.size()); for (int i=0; i<queries.size(); i++) { + long timeStart = System.currentTimeMillis(); + 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 + // + // - ne pas avoir de doublon // - ne pas retenir ceux supprimer dans la transaction // en respectant l'ordre de tri demande (comment faire?) @@ -429,20 +447,30 @@ } List<String> wikittyId = new ArrayList<String>(ids); + // + // il faut calculer le select + // List<Map<String, Object>> selectFusion = null; if (query.isSelectQuery()) { List<Map<String, Object>> values = new ArrayList<Map<String, Object>>(wikittyId.size()); + // recuperation des wikitties pour pouvoir jouer le select List<Wikitty> wikitties = restore(securityToken, wikittyId); + // transformation des wikitties en Map avec l'id dans la map + String idKey = Element.ID.getValue(); 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()); + map.put(idKey, w.getWikittyId()); values.add(map); } + // rejoue du select Select select = (Select)query.getCondition(); selectFusion = select.getFunction().call(query, values); } + // + // il faut assigner le resultat principal (select ou wikittyId) + // List<Map<String, Object>> results; if (query.isSelectQuery()) { // on met selectFusion dans result @@ -450,9 +478,9 @@ } else { // on met les ids dans results results = new ArrayList<Map<String, Object>>(ids.size()); - String key = Element.ID.getValue(); + String idKey = Element.ID.getValue(); for (String id : ids) { - results.add(WikittyUtil.singletonMap(key, id)); + results.add(WikittyUtil.singletonMap(idKey, id)); } } @@ -463,8 +491,10 @@ String queryString = resultWs.getQueryString(); // FIXME les facettes sont fausses :( Map<String, List<org.nuiton.wikitty.query.FacetTopic>> facets = resultWs.getFacets(); - long timeQuery = resultTx.getTimeQuery() + resultWs.getTimeQuery(); + long timeEnd = System.currentTimeMillis(); + long timeQuery = resultTx.getTimeQuery() + resultWs.getTimeQuery() + timeEnd - timeStart; + result.add(new WikittyQueryResult<Map<String, Object>>( queryName, firstIndice, numFound, query, queryString, results, selectFusion, wikittyId, facets, 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-25 00:57:54 UTC (rev 1554) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2013-02-25 11:31:36 UTC (rev 1555) @@ -324,20 +324,17 @@ Select select = null; WikittyQuery queryWithoutSelect = query; - if (query.getCondition() instanceof Select) { - select = (Select)query.getCondition(); - Condition newCond = select.getSubCondition(); - if (newCond == null) { - newCond = new org.nuiton.wikitty.query.conditions.True(); + if (query.isSelectQuery()) { + select = query.getSelect(); + // copy de la query sans le select + queryWithoutSelect = query.getWhereQuery(); + if (queryWithoutSelect.getCondition() == null) { + queryWithoutSelect.setCondition(new org.nuiton.wikitty.query.conditions.True()); + } + } - // copy de la query sans le select - queryWithoutSelect = query.copy(); - queryWithoutSelect.setCondition(newCond); - } - - int offset = queryWithoutSelect.getOffset(); int limit = queryWithoutSelect.getLimit(); List<String> ids = new LinkedList<String>(); 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-25 00:57:54 UTC (rev 1554) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2013-02-25 11:31:36 UTC (rev 1555) @@ -67,6 +67,7 @@ import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; import org.nuiton.wikitty.query.conditions.Condition; import org.nuiton.wikitty.query.conditions.Select; +import org.nuiton.wikitty.query.conditions.True; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; @@ -691,14 +692,12 @@ if (query.isSelectQuery()) { select = query.getSelect(); - Condition newCond = select.getSubCondition(); - if (newCond == null) { - newCond = new org.nuiton.wikitty.query.conditions.True(); + // copy de la query sans le select + queryWithoutSelect = query.getWhereQuery(); + if (queryWithoutSelect.getCondition() == null) { + queryWithoutSelect.setCondition(new True()); } - // copy de la query sans le select - queryWithoutSelect = query.copy(); - queryWithoutSelect.setCondition(newCond); } // Create querySolr
participants (1)
-
bpoussin@users.nuiton.org