Description
I noticed that if I change a query from a PointRangeQuery to an IndexOrDocValuesQuery, then the change might make previous valid boolean queries to fail because IndexOrDocValuesQuery counts twice when computing maxClauseCount.
I think this is wrong as IndexOrDocValues is just providing lucene with the choice of two execution paths and should not count twice for that limit.
This test proves the issue:
public void testIndexOrDocValues() throws IOException {
Directory dir = newDirectory();
RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
Document d = new Document();
d.add(new LongField("foo", 0L, LongField.Store.NO));
writer.addDocument(d);
d = new Document();
d.add(new LongField("foo", Long.MAX_VALUE, LongField.Store.NO));
writer.addDocument(d);
IndexReader reader = writer.getReader();
IndexSearcher searcher = newSearcher(reader);
writer.close();
int maxClauseCount = IndexSearcher.getMaxClauseCount();
BooleanQuery.Builder qb = new BooleanQuery.Builder();
for (int i = 0; i < maxClauseCount; i++) {
qb.add(LongPoint.newRangeQuery("foo", 0, i), BooleanClause.Occur.SHOULD);
}
// should not throw an exception, because it is below the limit
searcher.rewrite(qb.build());
qb = new BooleanQuery.Builder();
for (int i = 0; i < maxClauseCount; i++) {
qb.add(LongField.newRangeQuery("foo", 0, i), BooleanClause.Occur.SHOULD);
}
// should not throw an exception, because it is below the limit
searcher.rewrite(qb.build());
reader.close();
dir.close();
}
It fails in the second rewrite with the exception:
org.apache.lucene.search.IndexSearcher$TooManyNestedClauses: Query contains too many nested clauses; maxClauseCount is set to 1024
at __randomizedtesting.SeedInfo.seed([1DBE2F81F126780A:AB3F95EEC9898FF7]:0)
at org.apache.lucene.search.IndexSearcher$1.visitLeaf(IndexSearcher.java:905)
at org.apache.lucene.document.SortedNumericDocValuesRangeQuery.visit(SortedNumericDocValuesRangeQuery.java:74)
at org.apache.lucene.search.IndexOrDocValuesQuery.visit(IndexOrDocValuesQuery.java:134)
at org.apache.lucene.search.BooleanQuery.visit(BooleanQuery.java:661)
Metadata
Metadata
Assignees
Labels
No labels