Skip to content

Commit cd452ac

Browse files
committed
Shim in a more general render method for sort specification
1 parent 0333622 commit cd452ac

File tree

10 files changed

+73
-57
lines changed

10 files changed

+73
-57
lines changed

src/main/java/org/mybatis/dynamic/sql/SortSpecification.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
*/
1616
package org.mybatis.dynamic.sql;
1717

18+
import org.mybatis.dynamic.sql.exception.DynamicSqlException;
19+
import org.mybatis.dynamic.sql.render.RenderingContext;
20+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
21+
import org.mybatis.dynamic.sql.util.Messages;
22+
1823
/**
1924
* Defines attributes of columns that are necessary for rendering an order by expression.
2025
*
@@ -34,13 +39,33 @@ public interface SortSpecification {
3439
* NOT include the "DESC" word for descending sort specifications.
3540
*
3641
* @return the order by phrase
42+
* @deprecated Please replace this method by overriding the more general "renderForOrderBy" method. Target for
43+
* removal in release 2.1
3744
*/
38-
String orderByName();
45+
@Deprecated
46+
default String orderByName() {
47+
throw new DynamicSqlException(Messages.getString("ERROR.44")); //$NON-NLS-1$
48+
}
3949

4050
/**
4151
* Return true if the sort order is descending.
4252
*
4353
* @return true if the SortSpecification should render as descending
54+
* @deprecated Please replace this method by overriding the more general "renderForOrderBy" method. Target for
55+
* removal in release 2.1
4456
*/
45-
boolean isDescending();
57+
@Deprecated
58+
default boolean isDescending() {
59+
throw new DynamicSqlException(Messages.getString("ERROR.44")); //$NON-NLS-1$
60+
}
61+
62+
// the default implementation ensures compatibility with prior releases. When the
63+
// deprecated methods are removed, this function can become purely abstract.
64+
default FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
65+
String phrase = orderByName();
66+
if (isDescending()) {
67+
phrase = phrase + " DESC"; //$NON-NLS-1$
68+
}
69+
return FragmentAndParameters.fromFragment(phrase);
70+
}
4671
}

