You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/03/23 11:50:09 UTC

[22/46] lucene-solr:jira/solr-9959: LUCENE_7747: QueryBuilder now iterates lazily over the possible paths when building a graph query

LUCENE_7747: QueryBuilder now iterates lazily over the possible paths when building a graph query


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3ca4d800
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3ca4d800
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3ca4d800

Branch: refs/heads/jira/solr-9959
Commit: 3ca4d800babe68c39b8ea6e30ba0bdcc225ed907
Parents: d374193
Author: Jim Ferenczi <ji...@apache.org>
Authored: Fri Mar 17 15:53:21 2017 +0100
Committer: Jim Ferenczi <ji...@apache.org>
Committed: Fri Mar 17 15:53:21 2017 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  2 +
 .../org/apache/lucene/util/QueryBuilder.java    | 46 ++++++++++----------
 2 files changed, 24 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3ca4d800/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index b2ea412..22c83f0 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -229,6 +229,8 @@ Improvements
 * LUCENE-7695: ComplexPhraseQueryParser to support query time synonyms (Markus Jelsma
   via Mikhail Khludnev) 
 
+* LUCENE_7747: QueryBuilder now iterates lazily over the possible paths when building a graph query
+
 Optimizations
 
 * LUCENE-7641: Optimized point range queries to compute documents that do not

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3ca4d800/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java b/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java
index 0832bdb..9fb474a 100644
--- a/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java
+++ b/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java
@@ -19,7 +19,6 @@ package org.apache.lucene.util;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
@@ -512,21 +511,20 @@ public class QueryBuilder {
       lastState = end;
       final Query queryPos;
       if (graph.hasSidePath(start)) {
-        List<Query> queries = new ArrayList<> ();
-        Iterator<TokenStream> it = graph.getFiniteStrings(start, end);
-        while (it.hasNext()) {
-          TokenStream ts = it.next();
-          // This is a synonym path so all terms are mandatory (MUST).
-          Query q = createFieldQuery(ts, BooleanClause.Occur.MUST, field, getAutoGenerateMultiTermSynonymsPhraseQuery(), 0);
-          if (q != null) {
-            queries.add(q);
+        final Iterator<TokenStream> it = graph.getFiniteStrings(start, end);
+        Iterator<Query> queries = new Iterator<Query>() {
+          @Override
+          public boolean hasNext() {
+            return it.hasNext();
           }
-        }
-        if (queries.size() > 0) {
-          queryPos = newGraphSynonymQuery(queries.toArray(new Query[queries.size()]));
-        } else {
-          queryPos = null;
-        }
+
+          @Override
+          public Query next() {
+            TokenStream ts = it.next();
+            return createFieldQuery(ts, BooleanClause.Occur.MUST, field, getAutoGenerateMultiTermSynonymsPhraseQuery(), 0);
+          }
+        };
+        queryPos = newGraphSynonymQuery(queries);
       } else {
         Term[] terms = graph.getTerms(field, start);
         assert terms.length > 0;
@@ -636,16 +634,16 @@ public class QueryBuilder {
    * This is intended for subclasses that wish to customize the generated queries.
    * @return new Query instance
    */
-  protected Query newGraphSynonymQuery(Query queries[]) {
-    if (queries == null) {
-      return new BooleanQuery.Builder().build();
-    } else if (queries.length == 1) {
-      return queries[0];
-    } else {
-      BooleanQuery.Builder builder = new BooleanQuery.Builder();
-      Arrays.stream(queries).forEachOrdered(qry -> builder.add(qry, BooleanClause.Occur.SHOULD));
-      return builder.build();
+  protected Query newGraphSynonymQuery(Iterator<Query> queries) {
+    BooleanQuery.Builder builder = new BooleanQuery.Builder();
+    while (queries.hasNext()) {
+      builder.add(queries.next(), BooleanClause.Occur.SHOULD);
     }
+    BooleanQuery bq = builder.build();
+    if (bq.clauses().size() == 1) {
+      return bq.clauses().get(0).getQuery();
+    }
+    return bq;
   }
   
   /**