diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 097fa99d74..5329346989 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -65,13 +65,13 @@ import static org.jooq.impl.ExpressionOperator.SUBTRACT; import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_STRING; import static org.jooq.impl.Tools.castIfNeeded; +import static org.jooq.impl.Tools.fieldsArray; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -273,13 +273,7 @@ abstract class AbstractField extends AbstractTypedNamed implements Field sortAsc(Collection sortList) { - Map map = new LinkedHashMap<>(); - - int i = 0; - for (T value : sortList) - map.put(value, i++); - - return sort(map); + return Tools.isEmpty(sortList) ? sortConstant() : DSL.field(this, fieldsArray(sortList.toArray(), getDataType())).asc(); } @Override @@ -290,13 +284,7 @@ abstract class AbstractField extends AbstractTypedNamed implements Field sortDesc(Collection sortList) { - Map map = new LinkedHashMap<>(); - - int i = 0; - for (T value : sortList) - map.put(value, i--); - - return sort(map); + return Tools.isEmpty(sortList) ? sortConstant() : DSL.field(this, fieldsArray(sortList.toArray(), getDataType())).desc(); } @Override @@ -305,22 +293,14 @@ abstract class AbstractField extends AbstractTypedNamed implements Field SortField sort(Map sortMap) { - CaseValueStep decode = DSL.choose(this); - CaseWhenStep result = null; + return sortMap == null || sortMap.isEmpty() ? sortConstant() : DSL.case_(this).mapValues(sortMap).asc(); + } - for (Entry entry : sortMap.entrySet()) - if (result == null) - result = decode.when(entry.getKey(), inline(entry.getValue())); - else - result.when(entry.getKey(), inline(entry.getValue())); - - if (result == null) - return new SortFieldImpl<>(new ConstantSortField<>((Field) this), SortOrder.DEFAULT); - else - return result.asc(); + @SuppressWarnings({ "unchecked", "rawtypes" }) + private final SortField sortConstant() { + return new SortFieldImpl<>(new ConstantSortField<>((Field) this), SortOrder.DEFAULT); } // ------------------------------------------------------------------------