src/main/java/org/mybatis/dynamic/sql/SqlColumn.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class SqlColumn<T> implements BindableColumn<T>, SortSpecification {
3030
protected final String name;
3131
protected final SqlTable table;
3232
protected final JDBCType jdbcType;
33-
protected final boolean isDescending;
33+
protected final String descendingPhrase;
3434
protected final String alias;
3535
protected final String typeHandler;
3636
protected final RenderingStrategy renderingStrategy;
@@ -42,7 +42,7 @@ private SqlColumn(Builder<T> builder) {
4242
name = Objects.requireNonNull(builder.name);
4343
table = Objects.requireNonNull(builder.table);
4444
jdbcType = builder.jdbcType;
45-
isDescending = builder.isDescending;
45+
descendingPhrase = builder.descendingPhrase;
4646
alias = builder.alias;
4747
typeHandler = builder.typeHandler;
4848
renderingStrategy = builder.renderingStrategy;
@@ -87,7 +87,7 @@ public Object convertParameterType(T value) {
8787
@Override
8888
public SortSpecification descending() {
8989
Builder<T> b = copy();
90-
return b.withDescending(true).build();
90+
return b.withDescendingPhrase(" DESC").build(); //$NON-NLS-1$
9191
}
9292

9393
@Override
@@ -126,13 +126,8 @@ public SqlColumn<T> asCamelCase() {
126126
}
127127

128128
@Override
129-
public boolean isDescending() {
130-
return isDescending;
131-
}
132-
133-
@Override
134-
public String orderByName() {
135-
return alias().orElse(name);
129+
public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
130+
return FragmentAndParameters.fromFragment(alias().orElse(name) + descendingPhrase);
136131
}
137132

138133
@Override
@@ -188,7 +183,7 @@ private <S> Builder<S> copy() {
188183
.withName(this.name)
189184
.withTable(this.table)
190185
.withJdbcType(this.jdbcType)
191-
.withDescending(this.isDescending)
186+
.withDescendingPhrase(this.descendingPhrase)
192187
.withAlias(this.alias)
193188
.withTypeHandler(this.typeHandler)
194189
.withRenderingStrategy(this.renderingStrategy)
@@ -214,7 +209,7 @@ public static class Builder<T> {
214209
protected String name;
215210
protected SqlTable table;
216211
protected JDBCType jdbcType;
217-
protected boolean isDescending = false;
212+
protected String descendingPhrase = ""; //$NON-NLS-1$
218213
protected String alias;
219214
protected String typeHandler;
220215
protected RenderingStrategy renderingStrategy;
@@ -237,8 +232,8 @@ public Builder<T> withJdbcType(JDBCType jdbcType) {
237232
return this;
238233
}
239234

240-
public Builder<T> withDescending(boolean isDescending) {
241-
this.isDescending = isDescending;
235+
public Builder<T> withDescendingPhrase(String descendingPhrase) {
236+
this.descendingPhrase = descendingPhrase;
242237
return this;
243238
}
244239

src/main/java/org/mybatis/dynamic/sql/common/OrderByRenderer.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@
1515
*/
1616
package org.mybatis.dynamic.sql.common;
1717

18+
import java.util.Objects;
1819
import java.util.stream.Collectors;
1920

20-
import org.mybatis.dynamic.sql.SortSpecification;
21+
import org.mybatis.dynamic.sql.render.RenderingContext;
2122
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
23+
import org.mybatis.dynamic.sql.util.FragmentCollector;
2224

2325
public class OrderByRenderer {
24-
public FragmentAndParameters render(OrderByModel orderByModel) {
25-
String phrase = orderByModel.columns()
26-
.map(this::calculateOrderByPhrase)
27-
.collect(Collectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
28-
return FragmentAndParameters.fromFragment(phrase);
26+
private final RenderingContext renderingContext;
27+
28+
public OrderByRenderer(RenderingContext renderingContext) {
29+
this.renderingContext = Objects.requireNonNull(renderingContext);
2930
}
3031

31-
private String calculateOrderByPhrase(SortSpecification column) {
32-
String phrase = column.orderByName();
33-
if (column.isDescending()) {
34-
phrase = phrase + " DESC"; //$NON-NLS-1$
35-
}
36-
return phrase;
32+
public FragmentAndParameters render(OrderByModel orderByModel) {
33+
return orderByModel.columns().map(c -> c.renderForOrderBy(renderingContext))
34+
.collect(FragmentCollector.collect())
35+
.toFragmentAndParameters(
36+
Collectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
3737
}
3838
}

src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private Optional<FragmentAndParameters> calculateOrderByClause() {
9696
}
9797

9898
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
99-
return new OrderByRenderer().render(orderByModel);
99+
return new OrderByRenderer(renderingContext).render(orderByModel);
100100
}
101101

102102
public static Builder withDeleteModel(DeleteModel deleteModel) {

src/main/java/org/mybatis/dynamic/sql/select/ColumnSortSpecification.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,31 @@
1919

2020
import org.mybatis.dynamic.sql.SortSpecification;
2121
import org.mybatis.dynamic.sql.SqlColumn;
22+
import org.mybatis.dynamic.sql.render.RenderingContext;
23+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2224

2325
public class ColumnSortSpecification implements SortSpecification {
2426
private final String tableAlias;
2527
private final SqlColumn<?> column;
26-
private final boolean isDescending;
28+
private final String descendingPhrase;
2729

2830
public ColumnSortSpecification(String tableAlias, SqlColumn<?> column) {
29-
this(tableAlias, column, false);
31+
this(tableAlias, column, ""); //$NON-NLS-1$
3032
}
3133

32-
private ColumnSortSpecification(String tableAlias, SqlColumn<?> column, boolean isDescending) {
34+
private ColumnSortSpecification(String tableAlias, SqlColumn<?> column, String descendingPhrase) {
3335
this.tableAlias = Objects.requireNonNull(tableAlias);
3436
this.column = Objects.requireNonNull(column);
35-
this.isDescending = isDescending;
37+
this.descendingPhrase = descendingPhrase;
3638
}
3739

3840
@Override
3941
public SortSpecification descending() {
40-
return new ColumnSortSpecification(tableAlias, column, true);
42+
return new ColumnSortSpecification(tableAlias, column, " DESC"); //$NON-NLS-1$
4143
}
4244

4345
@Override
44-
public String orderByName() {
45-
return tableAlias + "." + column.name(); //$NON-NLS-1$
46-
}
47-
48-
@Override
49-
public boolean isDescending() {
50-
return isDescending;
46+
public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
47+
return FragmentAndParameters.fromFragment(tableAlias + "." + column.name() + descendingPhrase); //$NON-NLS-1$
5148
}
5249
}

src/main/java/org/mybatis/dynamic/sql/select/SimpleSortSpecification.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.util.Objects;
1919

2020
import org.mybatis.dynamic.sql.SortSpecification;
21+
import org.mybatis.dynamic.sql.render.RenderingContext;
22+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2123

2224
/**
2325
* This class is used for an order by phrase where there is no suitable column name
@@ -28,30 +30,25 @@
2830
public class SimpleSortSpecification implements SortSpecification {
2931

3032
private final String name;
31-
private final boolean isDescending;
33+
private final String descendingPhrase;
3234

3335
private SimpleSortSpecification(String name) {
34-
this(name, false);
36+
this(name, ""); //$NON-NLS-1$
3537
}
3638

37-
private SimpleSortSpecification(String name, boolean isDescending) {
39+
private SimpleSortSpecification(String name, String descendingPhrase) {
3840
this.name = Objects.requireNonNull(name);
39-
this.isDescending = isDescending;
41+
this.descendingPhrase = descendingPhrase;
4042
}
4143

4244
@Override
4345
public SortSpecification descending() {
44-
return new SimpleSortSpecification(name, true);
46+
return new SimpleSortSpecification(name, " DESC"); //$NON-NLS-1$
4547
}
4648

4749
@Override
48-
public String orderByName() {
49-
return name;
50-
}
51-
52-
@Override
53-
public boolean isDescending() {
54-
return isDescending;
50+
public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
51+
return FragmentAndParameters.fromFragment(name + descendingPhrase);
5552
}
5653

5754
public static SimpleSortSpecification of(String name) {

src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private Optional<FragmentAndParameters> renderOrderBy() {
8787
}
8888

8989
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
90-
return new OrderByRenderer().render(orderByModel);
90+
return new OrderByRenderer(renderingContext).render(orderByModel);
9191
}
9292

9393
private Optional<FragmentAndParameters> renderPagingModel() {

src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private Optional<FragmentAndParameters> renderOrderBy() {
6868
}
6969

7070
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
71-
return new OrderByRenderer().render(orderByModel);
71+
return new OrderByRenderer(renderingContext).render(orderByModel);
7272
}
7373

7474
private Optional<FragmentAndParameters> renderPagingModel() {

src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private Optional<FragmentAndParameters> calculateOrderByClause() {
122122
}
123123

124124
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
125-
return new OrderByRenderer().render(orderByModel);
125+
return new OrderByRenderer(renderingContext).render(orderByModel);
126126
}
127127

128128
public static Builder withUpdateModel(UpdateModel updateModel) {

src/main/resources/org/mybatis/dynamic/sql/util/messages.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ ERROR.33=Calling "select" or "selectDistinct" more than once is not allowed. Add
5252
union or unionAll expression
5353
ERROR.34=You must specify "select" or "selectDistinct" before any other clauses in a multi-select statement
5454
ERROR.35=Multi-select statements must have at least one "union" or "union all" expression
55-
ERROR.36=You must either implement the "render" or "renderWithTableAlias" method in a column or function
55+
ERROR.36=You must either implement the "render" or "renderWithTableAlias" method in a column or function
5656
ERROR.37=The "{0}" function does not support conditions that fail to render
5757
ERROR.38=Bound values cannot be aliased
5858
ERROR.39=When clauses in case expressions must render
5959
ERROR.40=Case expressions must have at least one "when" clause
6060
ERROR.41=You cannot call "then" in a Kotlin case expression more than once
6161
ERROR.42=You cannot call `else` in a Kotlin case expression more than once
6262
ERROR.43=A Kotlin cast expression must have one, and only one, `as` element
63+
ERROR.44=You must either implement the "renderForOrderBy" method or both "orderByName" and "isDescending" methods in a \
64+
sort specification
6365
INTERNAL.ERROR=Internal Error {0}

0 commit comments

Comments
 (0)