diff --git a/CHANGELOG.md b/CHANGELOG.md
index 31e9fa8b3..3323eafdb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ Significant changes:
- The library now requires Java 17
- Deprecated code from prior releases is removed
+- Allow CASE expressions in ORDER BY Clauses
## Release 1.5.2 - June 3, 2024
diff --git a/pom.xml b/pom.xml
index 5d5447a8f..d2ce1ecdd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,14 +164,6 @@
1.5.6
test
-
-
- org.hamcrest
- hamcrest
- 3.0
- test
-
-
org.testcontainers
postgresql
diff --git a/src/main/java/org/mybatis/dynamic/sql/AbstractListValueCondition.java b/src/main/java/org/mybatis/dynamic/sql/AbstractListValueCondition.java
index 104859de8..dc287e842 100644
--- a/src/main/java/org/mybatis/dynamic/sql/AbstractListValueCondition.java
+++ b/src/main/java/org/mybatis/dynamic/sql/AbstractListValueCondition.java
@@ -51,7 +51,7 @@ private Collection applyMapper(Function super T, ? extends R> mapper) {
private Collection applyFilter(Predicate super T> predicate) {
Objects.requireNonNull(predicate);
- return values.stream().filter(predicate).collect(Collectors.toList());
+ return values.stream().filter(predicate).toList();
}
protected > S filterSupport(Predicate super T> predicate,
diff --git a/src/main/java/org/mybatis/dynamic/sql/SortSpecification.java b/src/main/java/org/mybatis/dynamic/sql/SortSpecification.java
index a17557017..48aee58c4 100644
--- a/src/main/java/org/mybatis/dynamic/sql/SortSpecification.java
+++ b/src/main/java/org/mybatis/dynamic/sql/SortSpecification.java
@@ -15,6 +15,11 @@
*/
package org.mybatis.dynamic.sql;
+import org.mybatis.dynamic.sql.exception.DynamicSqlException;
+import org.mybatis.dynamic.sql.render.RenderingContext;
+import org.mybatis.dynamic.sql.util.FragmentAndParameters;
+import org.mybatis.dynamic.sql.util.Messages;
+
/**
* Defines attributes of columns that are necessary for rendering an order by expression.
*
@@ -34,13 +39,33 @@ public interface SortSpecification {
* NOT include the "DESC" word for descending sort specifications.
*
* @return the order by phrase
+ * @deprecated Please replace this method by overriding the more general "renderForOrderBy" method. Target for
+ * removal in release 2.1
*/
- String orderByName();
+ @Deprecated(since = "2.0", forRemoval = true)
+ default String orderByName() {
+ throw new DynamicSqlException(Messages.getString("ERROR.44")); //$NON-NLS-1$
+ }
/**
* Return true if the sort order is descending.
*
* @return true if the SortSpecification should render as descending
+ * @deprecated Please replace this method by overriding the more general "renderForOrderBy" method. Target for
+ * removal in release 2.1
*/
- boolean isDescending();
+ @Deprecated(since = "2.0", forRemoval = true)
+ default boolean isDescending() {
+ throw new DynamicSqlException(Messages.getString("ERROR.44")); //$NON-NLS-1$
+ }
+
+ // the default implementation ensures compatibility with prior releases. When the
+ // deprecated methods are removed, this function can become purely abstract.
+ default FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ String phrase = orderByName();
+ if (isDescending()) {
+ phrase = phrase + " DESC"; //$NON-NLS-1$
+ }
+ return FragmentAndParameters.fromFragment(phrase);
+ }
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java
index 76f40e15c..0c8475d33 100644
--- a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java
+++ b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java
@@ -30,7 +30,7 @@ public class SqlColumn implements BindableColumn, SortSpecification {
protected final String name;
protected final SqlTable table;
protected final JDBCType jdbcType;
- protected final boolean isDescending;
+ protected final String descendingPhrase;
protected final String alias;
protected final String typeHandler;
protected final RenderingStrategy renderingStrategy;
@@ -42,7 +42,7 @@ private SqlColumn(Builder builder) {
name = Objects.requireNonNull(builder.name);
table = Objects.requireNonNull(builder.table);
jdbcType = builder.jdbcType;
- isDescending = builder.isDescending;
+ descendingPhrase = builder.descendingPhrase;
alias = builder.alias;
typeHandler = builder.typeHandler;
renderingStrategy = builder.renderingStrategy;
@@ -87,7 +87,7 @@ public Object convertParameterType(T value) {
@Override
public SortSpecification descending() {
Builder b = copy();
- return b.withDescending(true).build();
+ return b.withDescendingPhrase(" DESC").build(); //$NON-NLS-1$
}
@Override
@@ -126,13 +126,8 @@ public SqlColumn asCamelCase() {
}
@Override
- public boolean isDescending() {
- return isDescending;
- }
-
- @Override
- public String orderByName() {
- return alias().orElse(name);
+ public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ return FragmentAndParameters.fromFragment(alias().orElse(name) + descendingPhrase);
}
@Override
@@ -188,7 +183,7 @@ private Builder copy() {
.withName(this.name)
.withTable(this.table)
.withJdbcType(this.jdbcType)
- .withDescending(this.isDescending)
+ .withDescendingPhrase(this.descendingPhrase)
.withAlias(this.alias)
.withTypeHandler(this.typeHandler)
.withRenderingStrategy(this.renderingStrategy)
@@ -214,7 +209,7 @@ public static class Builder {
protected String name;
protected SqlTable table;
protected JDBCType jdbcType;
- protected boolean isDescending = false;
+ protected String descendingPhrase = ""; //$NON-NLS-1$
protected String alias;
protected String typeHandler;
protected RenderingStrategy renderingStrategy;
@@ -237,8 +232,8 @@ public Builder withJdbcType(JDBCType jdbcType) {
return this;
}
- public Builder withDescending(boolean isDescending) {
- this.isDescending = isDescending;
+ public Builder withDescendingPhrase(String descendingPhrase) {
+ this.descendingPhrase = descendingPhrase;
return this;
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/common/OrderByRenderer.java b/src/main/java/org/mybatis/dynamic/sql/common/OrderByRenderer.java
index f1a28ed4e..206c1a297 100644
--- a/src/main/java/org/mybatis/dynamic/sql/common/OrderByRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/common/OrderByRenderer.java
@@ -15,24 +15,24 @@
*/
package org.mybatis.dynamic.sql.common;
+import java.util.Objects;
import java.util.stream.Collectors;
-import org.mybatis.dynamic.sql.SortSpecification;
+import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
+import org.mybatis.dynamic.sql.util.FragmentCollector;
public class OrderByRenderer {
- public FragmentAndParameters render(OrderByModel orderByModel) {
- String phrase = orderByModel.columns()
- .map(this::calculateOrderByPhrase)
- .collect(Collectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- return FragmentAndParameters.fromFragment(phrase);
+ private final RenderingContext renderingContext;
+
+ public OrderByRenderer(RenderingContext renderingContext) {
+ this.renderingContext = Objects.requireNonNull(renderingContext);
}
- private String calculateOrderByPhrase(SortSpecification column) {
- String phrase = column.orderByName();
- if (column.isDescending()) {
- phrase = phrase + " DESC"; //$NON-NLS-1$
- }
- return phrase;
+ public FragmentAndParameters render(OrderByModel orderByModel) {
+ return orderByModel.columns().map(c -> c.renderForOrderBy(renderingContext))
+ .collect(FragmentCollector.collect())
+ .toFragmentAndParameters(
+ Collectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java
index ce46c4c10..8a9c945d4 100644
--- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java
@@ -96,7 +96,7 @@ private Optional calculateOrderByClause() {
}
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
- return new OrderByRenderer().render(orderByModel);
+ return new OrderByRenderer(renderingContext).render(orderByModel);
}
public static Builder withDeleteModel(DeleteModel deleteModel) {
diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertDSL.java b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertDSL.java
index 9b5f69cec..ba912e5a6 100644
--- a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertDSL.java
@@ -58,11 +58,11 @@ public BatchInsertModel build() {
}
@SafeVarargs
- public static IntoGatherer insert(T... records) {
- return BatchInsertDSL.insert(Arrays.asList(records));
+ public static BatchInsertDSL.IntoGatherer insert(T... records) {
+ return insert(Arrays.asList(records));
}
- public static IntoGatherer insert(Collection records) {
+ public static BatchInsertDSL.IntoGatherer insert(Collection records) {
return new IntoGatherer<>(records);
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertDSL.java b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertDSL.java
index 1b8feaca3..7c0530a2a 100644
--- a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertDSL.java
@@ -57,11 +57,11 @@ public MultiRowInsertModel build() {
}
@SafeVarargs
- public static IntoGatherer insert(T... records) {
- return MultiRowInsertDSL.insert(Arrays.asList(records));
+ public static MultiRowInsertDSL.IntoGatherer insert(T... records) {
+ return insert(Arrays.asList(records));
}
- public static IntoGatherer insert(Collection records) {
+ public static MultiRowInsertDSL.IntoGatherer insert(Collection records) {
return new IntoGatherer<>(records);
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/BatchInsert.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/BatchInsert.java
index 2759bb907..5a3c22893 100644
--- a/src/main/java/org/mybatis/dynamic/sql/insert/render/BatchInsert.java
+++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/BatchInsert.java
@@ -19,7 +19,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.stream.Collectors;
public class BatchInsert {
private final String insertStatement;
@@ -38,7 +37,7 @@ private BatchInsert(Builder builder) {
public List> insertStatements() {
return records.stream()
.map(this::toInsertStatement)
- .collect(Collectors.toList());
+ .toList();
}
private InsertStatementProvider toInsertStatement(T row) {
@@ -57,7 +56,7 @@ public String getInsertStatementSQL() {
}
public List getRecords() {
- return Collections.unmodifiableList(records);
+ return records;
}
public static Builder withRecords(List records) {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/AbstractQueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/AbstractQueryExpressionDSL.java
index d800a02ff..d82076a49 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/AbstractQueryExpressionDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/AbstractQueryExpressionDSL.java
@@ -23,7 +23,6 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.stream.Collectors;
import org.mybatis.dynamic.sql.SqlTable;
import org.mybatis.dynamic.sql.TableExpression;
@@ -196,7 +195,7 @@ protected Optional buildJoinModel() {
return Optional.of(JoinModel.of(joinSpecificationBuilders.stream()
.map(JoinSpecification.Builder::build)
- .collect(Collectors.toList())));
+ .toList()));
}
protected void addTableAlias(SqlTable table, String tableAlias) {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/ColumnSortSpecification.java b/src/main/java/org/mybatis/dynamic/sql/select/ColumnSortSpecification.java
index b8503a971..4420affc9 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/ColumnSortSpecification.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/ColumnSortSpecification.java
@@ -19,34 +19,31 @@
import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.SqlColumn;
+import org.mybatis.dynamic.sql.render.RenderingContext;
+import org.mybatis.dynamic.sql.util.FragmentAndParameters;
public class ColumnSortSpecification implements SortSpecification {
private final String tableAlias;
private final SqlColumn> column;
- private final boolean isDescending;
+ private final String descendingPhrase;
public ColumnSortSpecification(String tableAlias, SqlColumn> column) {
- this(tableAlias, column, false);
+ this(tableAlias, column, ""); //$NON-NLS-1$
}
- private ColumnSortSpecification(String tableAlias, SqlColumn> column, boolean isDescending) {
+ private ColumnSortSpecification(String tableAlias, SqlColumn> column, String descendingPhrase) {
this.tableAlias = Objects.requireNonNull(tableAlias);
this.column = Objects.requireNonNull(column);
- this.isDescending = isDescending;
+ this.descendingPhrase = descendingPhrase;
}
@Override
public SortSpecification descending() {
- return new ColumnSortSpecification(tableAlias, column, true);
+ return new ColumnSortSpecification(tableAlias, column, " DESC"); //$NON-NLS-1$
}
@Override
- public String orderByName() {
- return tableAlias + "." + column.name(); //$NON-NLS-1$
- }
-
- @Override
- public boolean isDescending() {
- return isDescending;
+ public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ return FragmentAndParameters.fromFragment(tableAlias + "." + column.name() + descendingPhrase); //$NON-NLS-1$
}
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java
index a509e974b..cb1fae92d 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java
@@ -23,7 +23,6 @@
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import org.mybatis.dynamic.sql.BasicColumn;
@@ -143,7 +142,7 @@ public R build() {
private List buildModels() {
return queryExpressions.stream()
.map(QueryExpressionDSL::buildModel)
- .collect(Collectors.toList());
+ .toList();
}
private Optional buildPagingModel() {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SimpleSortSpecification.java b/src/main/java/org/mybatis/dynamic/sql/select/SimpleSortSpecification.java
index 9620020e2..2c363ccc4 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/SimpleSortSpecification.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/SimpleSortSpecification.java
@@ -18,6 +18,8 @@
import java.util.Objects;
import org.mybatis.dynamic.sql.SortSpecification;
+import org.mybatis.dynamic.sql.render.RenderingContext;
+import org.mybatis.dynamic.sql.util.FragmentAndParameters;
/**
* This class is used for an order by phrase where there is no suitable column name
@@ -28,30 +30,25 @@
public class SimpleSortSpecification implements SortSpecification {
private final String name;
- private final boolean isDescending;
+ private final String descendingPhrase;
private SimpleSortSpecification(String name) {
- this(name, false);
+ this(name, ""); //$NON-NLS-1$
}
- private SimpleSortSpecification(String name, boolean isDescending) {
+ private SimpleSortSpecification(String name, String descendingPhrase) {
this.name = Objects.requireNonNull(name);
- this.isDescending = isDescending;
+ this.descendingPhrase = descendingPhrase;
}
@Override
public SortSpecification descending() {
- return new SimpleSortSpecification(name, true);
+ return new SimpleSortSpecification(name, " DESC"); //$NON-NLS-1$
}
@Override
- public String orderByName() {
- return name;
- }
-
- @Override
- public boolean isDescending() {
- return isDescending;
+ public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ return FragmentAndParameters.fromFragment(name + descendingPhrase);
}
public static SimpleSortSpecification of(String name) {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseDSL.java
index 674012d3c..360fc344d 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseDSL.java
@@ -71,7 +71,7 @@ public SearchedCaseEnder else_(BasicColumn column) {
return new SearchedCaseEnder();
}
- public BasicColumn end() {
+ public SearchedCaseModel end() {
return new SearchedCaseModel.Builder()
.withElseValue(elseValue)
.withWhenConditions(whenConditions)
@@ -100,7 +100,7 @@ protected WhenDSL getThis() {
}
public class SearchedCaseEnder {
- public BasicColumn end() {
+ public SearchedCaseModel end() {
return SearchedCaseDSL.this.end();
}
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseModel.java b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseModel.java
index 65d3f949f..15fd864f8 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseModel.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseModel.java
@@ -21,20 +21,23 @@
import java.util.stream.Stream;
import org.mybatis.dynamic.sql.BasicColumn;
+import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.select.render.SearchedCaseRenderer;
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
import org.mybatis.dynamic.sql.util.Validator;
-public class SearchedCaseModel implements BasicColumn {
+public class SearchedCaseModel implements BasicColumn, SortSpecification {
private final List whenConditions;
private final BasicColumn elseValue;
private final String alias;
+ private final String descendingPhrase;
private SearchedCaseModel(Builder builder) {
whenConditions = builder.whenConditions;
alias = builder.alias;
elseValue = builder.elseValue;
+ descendingPhrase = builder.descendingPhrase;
Validator.assertNotEmpty(whenConditions, "ERROR.40"); //$NON-NLS-1$
}
@@ -56,9 +59,24 @@ public SearchedCaseModel as(String alias) {
return new Builder().withWhenConditions(whenConditions)
.withElseValue(elseValue)
.withAlias(alias)
+ .withDescendingPhrase(descendingPhrase)
.build();
}
+ @Override
+ public SearchedCaseModel descending() {
+ return new Builder().withWhenConditions(whenConditions)
+ .withElseValue(elseValue)
+ .withAlias(alias)
+ .withDescendingPhrase(" DESC") //$NON-NLS-1$
+ .build();
+ }
+
+ @Override
+ public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ return render(renderingContext).mapFragment(f -> f + descendingPhrase);
+ }
+
@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
return new SearchedCaseRenderer(this, renderingContext).render();
@@ -68,6 +86,7 @@ public static class Builder {
private final List whenConditions = new ArrayList<>();
private BasicColumn elseValue;
private String alias;
+ private String descendingPhrase = ""; //$NON-NLS-1$
public Builder withWhenConditions(List whenConditions) {
this.whenConditions.addAll(whenConditions);
@@ -84,6 +103,11 @@ public Builder withAlias(String alias) {
return this;
}
+ public Builder withDescendingPhrase(String descendingPhrase) {
+ this.descendingPhrase = descendingPhrase;
+ return this;
+ }
+
public SearchedCaseModel build() {
return new SearchedCaseModel(this);
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseDSL.java
index 83e46473a..6b3f41338 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseDSL.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseDSL.java
@@ -60,7 +60,7 @@ public SimpleCaseEnder else_(BasicColumn column) {
return new SimpleCaseEnder();
}
- public BasicColumn end() {
+ public SimpleCaseModel end() {
return new SimpleCaseModel.Builder()
.withColumn(column)
.withWhenConditions(whenConditions)
@@ -100,7 +100,7 @@ public SimpleCaseDSL then(BasicColumn column) {
}
public class SimpleCaseEnder {
- public BasicColumn end() {
+ public SimpleCaseModel end() {
return SimpleCaseDSL.this.end();
}
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseModel.java b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseModel.java
index 4b71407ae..3c649c3da 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseModel.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseModel.java
@@ -23,22 +23,25 @@
import org.mybatis.dynamic.sql.BasicColumn;
import org.mybatis.dynamic.sql.BindableColumn;
+import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.select.render.SimpleCaseRenderer;
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
import org.mybatis.dynamic.sql.util.Validator;
-public class SimpleCaseModel implements BasicColumn {
+public class SimpleCaseModel implements BasicColumn, SortSpecification {
private final BindableColumn column;
private final List> whenConditions;
private final BasicColumn elseValue;
private final String alias;
+ private final String descendingPhrase;
private SimpleCaseModel(Builder builder) {
column = Objects.requireNonNull(builder.column);
whenConditions = builder.whenConditions;
elseValue = builder.elseValue;
alias = builder.alias;
+ descendingPhrase = builder.descendingPhrase;
Validator.assertNotEmpty(whenConditions, "ERROR.40"); //$NON-NLS-1$
}
@@ -66,9 +69,26 @@ public SimpleCaseModel as(String alias) {
.withWhenConditions(whenConditions)
.withElseValue(elseValue)
.withAlias(alias)
+ .withDescendingPhrase(descendingPhrase)
.build();
}
+ @Override
+ public SimpleCaseModel descending() {
+ return new Builder()
+ .withColumn(column)
+ .withWhenConditions(whenConditions)
+ .withElseValue(elseValue)
+ .withAlias(alias)
+ .withDescendingPhrase(" DESC") //$NON-NLS-1$
+ .build();
+ }
+
+ @Override
+ public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
+ return render(renderingContext).mapFragment(f -> f + descendingPhrase);
+ }
+
@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
return new SimpleCaseRenderer<>(this, renderingContext).render();
@@ -79,6 +99,7 @@ public static class Builder {
private final List> whenConditions = new ArrayList<>();
private BasicColumn elseValue;
private String alias;
+ private String descendingPhrase = ""; //$NON-NLS-1$
public Builder withColumn(BindableColumn column) {
this.column = column;
@@ -100,6 +121,11 @@ public Builder withAlias(String alias) {
return this;
}
+ public Builder withDescendingPhrase(String descendingPhrase) {
+ this.descendingPhrase = descendingPhrase;
+ return this;
+ }
+
public SimpleCaseModel build() {
return new SimpleCaseModel<>(this);
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java
index 59e926f67..c063e7866 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java
@@ -87,7 +87,7 @@ private Optional renderOrderBy() {
}
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
- return new OrderByRenderer().render(orderByModel);
+ return new OrderByRenderer(renderingContext).render(orderByModel);
}
private Optional renderPagingModel() {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java
index 3f65a51e4..128ab3e8e 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java
@@ -68,7 +68,7 @@ private Optional renderOrderBy() {
}
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
- return new OrderByRenderer().render(orderByModel);
+ return new OrderByRenderer(renderingContext).render(orderByModel);
}
private Optional renderPagingModel() {
diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SimpleCaseRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SimpleCaseRenderer.java
index 2639d0b53..94cd071f1 100644
--- a/src/main/java/org/mybatis/dynamic/sql/select/render/SimpleCaseRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SimpleCaseRenderer.java
@@ -48,7 +48,9 @@ public FragmentAndParameters render() {
}
private FragmentAndParameters renderCase() {
- return simpleCaseModel.column().render(renderingContext)
+ return simpleCaseModel.column().alias()
+ .map(FragmentAndParameters::fromFragment)
+ .orElseGet(() -> simpleCaseModel.column().render(renderingContext))
.mapFragment(f -> "case " + f); //$NON-NLS-1$
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java
index c25a29ff9..f11662c02 100644
--- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java
+++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java
@@ -78,8 +78,8 @@ private FragmentAndParameters calculateUpdateStatementStart() {
private FragmentAndParameters calculateSetPhrase() {
List> fragmentsAndParameters = updateModel.columnMappings()
- .map(m -> m.accept(visitor))
- .collect(Collectors.toList());
+ .map(m -> m.accept(visitor))
+ .toList();
Validator.assertFalse(fragmentsAndParameters.stream().noneMatch(Optional::isPresent),
"ERROR.18"); //$NON-NLS-1$
@@ -121,7 +121,7 @@ private Optional calculateOrderByClause() {
}
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
- return new OrderByRenderer().render(orderByModel);
+ return new OrderByRenderer(renderingContext).render(orderByModel);
}
public static Builder withUpdateModel(UpdateModel updateModel) {
diff --git a/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java b/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java
index c6b65b3b0..4c240120c 100644
--- a/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java
+++ b/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java
@@ -46,7 +46,7 @@ public Map parameters() {
* @return a new instance with the same parameters and a transformed fragment
*/
public FragmentAndParameters mapFragment(UnaryOperator mapper) {
- return FragmentAndParameters.withFragment(mapper.apply(fragment))
+ return withFragment(mapper.apply(fragment))
.withParameters(parameters)
.build();
}
diff --git a/src/main/java/org/mybatis/dynamic/sql/util/SqlProviderAdapter.java b/src/main/java/org/mybatis/dynamic/sql/util/SqlProviderAdapter.java
index fafcc6bda..2e129b611 100644
--- a/src/main/java/org/mybatis/dynamic/sql/util/SqlProviderAdapter.java
+++ b/src/main/java/org/mybatis/dynamic/sql/util/SqlProviderAdapter.java
@@ -17,7 +17,6 @@
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider;
@@ -76,7 +75,7 @@ public String insertMultipleWithGeneratedKeys(Map parameterMap)
.map(Map.Entry::getValue)
.filter(String.class::isInstance)
.map(String.class::cast)
- .collect(Collectors.toList());
+ .toList();
if (entries.size() == 1) {
return entries.get(0);
diff --git a/src/main/java/org/mybatis/dynamic/sql/util/mybatis3/CommonSelectMapper.java b/src/main/java/org/mybatis/dynamic/sql/util/mybatis3/CommonSelectMapper.java
index d7d67edc0..f0cfb72c0 100644
--- a/src/main/java/org/mybatis/dynamic/sql/util/mybatis3/CommonSelectMapper.java
+++ b/src/main/java/org/mybatis/dynamic/sql/util/mybatis3/CommonSelectMapper.java
@@ -20,7 +20,6 @@
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
-import java.util.stream.Collectors;
import org.apache.ibatis.annotations.SelectProvider;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
@@ -110,7 +109,7 @@ default List selectMany(SelectStatementProvider selectStatement,
Function