From 8e8b59900bad65876b064ba074a27d0062350cb3 Mon Sep 17 00:00:00 2001 From: Ignacio Vera Date: Thu, 25 Jan 2024 14:24:06 +0100 Subject: [PATCH] Stop capturing the BucketAggregator when building internal sub-aggregations --- .../bucket/BucketsAggregator.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/BucketsAggregator.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/BucketsAggregator.java index ec8117cf03135..3416986930041 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/BucketsAggregator.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/BucketsAggregator.java @@ -180,22 +180,31 @@ protected final InternalAggregations[] buildSubAggsForBuckets(long[] bucketOrdsT } InternalAggregations[] result = new InternalAggregations[bucketOrdsToCollect.length]; for (int ord = 0; ord < bucketOrdsToCollect.length; ord++) { - final int thisOrd = ord; - result[ord] = InternalAggregations.from(new AbstractList<>() { - @Override - public InternalAggregation get(int index) { - return aggregations[index][thisOrd]; - } - - @Override - public int size() { - return aggregations.length; - } - }); + result[ord] = InternalAggregations.from(new InternalAggregationList(aggregations, ord)); } return result; } + private static class InternalAggregationList extends AbstractList { + private final InternalAggregation[][] aggregations; + private final int ord; + + private InternalAggregationList(InternalAggregation[][] aggregations, int ord) { + this.aggregations = aggregations; + this.ord = ord; + } + + @Override + public InternalAggregation get(int index) { + return aggregations[index][ord]; + } + + @Override + public int size() { + return aggregations.length; + } + } + /** * Build the sub aggregation results for a list of buckets and set them on * the buckets. This is usually used by aggregations that are selective