Skip to content

Commit 5efc2ec

Browse files
authored
Clarify the error message when a pipeline agg is used in the 'order' parameter. (#32522)
1 parent 16fe220 commit 5efc2ec

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

server/src/main/java/org/elasticsearch/search/aggregations/support/AggregationPath.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,14 @@ public Aggregator resolveTopmostAggregator(Aggregator root) {
288288
public void validate(Aggregator root) throws AggregationExecutionException {
289289
Aggregator aggregator = root;
290290
for (int i = 0; i < pathElements.size(); i++) {
291-
aggregator = ProfilingAggregator.unwrap(aggregator.subAggregator(pathElements.get(i).name));
291+
String name = pathElements.get(i).name;
292+
aggregator = ProfilingAggregator.unwrap(aggregator.subAggregator(name));
292293
if (aggregator == null) {
293-
throw new AggregationExecutionException("Invalid aggregator order path [" + this + "]. Unknown aggregation ["
294-
+ pathElements.get(i).name + "]");
294+
throw new AggregationExecutionException("Invalid aggregator order path [" + this + "]. The " +
295+
"provided aggregation [" + name + "] either does not exist, or is a pipeline aggregation " +
296+
"and cannot be used to sort the buckets.");
295297
}
298+
296299
if (i < pathElements.size() - 1) {
297300

298301
// we're in the middle of the path, so the aggregator can only be a single-bucket aggregator

server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java

+33
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@
5050
import org.elasticsearch.index.mapper.Uid;
5151
import org.elasticsearch.index.query.QueryBuilders;
5252
import org.elasticsearch.indices.breaker.NoneCircuitBreakerService;
53+
import org.elasticsearch.script.Script;
5354
import org.elasticsearch.search.SearchHit;
5455
import org.elasticsearch.search.aggregations.AggregationBuilder;
5556
import org.elasticsearch.search.aggregations.AggregationBuilders;
57+
import org.elasticsearch.search.aggregations.AggregationExecutionException;
5658
import org.elasticsearch.search.aggregations.Aggregator;
5759
import org.elasticsearch.search.aggregations.AggregatorTestCase;
5860
import org.elasticsearch.search.aggregations.BucketOrder;
@@ -67,6 +69,7 @@
6769
import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder;
6870
import org.elasticsearch.search.aggregations.metrics.tophits.InternalTopHits;
6971
import org.elasticsearch.search.aggregations.metrics.tophits.TopHitsAggregationBuilder;
72+
import org.elasticsearch.search.aggregations.pipeline.bucketscript.BucketScriptPipelineAggregationBuilder;
7073
import org.elasticsearch.search.aggregations.support.ValueType;
7174
import org.elasticsearch.search.sort.FieldSortBuilder;
7275
import org.elasticsearch.search.sort.ScoreSortBuilder;
@@ -83,6 +86,8 @@
8386
import java.util.function.Function;
8487

8588
import static org.elasticsearch.index.mapper.SeqNoFieldMapper.PRIMARY_TERM_NAME;
89+
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
90+
import static org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders.bucketScript;
8691
import static org.hamcrest.Matchers.equalTo;
8792
import static org.hamcrest.Matchers.greaterThan;
8893
import static org.hamcrest.Matchers.instanceOf;
@@ -1060,6 +1065,34 @@ public void testWithNestedAggregations() throws IOException {
10601065
}
10611066
}
10621067

1068+
public void testOrderByPipelineAggregation() throws Exception {
1069+
try (Directory directory = newDirectory()) {
1070+
try (RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory)) {
1071+
try (IndexReader indexReader = maybeWrapReaderEs(indexWriter.getReader())) {
1072+
IndexSearcher indexSearcher = newIndexSearcher(indexReader);
1073+
1074+
BucketScriptPipelineAggregationBuilder bucketScriptAgg = bucketScript(
1075+
"script", new Script("2.718"));
1076+
TermsAggregationBuilder termsAgg = terms("terms")
1077+
.field("field")
1078+
.valueType(ValueType.STRING)
1079+
.order(BucketOrder.aggregation("script", true))
1080+
.subAggregation(bucketScriptAgg);
1081+
1082+
MappedFieldType fieldType = new KeywordFieldMapper.KeywordFieldType();
1083+
fieldType.setName("field");
1084+
fieldType.setHasDocValues(true);
1085+
1086+
AggregationExecutionException e = expectThrows(AggregationExecutionException.class,
1087+
() -> createAggregator(termsAgg, indexSearcher, fieldType));
1088+
assertEquals("Invalid aggregator order path [script]. The provided aggregation [script] " +
1089+
"either does not exist, or is a pipeline aggregation and cannot be used to sort the buckets.",
1090+
e.getMessage());
1091+
}
1092+
}
1093+
}
1094+
}
1095+
10631096
private final SeqNoFieldMapper.SequenceIDFields sequenceIDFields = SeqNoFieldMapper.SequenceIDFields.emptySeqID();
10641097
private List<Document> generateDocsWithNested(String id, int value, int[] nestedValues) {
10651098
List<Document> documents = new ArrayList<>();

0 commit comments

Comments
 (0)