Skip to content

Commit e600a50

Browse files
authored
Return MatchNoDocsQuery when IndexOrDocValuesQuery::rewrite does not match (#14700)
In a similar way to how IndexOrDocValuesQuery may rewrite to a MatchAllDocsQuery, if either of the queries rewrites to match no docs, then return a MatchNoDocsQuery.
1 parent 11e4480 commit e600a50

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

lucene/CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ Optimizations
116116
* GITHUB#14679: Optimize exhaustive evaluation of disjunctive queries.
117117
(Adrien Grand)
118118

119+
* GITHUB#14700: Return MatchNoDocsQuery when IndexOrDocValuesQuery::rewrite does not match
120+
(Chris Hegarty)
121+
119122
Bug Fixes
120123
---------------------
121124
* GITHUB#14654: ValueSource.fromDoubleValuesSource(dvs).getSortField() would throw errors when

lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
117117
|| dvRewrite.getClass() == MatchAllDocsQuery.class) {
118118
return new MatchAllDocsQuery();
119119
}
120+
if (indexRewrite.getClass() == MatchNoDocsQuery.class
121+
|| dvRewrite.getClass() == MatchNoDocsQuery.class) {
122+
return new MatchNoDocsQuery();
123+
}
120124
if (indexQuery != indexRewrite || dvQuery != dvRewrite) {
121125
return new IndexOrDocValuesQuery(indexRewrite, dvRewrite);
122126
}

lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,39 @@ public void testQueryMatchesCount() throws Exception {
227227
w.close();
228228
dir.close();
229229
}
230+
231+
public void testQueryMatchesAllOrNone() throws Exception {
232+
var config = newIndexWriterConfig().setCodec(TestUtil.getDefaultCodec());
233+
try (Directory dir = newDirectory();
234+
IndexWriter w = new IndexWriter(dir, config)) {
235+
final int numDocs = random().nextInt(5000);
236+
for (int i = 0; i < numDocs; ++i) {
237+
Document doc = new Document();
238+
doc.add(new LongPoint("f2", i));
239+
doc.add(new SortedNumericDocValuesField("f2", i));
240+
w.addDocument(doc);
241+
}
242+
w.forceMerge(1);
243+
244+
try (IndexReader reader = DirectoryReader.open(w)) {
245+
IndexSearcher searcher = newSearcher(reader);
246+
247+
// range with all docs
248+
IndexOrDocValuesQuery query =
249+
new IndexOrDocValuesQuery(
250+
LongPoint.newRangeQuery("f2", 0, numDocs),
251+
SortedNumericDocValuesField.newSlowRangeQuery("f2", 0, numDocs));
252+
QueryUtils.check(random(), query, searcher);
253+
assertSame(MatchAllDocsQuery.class, query.rewrite(searcher).getClass());
254+
255+
// range with no docs
256+
query =
257+
new IndexOrDocValuesQuery(
258+
LongPoint.newRangeQuery("f2", numDocs + 1, numDocs + 200),
259+
SortedNumericDocValuesField.newSlowRangeQuery("f2", numDocs + 1, numDocs + 200));
260+
QueryUtils.check(random(), query, searcher);
261+
assertSame(MatchNoDocsQuery.class, query.rewrite(searcher).getClass());
262+
}
263+
}
264+
}
230265
}

0 commit comments

Comments
 (0)