You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2017/09/19 14:47:14 UTC

lucene-solr:master: LUCENE-7957: ConjunctionScorer.getChildren was failing to return all child scorers

Repository: lucene-solr
Updated Branches:
  refs/heads/master bc9520977 -> cec5b418e


LUCENE-7957: ConjunctionScorer.getChildren was failing to return all child scorers


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

Branch: refs/heads/master
Commit: cec5b418ea0b68098cf136f26c07505cb2d4acf9
Parents: bc95209
Author: Mike McCandless <mi...@apache.org>
Authored: Tue Sep 19 10:46:51 2017 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Tue Sep 19 10:46:51 2017 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 ++
 .../apache/lucene/search/ConjunctionScorer.java |  4 +-
 .../apache/lucene/search/TestConjunctions.java  | 56 +++++++++++++++++++-
 3 files changed, 60 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cec5b418/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 5a95d6c..84880ab 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -65,6 +65,9 @@ Bug Fixes
   it did not properly break ties on the surface forms when both the weights and
   the analyzed forms were equal. (Robert Muir)
 
+* LUCENE-7957: ConjunctionScorer.getChildren was failing to return all
+  child scorers (Adrien Grand, Mike McCandless)
+
 Build
 
 * SOLR-11181: Switch order of maven artifact publishing procedure: deploy first

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cec5b418/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java b/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
index 9cddab8..6ad4f40 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
@@ -26,6 +26,7 @@ class ConjunctionScorer extends Scorer {
 
   final DocIdSetIterator disi;
   final Scorer[] scorers;
+  final Collection<Scorer> required;
 
   /** Create a new {@link ConjunctionScorer}, note that {@code scorers} must be a subset of {@code required}. */
   ConjunctionScorer(Weight weight, Collection<Scorer> required, Collection<Scorer> scorers) {
@@ -33,6 +34,7 @@ class ConjunctionScorer extends Scorer {
     assert required.containsAll(scorers);
     this.disi = ConjunctionDISI.intersectScorers(required);
     this.scorers = scorers.toArray(new Scorer[scorers.size()]);
+    this.required = required;
   }
 
   @Override
@@ -67,7 +69,7 @@ class ConjunctionScorer extends Scorer {
   @Override
   public Collection<ChildScorer> getChildren() {
     ArrayList<ChildScorer> children = new ArrayList<>();
-    for (Scorer scorer : scorers) {
+    for (Scorer scorer : required) {
       children.add(new ChildScorer(scorer, "MUST"));
     }
     return children;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cec5b418/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java b/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
index 8b26121..de18dda 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
@@ -18,22 +18,29 @@ package org.apache.lucene.search;
 
 
 import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.Field;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.document.TextField;
-import org.apache.lucene.document.Field.Store;
-import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.FieldInvertState;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 
 public class TestConjunctions extends LuceneTestCase {
@@ -119,4 +126,49 @@ public class TestConjunctions extends LuceneTestCase {
       };
     }
   }
+
+  public void testScorerGetChildren() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
+    Document doc = new Document();
+    doc.add(newTextField("field", "a b", Field.Store.NO));
+    w.addDocument(doc);
+    IndexReader r = DirectoryReader.open(w);
+    BooleanQuery.Builder b = new BooleanQuery.Builder();
+    b.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.MUST);
+    b.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.FILTER);
+    Query q = b.build();
+    IndexSearcher s = new IndexSearcher(r);
+    final boolean[] setScorerCalled = new boolean[1];
+    s.search(q, new SimpleCollector() {
+        @Override
+        public void setScorer(Scorer s) throws IOException {
+          Collection<Scorer.ChildScorer> childScorers = s.getChildren();
+          setScorerCalled[0] = true;
+          assertEquals(2, childScorers.size());
+          Set<String> terms = new HashSet<>();
+          for (Scorer.ChildScorer childScorer : childScorers) {
+            Query query = childScorer.child.getWeight().getQuery();
+            assertTrue(query instanceof TermQuery);
+            Term term = ((TermQuery) query).getTerm();
+            assertEquals("field", term.field());
+            terms.add(term.text());
+          }
+          assertEquals(2, terms.size());
+          assertTrue(terms.contains("a"));
+          assertTrue(terms.contains("b"));
+        }
+
+        @Override
+        public void collect(int doc) {
+        }
+
+        @Override
+        public boolean needsScores() {
+          return true;
+        }
+      });
+    assertTrue(setScorerCalled[0]);
+    IOUtils.close(r, w, dir);
+  }
 }