Skip to content

Commit 8a0081e

Browse files
Simplify comparators in InternalOrder (elastic#122330) (elastic#122355)
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 b2862ef commit 8a0081e

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
@@ -28,6 +28,7 @@
2828
import java.util.ArrayList;
2929
import java.util.Collections;
3030
import java.util.Comparator;
31+
import java.util.Iterator;
3132
import java.util.LinkedList;
3233
import java.util.List;
3334
import java.util.Objects;
@@ -190,52 +191,35 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
190191

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

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

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

241225
@Override
@@ -287,12 +271,13 @@ public Comparator<Bucket> comparator() {
287271
return comparator;
288272
}
289273

274+
@SuppressWarnings({ "rawtypes", "unchecked" })
290275
@Override
291276
<B extends InternalMultiBucketAggregation.InternalBucket> Comparator<DelayedBucket<B>> delayedBucketComparator(
292277
BiFunction<List<B>, AggregationReduceContext, B> reduce,
293278
AggregationReduceContext reduceContext
294279
) {
295-
return delayedBucketCompator::compare;
280+
return (Comparator) delayedBucketCompator;
296281
}
297282

298283
@Override

0 commit comments

Comments
 (0)