[jOOQ/jOOQ#15190] Avoid repeating ORDER BY expressions in DENSE_RANK

This commit is contained in:
Lukas Eder 2023-06-08 17:38:31 +02:00
parent 7c72fe155b
commit ca1ff4e500

View File

@ -253,6 +253,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -2142,7 +2143,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
private final Field<Integer> limitWindowFunction(Context<?> c) {
return distinct
? DSL.denseRank().over(orderBy(getNonEmptyOrderBy(c.configuration())))
? DSL.denseRank().over(orderBy(getNonEmptyOrderByForDistinct(c.configuration())))
: getLimit().withTies()
? DSL.rank().over(orderBy(getNonEmptyOrderBy(c.configuration())))
: DSL.rowNumber().over(orderBy(getNonEmptyOrderBy(c.configuration())));
@ -4440,6 +4441,18 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
return getOrderBy();
}
final SortFieldList getNonEmptyOrderByForDistinct(Configuration configuration) {
SortFieldList order = new SortFieldList();
order.addAll(getNonEmptyOrderBy(configuration));
Set<Field<?>> fields = new HashSet<>(map(order, o -> o.$field()));
for (Field<?> field : getSelect())
if (!fields.contains(field))
order.add(field.asc());
return order;
}
@Override
public final void addOrderBy(Collection<? extends OrderField<?>> fields) {
getOrderBy().addAll(Tools.sortFields(fields));