Skip to content

Commit 9000bb4

Browse files
authored
If no perBucketSample has been allocated for the parent bucket return a doc count of 0 (#59360)
1 parent c27dc5f commit 9000bb4

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/BestDocsDeferringCollector.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,9 @@ public void collect(int docId, long parentBucket) throws IOException {
306306
}
307307

308308
public int getDocCount(long parentBucket) {
309+
if (perBucketSamples.size() <= parentBucket) {
310+
return 0;
311+
}
309312
PerParentBucketSamples sampler = perBucketSamples.get((int) parentBucket);
310313
if (sampler == null) {
311314
// There are conditions where no docs are collected and the aggs

server/src/test/java/org/elasticsearch/search/aggregations/bucket/sampler/SamplerAggregatorTests.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,20 @@
2828
import org.apache.lucene.index.IndexWriterConfig;
2929
import org.apache.lucene.index.Term;
3030
import org.apache.lucene.search.IndexSearcher;
31+
import org.apache.lucene.search.MatchAllDocsQuery;
3132
import org.apache.lucene.search.TermQuery;
3233
import org.apache.lucene.store.Directory;
3334
import org.elasticsearch.index.mapper.MappedFieldType;
3435
import org.elasticsearch.index.mapper.NumberFieldMapper;
3536
import org.elasticsearch.index.mapper.TextFieldMapper;
3637
import org.elasticsearch.index.mapper.TextFieldMapper.TextFieldType;
38+
import org.elasticsearch.index.query.MatchAllQueryBuilder;
39+
import org.elasticsearch.index.query.MatchNoneQueryBuilder;
40+
import org.elasticsearch.index.query.QueryBuilder;
3741
import org.elasticsearch.search.aggregations.AggregatorTestCase;
42+
import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregationBuilder;
43+
import org.elasticsearch.search.aggregations.bucket.filter.InternalFilters;
44+
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
3845
import org.elasticsearch.search.aggregations.metrics.Min;
3946
import org.elasticsearch.search.aggregations.metrics.MinAggregationBuilder;
4047
import org.elasticsearch.search.aggregations.support.AggregationInspectionHelper;
@@ -117,4 +124,36 @@ public void testRidiculousSize() throws IOException {
117124
}
118125
}
119126
}
127+
128+
/**
129+
* Tests that the sampler aggregation works correctly if the parent bucket does not contain any hit.
130+
*/
131+
public void testEmptyParentBucket() throws Exception {
132+
IndexWriterConfig indexWriterConfig = newIndexWriterConfig();
133+
try (Directory dir = newDirectory();
134+
IndexWriter writer = new IndexWriter(dir, indexWriterConfig)) {
135+
136+
writer.addDocument(new Document());
137+
138+
try (IndexReader reader = DirectoryReader.open(writer)) {
139+
IndexSearcher searcher = new IndexSearcher(reader);
140+
141+
QueryBuilder[] filters = new QueryBuilder[]{
142+
new MatchAllQueryBuilder(),
143+
new MatchNoneQueryBuilder()
144+
};
145+
FiltersAggregationBuilder samplerParent = new FiltersAggregationBuilder("filters", filters);
146+
TermsAggregationBuilder samplerChild = new TermsAggregationBuilder("child").field("field");
147+
SamplerAggregationBuilder sampler = new SamplerAggregationBuilder("sampler")
148+
.subAggregation(samplerChild);
149+
samplerParent.subAggregation(sampler);
150+
151+
InternalFilters response = searchAndReduce(searcher, new MatchAllDocsQuery(), samplerParent);
152+
assertEquals(response.getBuckets().size(), 2);
153+
assertEquals(response.getBuckets().get(0).getDocCount(), 1);
154+
assertEquals(response.getBuckets().get(1).getDocCount(), 0);
155+
}
156+
}
157+
}
158+
120159
}

0 commit comments

Comments
 (0)