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