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);
+ }
}