diff --git a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java index 0ae8f131843..af7aadb79d0 100644 --- a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java @@ -130,8 +130,9 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException { @Override public void visit(QueryVisitor visitor) { QueryVisitor v = visitor.getSubVisitor(BooleanClause.Occur.MUST, this); + // we cannot register this query in the visitor, since we don't have the field name, + // so we just visit one of the subqueries. indexQuery.visit(v); - dvQuery.visit(v); } @Override diff --git a/lucene/core/src/java/org/apache/lucene/search/IndexSortSortedNumericDocValuesRangeQuery.java b/lucene/core/src/java/org/apache/lucene/search/IndexSortSortedNumericDocValuesRangeQuery.java index 176a1506718..bdbd438b3be 100644 --- a/lucene/core/src/java/org/apache/lucene/search/IndexSortSortedNumericDocValuesRangeQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/IndexSortSortedNumericDocValuesRangeQuery.java @@ -113,7 +113,6 @@ public int hashCode() { public void visit(QueryVisitor visitor) { if (visitor.acceptField(field)) { visitor.visitLeaf(this); - fallbackQuery.visit(visitor); } } diff --git a/lucene/core/src/test/org/apache/lucene/search/TestMaxClauseLimit.java b/lucene/core/src/test/org/apache/lucene/search/TestMaxClauseLimit.java index d633b3e83db..77537138b4d 100644 --- a/lucene/core/src/test/org/apache/lucene/search/TestMaxClauseLimit.java +++ b/lucene/core/src/test/org/apache/lucene/search/TestMaxClauseLimit.java @@ -19,8 +19,15 @@ import java.io.IOException; import java.util.Arrays; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.LongField; +import org.apache.lucene.document.LongPoint; +import org.apache.lucene.document.SortedNumericDocValuesField; +import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiReader; import org.apache.lucene.index.Term; +import org.apache.lucene.store.Directory; +import org.apache.lucene.tests.index.RandomIndexWriter; import org.apache.lucene.tests.util.LuceneTestCase; public class TestMaxClauseLimit extends LuceneTestCase { @@ -158,4 +165,48 @@ public void testMultiExactWithRepeats() throws IOException { searcher.rewrite(qb.build()); }); } + + 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()); + + qb = new BooleanQuery.Builder(); + for (int i = 0; i < maxClauseCount; i++) { + qb.add( + new IndexOrDocValuesQuery( + LongPoint.newRangeQuery("foo", 0, i), + SortedNumericDocValuesField.newSlowRangeQuery("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(); + } }