You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2022/09/09 16:20:32 UTC

[lucene] branch branch_9x updated: Fix IntervalBuilder.NO_INTERVALS docId when unpositioned (#11760)

This is an automated email from the ASF dual-hosted git repository.

romseygeek pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 89eef7b96a0 Fix IntervalBuilder.NO_INTERVALS docId when unpositioned (#11760)
89eef7b96a0 is described below

commit 89eef7b96a073fd983b38b719f490382e66d2757
Author: Alan Woodward <ro...@apache.org>
AuthorDate: Fri Sep 9 17:19:15 2022 +0100

    Fix IntervalBuilder.NO_INTERVALS docId when unpositioned (#11760)
    
    IntervalBuilder.NO_INTERVALS should return -1 when unpositioned,
    not NO_MORE_DOCS. This can trigger exceptions when an empty
    IntervalQuery is combined in a conjunction.
    
    Fixes #11759
---
 .../lucene/queries/intervals/IntervalBuilder.java  |  6 +++-
 .../queries/intervals/TestIntervalBuilder.java     | 38 ++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/lucene/queries/src/java/org/apache/lucene/queries/intervals/IntervalBuilder.java b/lucene/queries/src/java/org/apache/lucene/queries/intervals/IntervalBuilder.java
index b6e1727616c..e76be6f9e60 100644
--- a/lucene/queries/src/java/org/apache/lucene/queries/intervals/IntervalBuilder.java
+++ b/lucene/queries/src/java/org/apache/lucene/queries/intervals/IntervalBuilder.java
@@ -242,6 +242,8 @@ final class IntervalBuilder {
         @Override
         public IntervalIterator intervals(String field, LeafReaderContext ctx) {
           return new IntervalIterator() {
+            boolean exhausted = false;
+
             @Override
             public int start() {
               return NO_MORE_INTERVALS;
@@ -269,16 +271,18 @@ final class IntervalBuilder {
 
             @Override
             public int docID() {
-              return NO_MORE_DOCS;
+              return exhausted ? NO_MORE_DOCS : -1;
             }
 
             @Override
             public int nextDoc() {
+              exhausted = true;
               return NO_MORE_DOCS;
             }
 
             @Override
             public int advance(int target) {
+              exhausted = true;
               return NO_MORE_DOCS;
             }
 
diff --git a/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalBuilder.java b/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalBuilder.java
index 3b6f63d98f5..b74670a51bc 100644
--- a/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalBuilder.java
+++ b/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalBuilder.java
@@ -41,8 +41,16 @@ package org.apache.lucene.queries.intervals;
 
 import java.io.IOException;
 import org.apache.lucene.analysis.CachingTokenFilter;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.store.Directory;
 import org.apache.lucene.tests.analysis.CannedTokenStream;
 import org.apache.lucene.tests.analysis.Token;
+import org.apache.lucene.tests.index.RandomIndexWriter;
 import org.apache.lucene.tests.util.LuceneTestCase;
 
 public class TestIntervalBuilder extends LuceneTestCase {
@@ -213,4 +221,34 @@ public class TestIntervalBuilder extends LuceneTestCase {
             Intervals.extend(Intervals.term("term5"), 1, 0));
     assertEquals(expected, source);
   }
+
+  public void testEmptyIntervals() throws IOException {
+    CannedTokenStream ts = new CannedTokenStream();
+    IntervalsSource source = IntervalBuilder.analyzeText(new CachingTokenFilter(ts), -1, true);
+
+    Directory directory = newDirectory();
+    RandomIndexWriter w = new RandomIndexWriter(random(), directory);
+    Document doc = new Document();
+    doc.add(newStringField("field", "value", Field.Store.NO));
+    w.addDocument(doc);
+    w.close();
+    IndexReader reader = DirectoryReader.open(directory);
+    LeafReaderContext ctx = reader.leaves().get(0);
+
+    {
+      IntervalIterator it = source.intervals("field", ctx);
+      assertEquals(-1, it.docID());
+      it.nextDoc();
+      assertEquals(DocIdSetIterator.NO_MORE_DOCS, it.docID());
+    }
+    {
+      IntervalIterator it = source.intervals("field", ctx);
+      assertEquals(-1, it.docID());
+      it.advance(1);
+      assertEquals(DocIdSetIterator.NO_MORE_DOCS, it.docID());
+    }
+
+    reader.close();
+    directory.close();
+  }
 }