Skip to content

Commit fed5cc0

Browse files
benwtrentjulio-santana
authored andcommitted
Temporarily bypass competitive iteration for filters aggregation (#126956)
1 parent 718315c commit fed5cc0

File tree

3 files changed

+126
-5
lines changed

3 files changed

+126
-5
lines changed

docs/changelog/126956.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 126956
2+
summary: Temporarily bypass competitive iteration for filters aggregation
3+
area: Aggregations
4+
type: bug
5+
issues: []

server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/FiltersIT.java

+114
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import java.util.Iterator;
3030
import java.util.List;
3131

32+
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
3233
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
3334
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
35+
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
3436
import static org.elasticsearch.search.aggregations.AggregationBuilders.avg;
3537
import static org.elasticsearch.search.aggregations.AggregationBuilders.filters;
3638
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
@@ -95,6 +97,118 @@ public void setupSuiteScopeCluster() throws Exception {
9597
ensureSearchable();
9698
}
9799

100+
// This test replicates a strange filter query & filters aggregation behavior
101+
// we apparently utilize competitive iterators strangely.
102+
// See: https://github.com/elastic/elasticsearch/issues/126955
103+
public void testSimpleWithFilterQuery() throws Exception {
104+
createIndex("filters_idx");
105+
String groupFieldName = "group";
106+
String subGroupFieldName = "subGroup";
107+
108+
int numTotalGroup0 = 500;
109+
String group0Name = "group0";
110+
111+
int numTotalGroup1 = 1000;
112+
String group1Name = "group1";
113+
114+
int subGroup0 = 100;
115+
String subGroup0Name = "subGroup0";
116+
117+
int subGroup1 = 50;
118+
String subGroup1Name = "subGroup1";
119+
120+
int subGroup2 = 25;
121+
String subGroup2Name = "subGroup2";
122+
int others = 10;
123+
String otherName = "others";
124+
List<IndexRequestBuilder> builders = new ArrayList<>();
125+
for (int i = 0; i < numTotalGroup0; i++) {
126+
for (int j = 0; j < subGroup0; j++) {
127+
XContentBuilder source = jsonBuilder().startObject()
128+
.field(groupFieldName, group0Name)
129+
.field(subGroupFieldName, subGroup0Name)
130+
.endObject();
131+
builders.add(prepareIndex("filters_idx").setSource(source));
132+
}
133+
for (int j = 0; j < subGroup1; j++) {
134+
XContentBuilder source = jsonBuilder().startObject()
135+
.field(groupFieldName, group0Name)
136+
.field(subGroupFieldName, subGroup1Name)
137+
.endObject();
138+
builders.add(prepareIndex("filters_idx").setSource(source));
139+
}
140+
for (int j = 0; j < subGroup2; j++) {
141+
XContentBuilder source = jsonBuilder().startObject()
142+
.field(groupFieldName, group0Name)
143+
.field(subGroupFieldName, subGroup2Name)
144+
.endObject();
145+
builders.add(prepareIndex("filters_idx").setSource(source));
146+
}
147+
for (int j = 0; j < others; j++) {
148+
XContentBuilder source = jsonBuilder().startObject()
149+
.field(groupFieldName, group0Name)
150+
.field(subGroupFieldName, otherName)
151+
.endObject();
152+
builders.add(prepareIndex("filters_idx").setSource(source));
153+
}
154+
}
155+
for (int i = 0; i < numTotalGroup1; i++) {
156+
for (int j = 0; j < subGroup0; j++) {
157+
XContentBuilder source = jsonBuilder().startObject()
158+
.field(groupFieldName, group1Name)
159+
.field(subGroupFieldName, subGroup0Name)
160+
.endObject();
161+
builders.add(prepareIndex("filters_idx").setSource(source));
162+
}
163+
for (int j = 0; j < subGroup1; j++) {
164+
XContentBuilder source = jsonBuilder().startObject()
165+
.field(groupFieldName, group1Name)
166+
.field(subGroupFieldName, subGroup1Name)
167+
.endObject();
168+
builders.add(prepareIndex("filters_idx").setSource(source));
169+
}
170+
for (int j = 0; j < subGroup2; j++) {
171+
XContentBuilder source = jsonBuilder().startObject()
172+
.field(groupFieldName, group1Name)
173+
.field(subGroupFieldName, subGroup2Name)
174+
.endObject();
175+
builders.add(prepareIndex("filters_idx").setSource(source));
176+
}
177+
for (int j = 0; j < others; j++) {
178+
XContentBuilder source = jsonBuilder().startObject()
179+
.field(groupFieldName, group1Name)
180+
.field(subGroupFieldName, otherName)
181+
.endObject();
182+
builders.add(prepareIndex("filters_idx").setSource(source));
183+
}
184+
}
185+
indexRandom(true, false, true, builders);
186+
ensureSearchable();
187+
assertNoFailuresAndResponse(
188+
prepareSearch("filters_idx").setSize(0)
189+
.setRequestCache(false)
190+
.setTrackTotalHits(true)
191+
.setQuery(boolQuery().filter(termQuery(groupFieldName + ".keyword", group0Name)))
192+
.addAggregation(
193+
filters(
194+
"results",
195+
new KeyedFilter(subGroup0Name, termsQuery(subGroupFieldName + ".keyword", subGroup0Name)),
196+
new KeyedFilter(subGroup1Name, termsQuery(subGroupFieldName + ".keyword", subGroup1Name)),
197+
new KeyedFilter(subGroup2Name, termsQuery(subGroupFieldName + ".keyword", subGroup2Name))
198+
// This is key
199+
).otherBucket(false)
200+
),
201+
searchResponse -> {
202+
Filters filters = searchResponse.getAggregations().get("results");
203+
assertThat(filters, notNullValue());
204+
assertThat(filters.getName(), equalTo("results"));
205+
Filters.Bucket bucket = filters.getBucketByKey(subGroup0Name);
206+
assertThat(bucket, Matchers.notNullValue());
207+
assertThat(bucket.getDocCount(), equalTo((long) subGroup0 * numTotalGroup0));
208+
}
209+
);
210+
}
211+
98212
public void testSimple() throws Exception {
99213
assertNoFailuresAndResponse(
100214
prepareSearch("idx").addAggregation(

server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/FiltersAggregator.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,13 @@ protected LeafBucketCollector getLeafCollector(AggregationExecutionContext aggCt
328328
hasOtherBucket
329329
);
330330
}
331-
if (usesCompetitiveIterator) {
332-
return new MultiFilterCompetitiveLeafCollector(sub, filterWrappers, numFilters, totalNumKeys, hasOtherBucket);
333-
} else {
334-
return new MultiFilterLeafCollector(sub, filterWrappers, numFilters, totalNumKeys, hasOtherBucket);
335-
}
331+
// TODO: https://github.com/elastic/elasticsearch/issues/126955
332+
// competitive iterator is currently broken, we would rather be slow than broken
333+
return new MultiFilterLeafCollector(sub, filterWrappers, numFilters, totalNumKeys, hasOtherBucket);
334+
// if (usesCompetitiveIterator) {
335+
// return new MultiFilterCompetitiveLeafCollector(sub, filterWrappers, numFilters, totalNumKeys, hasOtherBucket);
336+
// } else {
337+
// }
336338
}
337339
}
338340

0 commit comments

Comments
 (0)