|
30 | 30 | import org.elasticsearch.script.ScriptModule; |
31 | 31 | import org.elasticsearch.script.ScriptService; |
32 | 32 | import org.elasticsearch.script.ScriptType; |
| 33 | +import org.elasticsearch.search.aggregations.AggregationBuilder; |
33 | 34 | import org.elasticsearch.search.aggregations.AggregatorTestCase; |
| 35 | +import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; |
34 | 36 | import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregationBuilder; |
35 | 37 | import org.elasticsearch.search.aggregations.bucket.filter.InternalFilters; |
36 | 38 | import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; |
@@ -95,8 +97,42 @@ public void testScript() throws IOException { |
95 | 97 | ); |
96 | 98 | } |
97 | 99 |
|
| 100 | + public void testNonMultiBucketParent() { |
| 101 | + MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType("number_field", NumberFieldMapper.NumberType.INTEGER); |
| 102 | + MappedFieldType fieldType1 = new KeywordFieldMapper.KeywordFieldType("the_field"); |
| 103 | + |
| 104 | + FilterAggregationBuilder filter = new FilterAggregationBuilder("placeholder", new MatchAllQueryBuilder()).subAggregation( |
| 105 | + new TermsAggregationBuilder("the_terms").userValueTypeHint(ValueType.STRING) |
| 106 | + .field("the_field") |
| 107 | + .subAggregation(new AvgAggregationBuilder("the_avg").field("number_field")) |
| 108 | + ) |
| 109 | + .subAggregation( |
| 110 | + new BucketScriptPipelineAggregationBuilder( |
| 111 | + "bucket_script", |
| 112 | + Collections.singletonMap("the_avg", "the_terms['test1']>the_avg.value"), |
| 113 | + new Script(ScriptType.INLINE, MockScriptEngine.NAME, SCRIPT_NAME, Collections.emptyMap()) |
| 114 | + ) |
| 115 | + ); |
| 116 | + |
| 117 | + assertThrows( |
| 118 | + "Expected a multi bucket aggregation but got [InternalFilter] for aggregation [bucket_script]", |
| 119 | + IllegalArgumentException.class, |
| 120 | + () -> testCase(filter, new MatchAllDocsQuery(), iw -> { |
| 121 | + Document doc = new Document(); |
| 122 | + doc.add(new SortedSetDocValuesField("the_field", new BytesRef("test1"))); |
| 123 | + doc.add(new SortedNumericDocValuesField("number_field", 19)); |
| 124 | + iw.addDocument(doc); |
| 125 | + |
| 126 | + doc = new Document(); |
| 127 | + doc.add(new SortedSetDocValuesField("the_field", new BytesRef("test2"))); |
| 128 | + doc.add(new SortedNumericDocValuesField("number_field", 55)); |
| 129 | + iw.addDocument(doc); |
| 130 | + }, f -> fail("This shouldn't be called"), fieldType, fieldType1) |
| 131 | + ); |
| 132 | + } |
| 133 | + |
98 | 134 | private void testCase( |
99 | | - FiltersAggregationBuilder aggregationBuilder, |
| 135 | + AggregationBuilder aggregationBuilder, |
100 | 136 | Query query, |
101 | 137 | CheckedConsumer<RandomIndexWriter, IOException> buildIndex, |
102 | 138 | Consumer<InternalFilters> verify, |
|
0 commit comments