Skip to content

Commit 858769d

Browse files
Simplify comparators in InternalOrder (#122330)
We can build slightly more compact (and likely also faster) iterators while using less code for these. Also, no need to create method references as a way of casting.
1 parent 656b54b commit 858769d

File tree

1 file changed

+20
-35
lines changed

1 file changed

+20
-35
lines changed

server/src/main/java/org/elasticsearch/search/aggregations/InternalOrder.java

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.ArrayList;
2727
import java.util.Collections;
2828
import java.util.Comparator;
29+
import java.util.Iterator;
2930
import java.util.LinkedList;
3031
import java.util.List;
3132
import java.util.Objects;
@@ -188,52 +189,35 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
188189

189190
@Override
190191
public <T extends Bucket> Comparator<BucketAndOrd<T>> partiallyBuiltBucketComparator(Aggregator aggregator) {
191-
List<Comparator<BucketAndOrd<T>>> comparators = new ArrayList<>(orderElements.size());
192-
for (BucketOrder order : orderElements) {
193-
comparators.add(order.partiallyBuiltBucketComparator(aggregator));
192+
Iterator<BucketOrder> iterator = orderElements.iterator();
193+
Comparator<BucketAndOrd<T>> comparator = iterator.next().partiallyBuiltBucketComparator(aggregator);
194+
while (iterator.hasNext()) {
195+
comparator = comparator.thenComparing(iterator.next().partiallyBuiltBucketComparator(aggregator));
194196
}
195-
return (lhs, rhs) -> {
196-
for (Comparator<BucketAndOrd<T>> c : comparators) {
197-
int result = c.compare(lhs, rhs);
198-
if (result != 0) {
199-
return result;
200-
}
201-
}
202-
return 0;
203-
};
197+
return comparator;
204198
}
205199

206200
@Override
207201
public Comparator<Bucket> comparator() {
208-
List<Comparator<Bucket>> comparators = orderElements.stream().map(BucketOrder::comparator).toList();
209-
return (lhs, rhs) -> {
210-
for (Comparator<Bucket> c : comparators) {
211-
int result = c.compare(lhs, rhs);
212-
if (result != 0) {
213-
return result;
214-
}
215-
}
216-
return 0;
217-
};
202+
Iterator<BucketOrder> iterator = orderElements.iterator();
203+
Comparator<Bucket> comparator = iterator.next().comparator();
204+
while (iterator.hasNext()) {
205+
comparator = comparator.thenComparing(iterator.next().comparator());
206+
}
207+
return comparator;
218208
}
219209

220210
@Override
221211
<B extends InternalMultiBucketAggregation.InternalBucket> Comparator<DelayedBucket<B>> delayedBucketComparator(
222212
BiFunction<List<B>, AggregationReduceContext, B> reduce,
223213
AggregationReduceContext reduceContext
224214
) {
225-
List<Comparator<DelayedBucket<B>>> comparators = orderElements.stream()
226-
.map(b -> b.delayedBucketComparator(reduce, reduceContext))
227-
.toList();
228-
return (lhs, rhs) -> {
229-
for (Comparator<DelayedBucket<B>> c : comparators) {
230-
int result = c.compare(lhs, rhs);
231-
if (result != 0) {
232-
return result;
233-
}
234-
}
235-
return 0;
236-
};
215+
Iterator<BucketOrder> iterator = orderElements.iterator();
216+
Comparator<DelayedBucket<B>> comparator = iterator.next().delayedBucketComparator(reduce, reduceContext);
217+
while (iterator.hasNext()) {
218+
comparator = comparator.thenComparing(iterator.next().delayedBucketComparator(reduce, reduceContext));
219+
}
220+
return comparator;
237221
}
238222

239223
@Override
@@ -285,12 +269,13 @@ public Comparator<Bucket> comparator() {
285269
return comparator;
286270
}
287271

272+
@SuppressWarnings({ "rawtypes", "unchecked" })
288273
@Override
289274
<B extends InternalMultiBucketAggregation.InternalBucket> Comparator<DelayedBucket<B>> delayedBucketComparator(
290275
BiFunction<List<B>, AggregationReduceContext, B> reduce,
291276
AggregationReduceContext reduceContext
292277
) {
293-
return delayedBucketCompator::compare;
278+
return (Comparator) delayedBucketCompator;
294279
}
295280

296281
@Override

0 commit comments

Comments
 (0)