Skip to content

Commit b959789

Browse files
committed
Add CAST function, then render casts properly
1 parent f4ca50a commit b959789

File tree

18 files changed

+541
-139
lines changed

18 files changed

+541
-139
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseDSL;
4747
import org.mybatis.dynamic.sql.select.caseexpression.SimpleCaseDSL;
4848
import org.mybatis.dynamic.sql.select.function.Add;
49+
import org.mybatis.dynamic.sql.select.function.Cast;
4950
import org.mybatis.dynamic.sql.select.function.Concat;
5051
import org.mybatis.dynamic.sql.select.function.Concatenate;
5152
import org.mybatis.dynamic.sql.select.function.Divide;
@@ -530,6 +531,10 @@ static <T> Subtract<T> subtract(BindableColumn<T> firstColumn, BasicColumn secon
530531
return Subtract.of(firstColumn, secondColumn, subsequentColumns);
531532
}
532533

534+
static CastFinisher cast(BasicColumn column) {
535+
return new CastFinisher(column);
536+
}
537+
533538
/**
534539
* Concatenate function that renders as "(x || y || z)". This will not work on some
535540
* databases like MySql. In that case, use {@link SqlBuilder#concat(BindableColumn, BasicColumn...)}
@@ -981,4 +986,19 @@ public <T> GeneralInsertDSL.SetClauseFinisher<T> set(SqlColumn<T> column) {
981986
.set(column);
982987
}
983988
}
989+
990+
class CastFinisher {
991+
private final BasicColumn column;
992+
993+
public CastFinisher(BasicColumn column) {
994+
this.column = column;
995+
}
996+
997+
public Cast as(String targetType) {
998+
return new Cast.Builder()
999+
.withColumn(column)
1000+
.withTargetType(targetType)
1001+
.build();
1002+
}
1003+
}
9841004
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.mybatis.dynamic.sql.render.RenderingContext;
2222
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
23+
import org.mybatis.dynamic.sql.util.StringUtilities;
2324

2425
public class StringConstant implements BindableColumn<String> {
2526

@@ -42,7 +43,7 @@ public Optional<String> alias() {
4243

4344
@Override
4445
public FragmentAndParameters render(RenderingContext renderingContext) {
45-
return FragmentAndParameters.fromFragment("'" + value + "'"); //$NON-NLS-1$ //$NON-NLS-2$
46+
return FragmentAndParameters.fromFragment(StringUtilities.quoteStringForSQL(value));
4647
}
4748

4849
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import java.util.List;
2020
import java.util.stream.Stream;
2121

22+
import org.mybatis.dynamic.sql.BasicColumn;
23+
2224
public class BasicWhenCondition<T> extends SimpleCaseWhenCondition<T> {
2325
private final List<T> conditions = new ArrayList<>();
2426

25-
public BasicWhenCondition(List<T> conditions, Object thenValue) {
27+
public BasicWhenCondition(List<T> conditions, BasicColumn thenValue) {
2628
super(thenValue);
2729
this.conditions.addAll(conditions);
2830
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import java.util.List;
2020
import java.util.stream.Stream;
2121

22+
import org.mybatis.dynamic.sql.BasicColumn;
2223
import org.mybatis.dynamic.sql.VisitableCondition;
2324

2425
public class ConditionBasedWhenCondition<T> extends SimpleCaseWhenCondition<T> {
2526
private final List<VisitableCondition<T>> conditions = new ArrayList<>();
2627

27-
public ConditionBasedWhenCondition(List<VisitableCondition<T>> conditions, Object thenValue) {
28+
public ConditionBasedWhenCondition(List<VisitableCondition<T>> conditions, BasicColumn thenValue) {
2829
super(thenValue);
2930
this.conditions.addAll(conditions);
3031
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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 org.mybatis.dynamic.sql.select.caseexpression;
17+
18+
import org.mybatis.dynamic.sql.BasicColumn;
19+
import org.mybatis.dynamic.sql.Constant;
20+
import org.mybatis.dynamic.sql.StringConstant;
21+
22+
public interface ElseDSL<T> {
23+
24+
@SuppressWarnings("java:S100")
25+
default T else_(String value) {
26+
return else_(StringConstant.of(value));
27+
}
28+
29+
@SuppressWarnings("java:S100")
30+
default T else_(Boolean value) {
31+
return else_(Constant.of(value.toString()));
32+
}
33+
34+
@SuppressWarnings("java:S100")
35+
default T else_(Integer value) {
36+
return else_(Constant.of(value.toString()));
37+
}
38+
39+
@SuppressWarnings("java:S100")
40+
default T else_(Long value) {
41+
return else_(Constant.of(value.toString()));
42+
}
43+
44+
@SuppressWarnings("java:S100")
45+
default T else_(Double value) {
46+
return else_(Constant.of(value.toString()));
47+
}
48+
49+
@SuppressWarnings("java:S100")
50+
T else_(BasicColumn column);
51+
}

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

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.caseexpression;
1717

18-
import static org.mybatis.dynamic.sql.util.StringUtilities.quoteStringForSQL;
19-
2018
import java.util.ArrayList;
2119
import java.util.Arrays;
2220
import java.util.List;
@@ -30,9 +28,9 @@
3028
import org.mybatis.dynamic.sql.VisitableCondition;
3129
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionDSL;
3230

33-
public class SearchedCaseDSL {
31+
public class SearchedCaseDSL implements ElseDSL<SearchedCaseDSL.SearchedCaseEnder> {
3432
private final List<SearchedCaseModel.SearchedWhenCondition> whenConditions = new ArrayList<>();
35-
private Object elseValue;
33+
private BasicColumn elseValue;
3634

3735
public <T> WhenDSL when(BindableColumn<T> column, VisitableCondition<T> condition,
3836
AndOrCriteriaGroup... subCriteria) {
@@ -67,14 +65,9 @@ private WhenDSL initialize(SqlCriterion sqlCriterion) {
6765
}
6866

6967
@SuppressWarnings("java:S100")
70-
public SearchedCaseEnder else_(String value) {
71-
this.elseValue = quoteStringForSQL(value);
72-
return new SearchedCaseEnder();
73-
}
74-
75-
@SuppressWarnings("java:S100")
76-
public SearchedCaseEnder else_(Object value) {
77-
this.elseValue = value;
68+
@Override
69+
public SearchedCaseEnder else_(BasicColumn column) {
70+
elseValue = column;
7871
return new SearchedCaseEnder();
7972
}
8073

@@ -85,19 +78,15 @@ public BasicColumn end() {
8578
.build();
8679
}
8780

88-
public class WhenDSL extends AbstractBooleanExpressionDSL<WhenDSL> {
81+
public class WhenDSL extends AbstractBooleanExpressionDSL<WhenDSL> implements ThenDSL<SearchedCaseDSL> {
8982
private WhenDSL(SqlCriterion sqlCriterion) {
9083
setInitialCriterion(sqlCriterion);
9184
}
9285

93-
public SearchedCaseDSL then(String value) {
86+
@Override
87+
public SearchedCaseDSL then(BasicColumn column) {
9488
whenConditions.add(new SearchedCaseModel.SearchedWhenCondition(getInitialCriterion(), subCriteria,
95-
quoteStringForSQL(value)));
96-
return SearchedCaseDSL.this;
97-
}
98-
99-
public SearchedCaseDSL then(Object value) {
100-
whenConditions.add(new SearchedCaseModel.SearchedWhenCondition(getInitialCriterion(), subCriteria, value));
89+
column));
10190
return SearchedCaseDSL.this;
10291
}
10392

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
public class SearchedCaseModel implements BasicColumn {
3434
private final List<SearchedWhenCondition> whenConditions;
35-
private final Object elseValue;
35+
private final BasicColumn elseValue;
3636
private final String alias;
3737

3838
private SearchedCaseModel(Builder builder) {
@@ -46,7 +46,7 @@ public Stream<SearchedWhenCondition> whenConditions() {
4646
return whenConditions.stream();
4747
}
4848

49-
public Optional<Object> elseValue() {
49+
public Optional<BasicColumn> elseValue() {
5050
return Optional.ofNullable(elseValue);
5151
}
5252

@@ -70,30 +70,30 @@ public FragmentAndParameters render(RenderingContext renderingContext) {
7070

7171
public static class SearchedWhenCondition extends AbstractBooleanExpressionModel {
7272

73-
private final Object thenValue;
73+
private final BasicColumn thenValue;
7474

75-
public Object thenValue() {
75+
public BasicColumn thenValue() {
7676
return thenValue;
7777
}
7878

7979
public SearchedWhenCondition(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria,
80-
Object thenValue) {
80+
BasicColumn thenValue) {
8181
super(initialCriterion, subCriteria);
8282
this.thenValue = Objects.requireNonNull(thenValue);
8383
}
8484
}
8585

8686
public static class Builder {
8787
private final List<SearchedWhenCondition> whenConditions = new ArrayList<>();
88-
private Object elseValue;
88+
private BasicColumn elseValue;
8989
private String alias;
9090

9191
public Builder withWhenConditions(List<SearchedWhenCondition> whenConditions) {
9292
this.whenConditions.addAll(whenConditions);
9393
return this;
9494
}
9595

96-
public Builder withElseValue(Object elseValue) {
96+
public Builder withElseValue(BasicColumn elseValue) {
9797
this.elseValue = elseValue;
9898
return this;
9999
}

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

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.caseexpression;
1717

18-
import static org.mybatis.dynamic.sql.util.StringUtilities.quoteStringForSQL;
19-
2018
import java.util.ArrayList;
2119
import java.util.Arrays;
2220
import java.util.List;
@@ -26,10 +24,10 @@
2624
import org.mybatis.dynamic.sql.BindableColumn;
2725
import org.mybatis.dynamic.sql.VisitableCondition;
2826

29-
public class SimpleCaseDSL<T> {
27+
public class SimpleCaseDSL<T> implements ElseDSL<SimpleCaseDSL<T>.SimpleCaseEnder> {
3028
private final BindableColumn<T> column;
3129
private final List<SimpleCaseWhenCondition<T>> whenConditions = new ArrayList<>();
32-
private Object elseValue;
30+
private BasicColumn elseValue;
3331

3432
private SimpleCaseDSL(BindableColumn<T> column) {
3533
this.column = Objects.requireNonNull(column);
@@ -56,14 +54,9 @@ public BasicWhenFinisher when(T condition, List<T> subsequentConditions) {
5654
}
5755

5856
@SuppressWarnings("java:S100")
59-
public SimpleCaseEnder else_(String value) {
60-
elseValue = quoteStringForSQL(value);
61-
return new SimpleCaseEnder();
62-
}
63-
64-
@SuppressWarnings("java:S100")
65-
public SimpleCaseEnder else_(Object value) {
66-
elseValue = value;
57+
@Override
58+
public SimpleCaseEnder else_(BasicColumn column) {
59+
elseValue = column;
6760
return new SimpleCaseEnder();
6861
}
6962

@@ -75,7 +68,7 @@ public BasicColumn end() {
7568
.build();
7669
}
7770

78-
public class ConditionBasedWhenFinisher {
71+
public class ConditionBasedWhenFinisher implements ThenDSL<SimpleCaseDSL<T>> {
7972
private final List<VisitableCondition<T>> conditions = new ArrayList<>();
8073

8174
private ConditionBasedWhenFinisher(VisitableCondition<T> condition,
@@ -84,32 +77,24 @@ private ConditionBasedWhenFinisher(VisitableCondition<T> condition,
8477
conditions.addAll(subsequentConditions);
8578
}
8679

87-
public SimpleCaseDSL<T> then(String value) {
88-
whenConditions.add(new ConditionBasedWhenCondition<>(conditions, quoteStringForSQL(value)));
89-
return SimpleCaseDSL.this;
90-
}
91-
92-
public SimpleCaseDSL<T> then(Object value) {
93-
whenConditions.add(new ConditionBasedWhenCondition<>(conditions, value));
80+
@Override
81+
public SimpleCaseDSL<T> then(BasicColumn column) {
82+
whenConditions.add(new ConditionBasedWhenCondition<>(conditions, column));
9483
return SimpleCaseDSL.this;
9584
}
9685
}
9786

98-
public class BasicWhenFinisher {
87+
public class BasicWhenFinisher implements ThenDSL<SimpleCaseDSL<T>> {
9988
private final List<T> values = new ArrayList<>();
10089

10190
private BasicWhenFinisher(T value, List<T> subsequentValues) {
10291
values.add(value);
10392
values.addAll(subsequentValues);
10493
}
10594

106-
public SimpleCaseDSL<T> then(String value) {
107-
whenConditions.add(new BasicWhenCondition<>(values, quoteStringForSQL(value)));
108-
return SimpleCaseDSL.this;
109-
}
110-
111-
public SimpleCaseDSL<T> then(Object value) {
112-
whenConditions.add(new BasicWhenCondition<>(values, value));
95+
@Override
96+
public SimpleCaseDSL<T> then(BasicColumn column) {
97+
whenConditions.add(new BasicWhenCondition<>(values, column));
11398
return SimpleCaseDSL.this;
11499
}
115100
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
public class SimpleCaseModel<T> implements BasicColumn {
3232
private final BindableColumn<T> column;
3333
private final List<SimpleCaseWhenCondition<T>> whenConditions;
34-
private final Object elseValue;
34+
private final BasicColumn elseValue;
3535
private final String alias;
3636

3737
private SimpleCaseModel(Builder<T> builder) {
@@ -50,7 +50,7 @@ public Stream<SimpleCaseWhenCondition<T>> whenConditions() {
5050
return whenConditions.stream();
5151
}
5252

53-
public Optional<Object> elseValue() {
53+
public Optional<BasicColumn> elseValue() {
5454
return Optional.ofNullable(elseValue);
5555
}
5656

@@ -77,7 +77,7 @@ public FragmentAndParameters render(RenderingContext renderingContext) {
7777
public static class Builder<T> {
7878
private BindableColumn<T> column;
7979
private final List<SimpleCaseWhenCondition<T>> whenConditions = new ArrayList<>();
80-
private Object elseValue;
80+
private BasicColumn elseValue;
8181
private String alias;
8282

8383
public Builder<T> withColumn(BindableColumn<T> column) {
@@ -90,7 +90,7 @@ public Builder<T> withWhenConditions(List<SimpleCaseWhenCondition<T>> whenCondit
9090
return this;
9191
}
9292

93-
public Builder<T> withElseValue(Object elseValue) {
93+
public Builder<T> withElseValue(BasicColumn elseValue) {
9494
this.elseValue = elseValue;
9595
return this;
9696
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717

1818
import java.util.Objects;
1919

20+
import org.mybatis.dynamic.sql.BasicColumn;
21+
2022
public abstract class SimpleCaseWhenCondition<T> {
21-
private final Object thenValue;
23+
private final BasicColumn thenValue;
2224

23-
protected SimpleCaseWhenCondition(Object thenValue) {
25+
protected SimpleCaseWhenCondition(BasicColumn thenValue) {
2426
this.thenValue = Objects.requireNonNull(thenValue);
2527
}
2628

27-
public Object thenValue() {
29+
public BasicColumn thenValue() {
2830
return thenValue;
2931
}
3032

0 commit comments

Comments
 (0)