Skip to content

Commit

Permalink
Cast individual list elements to avoid creating two lists
Browse files Browse the repository at this point in the history
Signed-off-by: Daniel Widdis <[email protected]>
  • Loading branch information
dbwiddis committed Jul 21, 2024
1 parent 703c4a3 commit 1b61f8d
Showing 1 changed file with 14 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@
import org.opensearch.search.pipeline.Processor;
import org.opensearch.search.pipeline.SearchResponseProcessor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* Processor that sorts an array of items.
Expand Down Expand Up @@ -166,33 +166,21 @@ public SearchResponse processResponse(SearchRequest request, SearchResponse resp
}

private List<Object> getSortedValues(List<Object> values) {
// Downcast list elements to comparable (or throw exception) so we can sort
List<? extends Comparable<Object>> comparableValues = getComparableValues(values);
if (sortOrder.equals(SortOrder.ASCENDING)) {
Collections.sort(comparableValues);
} else {
Collections.sort(comparableValues, Collections.reverseOrder());
}
// Upcast list elements back to Object
return List.copyOf(comparableValues);
return values.stream()
.map(this::downcastToComparable)
.sorted(sortOrder.equals(SortOrder.ASCENDING) ? Comparator.naturalOrder() : Comparator.reverseOrder())
.collect(Collectors.toList());
}

private List<? extends Comparable<Object>> getComparableValues(List<Object> values) {
List<Comparable<Object>> comparableValues = new ArrayList<>(values.size());
for (Object obj : values) {
if (obj == null) {
throw new IllegalArgumentException("field [" + sortField + "] contains a null value.]");
} else if (Comparable.class.isAssignableFrom(obj.getClass())) {
@SuppressWarnings("unchecked")
Comparable<Object> comp = (Comparable<Object>) obj;
comparableValues.add(comp);
} else {
throw new IllegalArgumentException(
"field [" + sortField + "] of type [" + obj.getClass().getName() + "] is not comparable.]"
);
}
@SuppressWarnings("unchecked")
private Comparable<Object> downcastToComparable(Object obj) {
if (obj == null) {
throw new IllegalArgumentException("field [" + sortField + "] contains a null value.]");
} else if (Comparable.class.isAssignableFrom(obj.getClass())) {
return (Comparable<Object>) obj;
} else {
throw new IllegalArgumentException("field [" + sortField + "] of type [" + obj.getClass().getName() + "] is not comparable.]");
}
return comparableValues;
}

static class Factory implements Processor.Factory<SearchResponseProcessor> {
Expand Down

0 comments on commit 1b61f8d

Please sign in to comment.