You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2020/03/11 20:59:22 UTC
[lucene-solr] 02/02: LUCENE-9258: DocTermsIndexDocValues' range
scorer didn't support multi-valued fields
This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit e783f3729d63dff23fc82cd151c4348561b7966d
Author: Michele Palmia <mi...@gmail.com>
AuthorDate: Wed Mar 11 16:56:10 2020 -0400
LUCENE-9258: DocTermsIndexDocValues' range scorer didn't support multi-valued fields
(cherry picked from commit b1ec1cd9e0ce3498945adaac67d497c226072ba7)
---
lucene/CHANGES.txt | 3 +++
.../function/docvalues/DocTermsIndexDocValues.java | 26 +++++-----------------
.../function/valuesource/SortedSetFieldSource.java | 2 +-
.../queries/function/TestSortedSetFieldSource.java | 15 +++++++++----
4 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 67263a9..ab958be 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -29,6 +29,9 @@ Bug Fixes
* LUCENE-8849: DocValuesRewriteMethod.visit wasn't visiting its embedded query (Michele Palmia, David Smiley)
+* LUCENE-9258: DocTermsIndexDocValues assumed it was operating on a SortedDocValues (single valued) field when
+ it could be multi-valued used with a SortedSetSelector (Michele Palmia)
+
Other
---------------------
diff --git a/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java b/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
index 1cc79a4..6c3b3b8 100644
--- a/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
+++ b/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
@@ -40,15 +40,13 @@ public abstract class DocTermsIndexDocValues extends FunctionValues {
protected final ValueSource vs;
protected final MutableValueStr val = new MutableValueStr();
protected final CharsRefBuilder spareChars = new CharsRefBuilder();
- private final String field;
private int lastDocID;
public DocTermsIndexDocValues(ValueSource vs, LeafReaderContext context, String field) throws IOException {
- this(field, vs, open(context, field));
+ this(vs, open(context, field));
}
-
- protected DocTermsIndexDocValues(String field, ValueSource vs, SortedDocValues termsIndex) {
- this.field = field;
+
+ protected DocTermsIndexDocValues(ValueSource vs, SortedDocValues termsIndex) {
this.vs = vs;
this.termsIndex = termsIndex;
}
@@ -145,23 +143,11 @@ public abstract class DocTermsIndexDocValues extends FunctionValues {
final int uu = upper;
return new ValueSourceScorer(weight, readerContext, this) {
- final SortedDocValues values = readerContext.reader().getSortedDocValues(field);
- private int lastDocID;
-
@Override
public boolean matches(int doc) throws IOException {
- if (doc < lastDocID) {
- throw new IllegalArgumentException("docs were sent out-of-order: lastDocID=" + lastDocID + " vs docID=" + doc);
- }
- if (doc > values.docID()) {
- values.advance(doc);
- }
- if (doc == values.docID()) {
- int ord = values.ordValue();
- return ord >= ll && ord <= uu;
- } else {
- return false;
- }
+ if (!exists(doc)) return false;
+ float docVal = ordVal(doc);
+ return docVal >= ll && docVal <= uu;
}
};
}
diff --git a/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/SortedSetFieldSource.java b/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/SortedSetFieldSource.java
index d32cc3b..ddf7129 100644
--- a/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/SortedSetFieldSource.java
+++ b/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/SortedSetFieldSource.java
@@ -58,7 +58,7 @@ public class SortedSetFieldSource extends FieldCacheSource {
public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
SortedSetDocValues sortedSet = DocValues.getSortedSet(readerContext.reader(), field);
SortedDocValues view = SortedSetSelector.wrap(sortedSet, selector);
- return new DocTermsIndexDocValues(this.field, this, view) {
+ return new DocTermsIndexDocValues(this, view) {
@Override
protected String toTerm(String readableValue) {
return readableValue;
diff --git a/lucene/queries/src/test/org/apache/lucene/queries/function/TestSortedSetFieldSource.java b/lucene/queries/src/test/org/apache/lucene/queries/function/TestSortedSetFieldSource.java
index b72bfeb..84dd263 100644
--- a/lucene/queries/src/test/org/apache/lucene/queries/function/TestSortedSetFieldSource.java
+++ b/lucene/queries/src/test/org/apache/lucene/queries/function/TestSortedSetFieldSource.java
@@ -25,9 +25,7 @@ import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queries.function.valuesource.SortedSetFieldSource;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.SortedSetSortField;
+import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.LuceneTestCase;
@@ -66,7 +64,16 @@ public class TestSortedSetFieldSource extends LuceneTestCase {
vssf = vssf.rewrite(searcher);
sf = sf.rewrite(searcher);
assertEquals(sf, vssf);
-
+
+ // test scorer
+ vs = new SortedSetFieldSource("value");
+ values = vs.getValues(Collections.emptyMap(), ar.getContext());
+ ValueSourceScorer vss = values.getRangeScorer(new MatchAllDocsQuery().createWeight(searcher, ScoreMode.TOP_SCORES, 1), ar.getContext(), "a", "z", true, true);
+
+ DocIdSetIterator iterator = vss.iterator();
+ assertEquals("baz", values.strVal(iterator.nextDoc()));
+ assertEquals("bar", values.strVal(iterator.nextDoc()));
+
ir.close();
dir.close();
}