Skip to content

Commit c7a2c6d

Browse files
authored
Handle IndexOrDocValuesQuery in composite aggregation (#35392)
The `composite` aggregation can optimize its execution when the query is a `match_all` or a `range` over the field that is used in the first source of the aggregation. However we only check for instances of `PointRangeQuery` whereas the range query builder creates an `IndexOrDocValuesQuery`. This means that today the optimization does not apply to `range` query even if the code could handle it. This change fixes this issue by extracting the index query inside `IndexOrDocValuesQuery`.
1 parent 90b38d9 commit c7a2c6d

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/LongValuesSource.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.apache.lucene.index.IndexReader;
2525
import org.apache.lucene.index.LeafReaderContext;
2626
import org.apache.lucene.index.SortedNumericDocValues;
27+
import org.apache.lucene.search.BoostQuery;
28+
import org.apache.lucene.search.IndexOrDocValuesQuery;
2729
import org.apache.lucene.search.MatchAllDocsQuery;
2830
import org.apache.lucene.search.PointRangeQuery;
2931
import org.apache.lucene.search.Query;
@@ -178,8 +180,19 @@ public void collect(int doc, long bucket) throws IOException {
178180
};
179181
}
180182

183+
static Query extractQuery(Query query) {
184+
if (query instanceof BoostQuery) {
185+
return extractQuery(((BoostQuery) query).getQuery());
186+
} else if (query instanceof IndexOrDocValuesQuery) {
187+
return extractQuery(((IndexOrDocValuesQuery) query).getIndexQuery());
188+
} else {
189+
return query;
190+
}
191+
}
192+
181193
@Override
182194
SortedDocsProducer createSortedDocsProducerOrNull(IndexReader reader, Query query) {
195+
query = extractQuery(query);
183196
if (checkIfSortedDocsIsApplicable(reader, fieldType) == false ||
184197
(query != null &&
185198
query.getClass() != MatchAllDocsQuery.class &&

server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/SingleDimensionValuesSourceTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.lucene.document.LongPoint;
2323
import org.apache.lucene.index.IndexReader;
2424
import org.apache.lucene.index.Term;
25+
import org.apache.lucene.search.BoostQuery;
26+
import org.apache.lucene.search.IndexOrDocValuesQuery;
2527
import org.apache.lucene.search.MatchAllDocsQuery;
2628
import org.apache.lucene.search.TermQuery;
2729
import org.elasticsearch.common.util.BigArrays;
@@ -175,6 +177,10 @@ public void testNumericSorted() {
175177
assertNotNull(source.createSortedDocsProducerOrNull(reader, new MatchAllDocsQuery()));
176178
assertNotNull(source.createSortedDocsProducerOrNull(reader, null));
177179
assertNotNull(source.createSortedDocsProducerOrNull(reader, LongPoint.newRangeQuery("number", 0, 1)));
180+
assertNotNull(source.createSortedDocsProducerOrNull(reader, new IndexOrDocValuesQuery(
181+
LongPoint.newRangeQuery("number", 0, 1), new MatchAllDocsQuery())));
182+
assertNotNull(source.createSortedDocsProducerOrNull(reader, new BoostQuery(new IndexOrDocValuesQuery(
183+
LongPoint.newRangeQuery("number", 0, 1), new MatchAllDocsQuery()), 2.0f)));
178184
assertNull(source.createSortedDocsProducerOrNull(reader, new TermQuery(new Term("keyword", "toto)"))));
179185

180186
LongValuesSource sourceWithMissing = new LongValuesSource(

0 commit comments

Comments
 (0)