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