Skip to content

Commit 5c9454f

Browse files
committed
Use a builder for boolean expression model
1 parent f450687 commit 5c9454f

File tree

11 files changed

+144
-58
lines changed

11 files changed

+144
-58
lines changed

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525

2626
public abstract class AbstractBooleanExpressionModel {
2727
private final SqlCriterion initialCriterion;
28-
private final List<AndOrCriteriaGroup> subCriteria = new ArrayList<>();
28+
private final List<AndOrCriteriaGroup> subCriteria ;
2929

30-
protected AbstractBooleanExpressionModel(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
31-
this.initialCriterion = initialCriterion;
32-
this.subCriteria.addAll(subCriteria);
30+
protected AbstractBooleanExpressionModel(AbstractBuilder<?> builder) {
31+
initialCriterion = builder.initialCriterion;
32+
subCriteria = builder.subCriteria;
3333
}
3434

3535
public Optional<SqlCriterion> initialCriterion() {
@@ -39,4 +39,21 @@ public Optional<SqlCriterion> initialCriterion() {
3939
public List<AndOrCriteriaGroup> subCriteria() {
4040
return Collections.unmodifiableList(subCriteria);
4141
}
42+
43+
public abstract static class AbstractBuilder<T extends AbstractBuilder<T>> {
44+
private SqlCriterion initialCriterion;
45+
private final List<AndOrCriteriaGroup> subCriteria = new ArrayList<>();
46+
47+
public T withInitialCriterion(SqlCriterion initialCriterion) {
48+
this.initialCriterion = initialCriterion;
49+
return getThis();
50+
}
51+
52+
public T withSubCriteria(List<AndOrCriteriaGroup> subCriteria) {
53+
this.subCriteria.addAll(subCriteria);
54+
return getThis();
55+
}
56+
57+
protected abstract T getThis();
58+
}
4259
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ void initialize(SqlCriterion sqlCriterion, List<AndOrCriteriaGroup> subCriteria)
3333
}
3434

3535
protected HavingModel buildModel() {
36-
return new HavingModel(getInitialCriterion(), subCriteria);
36+
return new HavingModel.Builder()
37+
.withInitialCriterion(getInitialCriterion())
38+
.withSubCriteria(subCriteria)
39+
.build();
3740
}
3841
}

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

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

18-
import java.util.List;
19-
20-
import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
21-
import org.mybatis.dynamic.sql.SqlCriterion;
2218
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionModel;
2319

2420
public class HavingModel extends AbstractBooleanExpressionModel {
25-
public HavingModel(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
26-
super(initialCriterion, subCriteria);
21+
private HavingModel(Builder builder) {
22+
super(builder);
23+
}
24+
25+
public static class Builder extends AbstractBuilder<Builder> {
26+
public HavingModel build() {
27+
return new HavingModel(this);
28+
}
29+
30+
@Override
31+
protected Builder getThis() {
32+
return this;
33+
}
2734
}
2835
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionDSL;
3030

3131
public class SearchedCaseDSL implements ElseDSL<SearchedCaseDSL.SearchedCaseEnder> {
32-
private final List<SearchedCaseModel.SearchedWhenCondition> whenConditions = new ArrayList<>();
32+
private final List<SearchedCaseWhenCondition> whenConditions = new ArrayList<>();
3333
private BasicColumn elseValue;
3434

3535
public <T> WhenDSL when(BindableColumn<T> column, VisitableCondition<T> condition,
@@ -85,8 +85,11 @@ private WhenDSL(SqlCriterion sqlCriterion) {
8585

8686
@Override
8787
public SearchedCaseDSL then(BasicColumn column) {
88-
whenConditions.add(new SearchedCaseModel.SearchedWhenCondition(getInitialCriterion(), subCriteria,
89-
column));
88+
whenConditions.add(new SearchedCaseWhenCondition.Builder()
89+
.withInitialCriterion(getInitialCriterion())
90+
.withSubCriteria(subCriteria)
91+
.withThenValue(column)
92+
.build());
9093
return SearchedCaseDSL.this;
9194
}
9295

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

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,17 @@
1717

1818
import java.util.ArrayList;
1919
import java.util.List;
20-
import java.util.Objects;
2120
import java.util.Optional;
2221
import java.util.stream.Stream;
2322

24-
import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
2523
import org.mybatis.dynamic.sql.BasicColumn;
26-
import org.mybatis.dynamic.sql.SqlCriterion;
27-
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionModel;
2824
import org.mybatis.dynamic.sql.render.RenderingContext;
2925
import org.mybatis.dynamic.sql.select.render.SearchedCaseRenderer;
3026
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3127
import org.mybatis.dynamic.sql.util.Validator;
3228

3329
public class SearchedCaseModel implements BasicColumn {
34-
private final List<SearchedWhenCondition> whenConditions;
30+
private final List<SearchedCaseWhenCondition> whenConditions;
3531
private final BasicColumn elseValue;
3632
private final String alias;
3733

@@ -42,7 +38,7 @@ private SearchedCaseModel(Builder builder) {
4238
Validator.assertNotEmpty(whenConditions, "ERROR.40"); //$NON-NLS-1$
4339
}
4440

45-
public Stream<SearchedWhenCondition> whenConditions() {
41+
public Stream<SearchedCaseWhenCondition> whenConditions() {
4642
return whenConditions.stream();
4743
}
4844

@@ -68,27 +64,12 @@ public FragmentAndParameters render(RenderingContext renderingContext) {
6864
return new SearchedCaseRenderer(this, renderingContext).render();
6965
}
7066

71-
public static class SearchedWhenCondition extends AbstractBooleanExpressionModel {
72-
73-
private final BasicColumn thenValue;
74-
75-
public BasicColumn thenValue() {
76-
return thenValue;
77-
}
78-
79-
public SearchedWhenCondition(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria,
80-
BasicColumn thenValue) {
81-
super(initialCriterion, subCriteria);
82-
this.thenValue = Objects.requireNonNull(thenValue);
83-
}
84-
}
85-
8667
public static class Builder {
87-
private final List<SearchedWhenCondition> whenConditions = new ArrayList<>();
68+
private final List<SearchedCaseWhenCondition> whenConditions = new ArrayList<>();
8869
private BasicColumn elseValue;
8970
private String alias;
9071

91-
public Builder withWhenConditions(List<SearchedWhenCondition> whenConditions) {
72+
public Builder withWhenConditions(List<SearchedCaseWhenCondition> whenConditions) {
9273
this.whenConditions.addAll(whenConditions);
9374
return this;
9475
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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 java.util.Objects;
19+
20+
import org.mybatis.dynamic.sql.BasicColumn;
21+
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionModel;
22+
23+
public class SearchedCaseWhenCondition extends AbstractBooleanExpressionModel {
24+
private final BasicColumn thenValue;
25+
26+
public BasicColumn thenValue() {
27+
return thenValue;
28+
}
29+
30+
private SearchedCaseWhenCondition(Builder builder) {
31+
super(builder);
32+
thenValue = Objects.requireNonNull(builder.thenValue);
33+
}
34+
35+
public static class Builder extends AbstractBuilder<Builder> {
36+
private BasicColumn thenValue;
37+
38+
public Builder withThenValue(BasicColumn thenValue) {
39+
this.thenValue = thenValue;
40+
return this;
41+
}
42+
43+
public SearchedCaseWhenCondition build() {
44+
return new SearchedCaseWhenCondition(this);
45+
}
46+
47+
@Override
48+
protected Builder getThis() {
49+
return this;
50+
}
51+
}
52+
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.mybatis.dynamic.sql.exception.InvalidSqlException;
2525
import org.mybatis.dynamic.sql.render.RenderingContext;
2626
import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseModel;
27+
import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseWhenCondition;
2728
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2829
import org.mybatis.dynamic.sql.util.FragmentCollector;
2930
import org.mybatis.dynamic.sql.util.Messages;
@@ -56,12 +57,12 @@ private FragmentAndParameters renderWhenConditions() {
5657
.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
5758
}
5859

59-
private FragmentAndParameters renderWhenCondition(SearchedCaseModel.SearchedWhenCondition whenCondition) {
60+
private FragmentAndParameters renderWhenCondition(SearchedCaseWhenCondition whenCondition) {
6061
return Stream.of(renderWhen(whenCondition), renderThen(whenCondition)).collect(FragmentCollector.collect())
6162
.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
6263
}
6364

64-
private FragmentAndParameters renderWhen(SearchedCaseModel.SearchedWhenCondition whenCondition) {
65+
private FragmentAndParameters renderWhen(SearchedCaseWhenCondition whenCondition) {
6566
SearchedCaseWhenConditionRenderer renderer = new SearchedCaseWhenConditionRenderer.Builder(whenCondition)
6667
.withRenderingContext(renderingContext)
6768
.build();
@@ -70,7 +71,7 @@ private FragmentAndParameters renderWhen(SearchedCaseModel.SearchedWhenCondition
7071
.orElseThrow(() -> new InvalidSqlException(Messages.getString("ERROR.39"))); //$NON-NLS-1$
7172
}
7273

73-
private FragmentAndParameters renderThen(SearchedCaseModel.SearchedWhenCondition whenCondition) {
74+
private FragmentAndParameters renderThen(SearchedCaseWhenCondition whenCondition) {
7475
return whenCondition.thenValue().render(renderingContext).mapFragment(f -> "then " + f);
7576
}
7677

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616
package org.mybatis.dynamic.sql.select.render;
1717

1818
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionRenderer;
19-
import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseModel.SearchedWhenCondition;
19+
import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseWhenCondition;
2020

21-
public class SearchedCaseWhenConditionRenderer extends AbstractBooleanExpressionRenderer<SearchedWhenCondition> {
21+
public class SearchedCaseWhenConditionRenderer extends AbstractBooleanExpressionRenderer<SearchedCaseWhenCondition> {
2222
protected SearchedCaseWhenConditionRenderer(Builder builder) {
2323
super("when", builder);
2424
}
2525

2626
public static class Builder
27-
extends AbstractBooleanExpressionRenderer.AbstractBuilder<SearchedWhenCondition, Builder> {
27+
extends AbstractBooleanExpressionRenderer.AbstractBuilder<SearchedCaseWhenCondition, Builder> {
2828

29-
protected Builder(SearchedWhenCondition model) {
29+
protected Builder(SearchedCaseWhenCondition model) {
3030
super(model);
3131
}
3232

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereFinisher.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public T configureStatement(Consumer<StatementConfiguration> consumer) {
4949
}
5050

5151
protected WhereModel buildModel() {
52-
return new WhereModel(getInitialCriterion(), subCriteria, statementConfiguration);
52+
return new WhereModel.Builder()
53+
.withInitialCriterion(getInitialCriterion())
54+
.withSubCriteria(subCriteria)
55+
.withStatementConfiguration(statementConfiguration)
56+
.build();
5357
}
5458
}

src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java

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

18-
import java.util.List;
1918
import java.util.Objects;
2019
import java.util.Optional;
2120

22-
import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
23-
import org.mybatis.dynamic.sql.SqlCriterion;
2421
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionModel;
2522
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
2623
import org.mybatis.dynamic.sql.render.RenderingContext;
@@ -33,10 +30,9 @@
3330
public class WhereModel extends AbstractBooleanExpressionModel {
3431
private final StatementConfiguration statementConfiguration;
3532

36-
public WhereModel(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria,
37-
StatementConfiguration statementConfiguration) {
38-
super(initialCriterion, subCriteria);
39-
this.statementConfiguration = Objects.requireNonNull(statementConfiguration);
33+
private WhereModel(Builder builder) {
34+
super(builder);
35+
statementConfiguration = Objects.requireNonNull(builder.statementConfiguration);
4036
}
4137

4238
public boolean isNonRenderingClauseAllowed() {
@@ -100,4 +96,22 @@ private WhereClauseProvider toWhereClauseProvider(FragmentAndParameters fragment
10096
.withParameters(fragmentAndParameters.parameters())
10197
.build();
10298
}
99+
100+
public static class Builder extends AbstractBuilder<Builder> {
101+
private StatementConfiguration statementConfiguration;
102+
103+
public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) {
104+
this.statementConfiguration = statementConfiguration;
105+
return this;
106+
}
107+
108+
public WhereModel build() {
109+
return new WhereModel(this);
110+
}
111+
112+
@Override
113+
protected Builder getThis() {
114+
return this;
115+
}
116+
}
103117
}

0 commit comments

Comments
 (0)