Skip to content

Commit ff2e323

Browse files
committed
Updated bucket sorting when isKeyOrder is true
Signed-off-by: Vinay Krishna Pudyodu <[email protected]>
1 parent e124eb1 commit ff2e323

File tree

2 files changed

+15
-68
lines changed

2 files changed

+15
-68
lines changed

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

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ private InternalAggregation[] buildAggregations(long[] owningBucketOrds) throws
262262
Supplier<B> emptyBucketBuilder = emptyBucketBuilder(owningBucketOrds[ordIdx]);
263263

264264
// When request size is smaller than 20% of total buckets, use priority queue to get topN buckets
265-
if ((size < 0.2 * bucketsInOrd) || isKeyOrder(order)) {
265+
if ((size < 0.2 * bucketsInOrd)) {
266266
PriorityQueue<B> ordered = buildPriorityQueue(size);
267267
while (ordsEnum.next()) {
268268
long docCount = bucketDocCount(ordsEnum.ord());
@@ -277,21 +277,11 @@ private InternalAggregation[] buildAggregations(long[] owningBucketOrds) throws
277277
spare = ordered.insertWithOverflow(spare);
278278
}
279279
// Get the top buckets
280-
B[] bucketsForOrd = buildBuckets(ordered.size());
281-
topBucketsPerOrd[ordIdx] = bucketsForOrd;
282-
if (isKeyOrder(order)) {
283-
for (int b = ordered.size() - 1; b >= 0; --b) {
284-
topBucketsPerOrd[ordIdx][b] = ordered.pop();
285-
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
286-
}
287-
} else {
288-
// sorted buckets not needed as they will be sorted by key in buildResult() which is different from
289-
// order in priority queue ordered
290-
Iterator<B> itr = ordered.iterator();
291-
for (int b = ordered.size() - 1; b >= 0; --b) {
292-
topBucketsPerOrd[ordIdx][b] = itr.next();
293-
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
294-
}
280+
topBucketsPerOrd[ordIdx] = buildBuckets(ordered.size());;
281+
Iterator<B> itr = ordered.iterator();
282+
for (int b = ordered.size() - 1; b >= 0; --b) {
283+
topBucketsPerOrd[ordIdx][b] = itr.next();
284+
otherDocCounts[ordIdx] -= topBucketsPerOrd[ordIdx][b].getDocCount();
295285
}
296286
} else {
297287
B[] bucketsForOrd = buildBuckets((int) bucketsInOrd);
@@ -511,10 +501,10 @@ LongTerms buildResult(long owningBucketOrd, long otherDocCount, LongTerms.Bucket
511501
final BucketOrder reduceOrder;
512502
if (isKeyOrder(order) == false) {
513503
reduceOrder = InternalOrder.key(true);
514-
Arrays.sort(topBuckets, reduceOrder.comparator());
515504
} else {
516505
reduceOrder = order;
517506
}
507+
Arrays.sort(topBuckets, reduceOrder.comparator());
518508
return new LongTerms(
519509
name,
520510
reduceOrder,
@@ -591,10 +581,10 @@ DoubleTerms buildResult(long owningBucketOrd, long otherDocCount, DoubleTerms.Bu
591581
final BucketOrder reduceOrder;
592582
if (isKeyOrder(order) == false) {
593583
reduceOrder = InternalOrder.key(true);
594-
Arrays.sort(topBuckets, reduceOrder.comparator());
595584
} else {
596585
reduceOrder = order;
597586
}
587+
Arrays.sort(topBuckets, reduceOrder.comparator());
598588
return new DoubleTerms(
599589
name,
600590
reduceOrder,
@@ -670,10 +660,10 @@ UnsignedLongTerms buildResult(long owningBucketOrd, long otherDocCount, Unsigned
670660
final BucketOrder reduceOrder;
671661
if (isKeyOrder(order) == false) {
672662
reduceOrder = InternalOrder.key(true);
673-
Arrays.sort(topBuckets, reduceOrder.comparator());
674663
} else {
675664
reduceOrder = order;
676665
}
666+
Arrays.sort(topBuckets, reduceOrder.comparator());
677667
return new UnsignedLongTerms(
678668
name,
679669
reduceOrder,

server/src/test/java/org/opensearch/search/aggregations/bucket/terms/NumericTermsAggregatorTests.java

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,13 @@ private void testSearchCase(
196196
}
197197
}
198198

199-
public void testBuildAggregationsForHeapSort() throws IOException {
199+
public void testBuildAggregationAlgorithmSelection() throws IOException {
200200
List<Long> dataSet = new ArrayList<>();
201-
for (long i = 0; i < 150; i++) {
201+
for (long i = 0; i < 100; i++) {
202202
dataSet.add(i);
203203
}
204204

205+
// HeapSort
205206
testSearchCase(new MatchAllDocsQuery(), dataSet, aggregation -> aggregation.field(LONG_FIELD).size(2), agg -> {
206207
assertEquals(2, agg.getBuckets().size());
207208
for (int i = 0; i < 2; i++) {
@@ -210,59 +211,15 @@ public void testBuildAggregationsForHeapSort() throws IOException {
210211
assertThat(bucket.getDocCount(), equalTo(1L));
211212
}
212213
}, ValueType.NUMERIC);
213-
}
214-
215-
public void testBuildAggregationsForQuickSelect() throws IOException {
216-
List<Long> dataSet = new ArrayList<>();
217-
for (long i = 0; i < 150; i++) {
218-
dataSet.add(i);
219-
}
220214

221-
testSearchCase(new MatchAllDocsQuery(), dataSet, aggregation -> aggregation.field(LONG_FIELD).size(50), agg -> {
222-
assertEquals(50, agg.getBuckets().size());
215+
// QuickSelect
216+
testSearchCase(new MatchAllDocsQuery(), dataSet, aggregation -> aggregation.field(LONG_FIELD).size(20), agg -> {
217+
assertEquals(20, agg.getBuckets().size());
223218
for (int i = 0; i < agg.getBuckets().size(); i++) {
224219
LongTerms.Bucket bucket = (LongTerms.Bucket) agg.getBuckets().get(i);
225220
assertThat(bucket.getKey(), equalTo((long) i));
226221
assertThat(bucket.getDocCount(), equalTo(1L));
227222
}
228223
}, ValueType.NUMERIC);
229224
}
230-
231-
public void testKeyOrderingAlgorithmSelection() throws IOException {
232-
List<Long> dataset = new ArrayList<>();
233-
for (long i = 100; i > 0; i--) {
234-
dataset.add(i);
235-
}
236-
237-
testSearchCase(
238-
new MatchAllDocsQuery(),
239-
dataset,
240-
aggregation -> aggregation.field(LONG_FIELD).size(50).order(org.opensearch.search.aggregations.BucketOrder.key(true)),
241-
agg -> {
242-
assertEquals(50, agg.getBuckets().size());
243-
for (int i = 0; i < 50; i++) {
244-
LongTerms.Bucket bucket = (LongTerms.Bucket) agg.getBuckets().get(i);
245-
assertThat(bucket.getKey(), equalTo(i + 1L));
246-
assertThat(bucket.getDocCount(), equalTo(1L));
247-
}
248-
},
249-
ValueType.NUMERIC
250-
);
251-
252-
testSearchCase(
253-
new MatchAllDocsQuery(),
254-
dataset,
255-
aggregation -> aggregation.field(LONG_FIELD).size(5).order(org.opensearch.search.aggregations.BucketOrder.key(false)),
256-
agg -> {
257-
assertEquals(5, agg.getBuckets().size());
258-
for (int i = 0; i < agg.getBuckets().size(); i++) {
259-
LongTerms.Bucket bucket = (LongTerms.Bucket) agg.getBuckets().get(i);
260-
assertThat(bucket.getKey(), equalTo(100L - i));
261-
assertThat(bucket.getDocCount(), equalTo(1L));
262-
}
263-
},
264-
ValueType.NUMERIC
265-
);
266-
}
267-
268225
}

0 commit comments

Comments
 (0)