Skip to content

Commit 39904c6

Browse files
opensearch-trigger-bot[bot]github-actions[bot]jainankitk
authored
Prevent unnecessary heap sort when buckets needs to be ordered by key in NumericTermsAggregation (#17252) (#17290)
(cherry picked from commit 3f793b6) Signed-off-by: Rishabh Maurya <rishabhmaurya05@gmail.com> Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Signed-off-by: Ankit Jain <akjain@amazon.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Ankit Jain <akjain@amazon.com>
1 parent a40be71 commit 39904c6

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55

66
## [Unreleased 2.x]
77
### Added
8+
- Improve performace of NumericTermAggregation by avoiding unnecessary sorting([#17252](https://github.com/opensearch-project/OpenSearch/pull/17252))
89

910
### Dependencies
1011
- Bump `dnsjava:dnsjava` from 3.6.2 to 3.6.3 ([#17231](https://github.com/opensearch-project/OpenSearch/pull/17231))

server/src/main/java/org/opensearch/search/aggregations/bucket/terms/NumericTermsAggregator.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import java.io.IOException;
6565
import java.math.BigInteger;
6666
import java.util.Arrays;
67+
import java.util.Iterator;
6768
import java.util.List;
6869
import java.util.Map;
6970
import java.util.function.BiConsumer;
@@ -202,9 +203,19 @@ private InternalAggregation[] buildAggregations(long[] owningBucketOrds) throws
202203
// Get the top buckets
203204
B[] bucketsForOrd = buildBuckets(ordered.size());
204205
topBucketsPerOrd[ordIdx] = bucketsForOrd;
205-
for (int b = ordered.size() - 1; b >= 0; --b) {
206-
topBucketsPerOrd[ordIdx][b] = ordered.pop();
207-
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
206+
if (isKeyOrder(order)) {
207+
for (int b = ordered.size() - 1; b >= 0; --b) {
208+
topBucketsPerOrd[ordIdx][b] = ordered.pop();
209+
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
210+
}
211+
} else {
212+
// sorted buckets not needed as they will be sorted by key in buildResult() which is different from
213+
// order in priority queue ordered
214+
Iterator<B> itr = ordered.iterator();
215+
for (int b = ordered.size() - 1; b >= 0; --b) {
216+
topBucketsPerOrd[ordIdx][b] = itr.next();
217+
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
218+
}
208219
}
209220
}
210221

0 commit comments

Comments
 (0)