Skip to content

Commit 2d85bb4

Browse files
committed
Allow case statements in order by phrases
1 parent cd452ac commit 2d85bb4

File tree

10 files changed

+470
-10
lines changed

10 files changed

+470
-10
lines changed

src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseDSL.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public SearchedCaseEnder else_(BasicColumn column) {
7171
return new SearchedCaseEnder();
7272
}
7373

74-
public BasicColumn end() {
74+
public SearchedCaseModel end() {
7575
return new SearchedCaseModel.Builder()
7676
.withElseValue(elseValue)
7777
.withWhenConditions(whenConditions)
@@ -100,7 +100,7 @@ protected WhenDSL getThis() {
100100
}
101101

102102
public class SearchedCaseEnder {
103-
public BasicColumn end() {
103+
public SearchedCaseModel end() {
104104
return SearchedCaseDSL.this.end();
105105
}
106106
}

src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SearchedCaseModel.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,23 @@
2121
import java.util.stream.Stream;
2222

2323
import org.mybatis.dynamic.sql.BasicColumn;
24+
import org.mybatis.dynamic.sql.SortSpecification;
2425
import org.mybatis.dynamic.sql.render.RenderingContext;
2526
import org.mybatis.dynamic.sql.select.render.SearchedCaseRenderer;
2627
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2728
import org.mybatis.dynamic.sql.util.Validator;
2829

29-
public class SearchedCaseModel implements BasicColumn {
30+
public class SearchedCaseModel implements BasicColumn, SortSpecification {
3031
private final List<SearchedCaseWhenCondition> whenConditions;
3132
private final BasicColumn elseValue;
3233
private final String alias;
34+
private final String descendingPhrase;
3335

3436
private SearchedCaseModel(Builder builder) {
3537
whenConditions = builder.whenConditions;
3638
alias = builder.alias;
3739
elseValue = builder.elseValue;
40+
descendingPhrase = builder.descendingPhrase;
3841
Validator.assertNotEmpty(whenConditions, "ERROR.40"); //$NON-NLS-1$
3942
}
4043

@@ -56,9 +59,24 @@ public SearchedCaseModel as(String alias) {
5659
return new Builder().withWhenConditions(whenConditions)
5760
.withElseValue(elseValue)
5861
.withAlias(alias)
62+
.withDescendingPhrase(descendingPhrase)
5963
.build();
6064
}
6165

66+
@Override
67+
public SearchedCaseModel descending() {
68+
return new Builder().withWhenConditions(whenConditions)
69+
.withElseValue(elseValue)
70+
.withAlias(alias)
71+
.withDescendingPhrase(" DESC") //$NON-NLS-1$
72+
.build();
73+
}
74+
75+
@Override
76+
public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
77+
return render(renderingContext).mapFragment(f -> f + descendingPhrase);
78+
}
79+
6280
@Override
6381
public FragmentAndParameters render(RenderingContext renderingContext) {
6482
return new SearchedCaseRenderer(this, renderingContext).render();
@@ -68,6 +86,7 @@ public static class Builder {
6886
private final List<SearchedCaseWhenCondition> whenConditions = new ArrayList<>();
6987
private BasicColumn elseValue;
7088
private String alias;
89+
private String descendingPhrase = ""; //$NON-NLS-1$
7190

7291
public Builder withWhenConditions(List<SearchedCaseWhenCondition> whenConditions) {
7392
this.whenConditions.addAll(whenConditions);
@@ -84,6 +103,11 @@ public Builder withAlias(String alias) {
84103
return this;
85104
}
86105

106+
public Builder withDescendingPhrase(String descendingPhrase) {
107+
this.descendingPhrase = descendingPhrase;
108+
return this;
109+
}
110+
87111
public SearchedCaseModel build() {
88112
return new SearchedCaseModel(this);
89113
}

src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseDSL.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public SimpleCaseEnder else_(BasicColumn column) {
6060
return new SimpleCaseEnder();
6161
}
6262

63-
public BasicColumn end() {
63+
public SimpleCaseModel<T> end() {
6464
return new SimpleCaseModel.Builder<T>()
6565
.withColumn(column)
6666
.withWhenConditions(whenConditions)
@@ -100,7 +100,7 @@ public SimpleCaseDSL<T> then(BasicColumn column) {
100100
}
101101

102102
public class SimpleCaseEnder {
103-
public BasicColumn end() {
103+
public SimpleCaseModel<T> end() {
104104
return SimpleCaseDSL.this.end();
105105
}
106106
}

src/main/java/org/mybatis/dynamic/sql/select/caseexpression/SimpleCaseModel.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,25 @@
2323

2424
import org.mybatis.dynamic.sql.BasicColumn;
2525
import org.mybatis.dynamic.sql.BindableColumn;
26+
import org.mybatis.dynamic.sql.SortSpecification;
2627
import org.mybatis.dynamic.sql.render.RenderingContext;
2728
import org.mybatis.dynamic.sql.select.render.SimpleCaseRenderer;
2829
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2930
import org.mybatis.dynamic.sql.util.Validator;
3031

31-
public class SimpleCaseModel<T> implements BasicColumn {
32+
public class SimpleCaseModel<T> implements BasicColumn, SortSpecification {
3233
private final BindableColumn<T> column;
3334
private final List<SimpleCaseWhenCondition<T>> whenConditions;
3435
private final BasicColumn elseValue;
3536
private final String alias;
37+
private final String descendingPhrase;
3638

3739
private SimpleCaseModel(Builder<T> builder) {
3840
column = Objects.requireNonNull(builder.column);
3941
whenConditions = builder.whenConditions;
4042
elseValue = builder.elseValue;
4143
alias = builder.alias;
44+
descendingPhrase = builder.descendingPhrase;
4245
Validator.assertNotEmpty(whenConditions, "ERROR.40"); //$NON-NLS-1$
4346
}
4447

@@ -66,9 +69,26 @@ public SimpleCaseModel<T> as(String alias) {
6669
.withWhenConditions(whenConditions)
6770
.withElseValue(elseValue)
6871
.withAlias(alias)
72+
.withDescendingPhrase(descendingPhrase)
6973
.build();
7074
}
7175

76+
@Override
77+
public SimpleCaseModel<T> descending() {
78+
return new Builder<T>()
79+
.withColumn(column)
80+
.withWhenConditions(whenConditions)
81+
.withElseValue(elseValue)
82+
.withAlias(alias)
83+
.withDescendingPhrase(" DESC") //$NON-NLS-1$
84+
.build();
85+
}
86+
87+
@Override
88+
public FragmentAndParameters renderForOrderBy(RenderingContext renderingContext) {
89+
return render(renderingContext).mapFragment(f -> f + descendingPhrase);
90+
}
91+
7292
@Override
7393
public FragmentAndParameters render(RenderingContext renderingContext) {
7494
return new SimpleCaseRenderer<>(this, renderingContext).render();
@@ -79,6 +99,7 @@ public static class Builder<T> {
7999
private final List<SimpleCaseWhenCondition<T>> whenConditions = new ArrayList<>();
80100
private BasicColumn elseValue;
81101
private String alias;
102+
private String descendingPhrase = ""; //$NON-NLS-1$
82103

83104
public Builder<T> withColumn(BindableColumn<T> column) {
84105
this.column = column;
@@ -100,6 +121,11 @@ public Builder<T> withAlias(String alias) {
100121
return this;
101122
}
102123

124+
public Builder<T> withDescendingPhrase(String descendingPhrase) {
125+
this.descendingPhrase = descendingPhrase;
126+
return this;
127+
}
128+
103129
public SimpleCaseModel<T> build() {
104130
return new SimpleCaseModel<>(this);
105131
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public FragmentAndParameters render() {
4848
}
4949

5050
private FragmentAndParameters renderCase() {
51-
return simpleCaseModel.column().render(renderingContext)
51+
return simpleCaseModel.column().alias()
52+
.map(FragmentAndParameters::fromFragment)
53+
.orElseGet(() -> simpleCaseModel.column().render(renderingContext))
5254
.mapFragment(f -> "case " + f); //$NON-NLS-1$
5355
}
5456

src/main/java/org/mybatis/dynamic/sql/where/render/ColumnAndConditionRenderer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ private ColumnAndConditionRenderer(Builder<T> builder) {
3636
}
3737

3838
public FragmentAndParameters render() {
39-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
39+
FragmentAndParameters renderedLeftColumn = column.alias()
40+
.map(FragmentAndParameters::fromFragment)
41+
.orElseGet(() -> column.render(renderingContext));
4042

4143
DefaultConditionVisitor<T> visitor = DefaultConditionVisitor.withColumn(column)
4244
.withRenderingContext(renderingContext)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright 2016-2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package examples.mariadb;
17+
18+
import org.mybatis.dynamic.sql.SqlColumn;
19+
import org.mybatis.dynamic.sql.SqlTable;
20+
21+
import java.sql.JDBCType;
22+
23+
public final class NumbersDynamicSQLSupport {
24+
public static final Numbers numbers = new Numbers();
25+
public static final SqlColumn<Integer> id = numbers.id;
26+
public static final SqlColumn<String> description = numbers.description;
27+
28+
public static final class Numbers extends SqlTable {
29+
public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);
30+
public final SqlColumn<String> description = column("description", JDBCType.VARCHAR);
31+
32+
public Numbers() {
33+
super("numbers");
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)