Skip to content

Commit 35b4960

Browse files
authored
Merge pull request #152 from jeffgbutler/reusable-where
Add Support for Reusing Where Clauses
2 parents a771241 + 44dcfaa commit 35b4960

File tree

17 files changed

+401
-43
lines changed

17 files changed

+401
-43
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
This log will detail notable changes to MyBatis Dynamic SQL. Full details are available on the GitHub milestone pages.
44

5+
## Release 1.1.4 - Unreleased
6+
7+
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.1.4+](https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.1.4+)
8+
9+
### Added
10+
11+
- Added support for reusing WHERE clauses among count, delete, select, and update statements ([#152](https://github.com/mybatis/mybatis-dynamic-sql/pull/152))
12+
13+
14+
### Bugs Fixed
15+
16+
- Fixed issue where limit and offset in sub-queries could cause a parameter name collision ([#142](https://github.com/mybatis/mybatis-dynamic-sql/pull/142))
17+
518
## Release 1.1.3 - September 16, 2019
619

720
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.1.3+](https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.1.3+)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,12 @@ static WhereDSL where() {
162162
}
163163

164164
static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition) {
165-
return WhereDSL.where(column, condition);
165+
return WhereDSL.where().where(column, condition);
166166
}
167167

168168
static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition,
169169
SqlCriterion<?>... subCriteria) {
170-
return WhereDSL.where(column, condition, subCriteria);
170+
return WhereDSL.where().where(column, condition, subCriteria);
171171
}
172172

173173
// where condition connectors

src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.mybatis.dynamic.sql.util.Buildable;
2828
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
2929
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
30+
import org.mybatis.dynamic.sql.where.WhereApplier;
31+
import org.mybatis.dynamic.sql.where.WhereModel;
3032

3133
public class DeleteDSL<R> implements Buildable<R> {
3234

@@ -45,10 +47,15 @@ public DeleteWhereBuilder where() {
4547

4648
public <T> DeleteWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
4749
SqlCriterion<?>...subCriteria) {
48-
whereBuilder.and(column, condition, subCriteria);
50+
whereBuilder.where(column, condition, subCriteria);
4951
return whereBuilder;
5052
}
5153

54+
@SuppressWarnings("unchecked")
55+
public DeleteWhereBuilder applyWhere(WhereApplier whereApplier) {
56+
return (DeleteWhereBuilder) whereApplier.apply(whereBuilder);
57+
}
58+
5259
/**
5360
* WARNING! Calling this method could result in an delete statement that deletes
5461
* all rows in a table.
@@ -102,5 +109,10 @@ public R build() {
102109
protected DeleteWhereBuilder getThis() {
103110
return this;
104111
}
112+
113+
@Override
114+
protected WhereModel buildWhereModel() {
115+
return super.internalBuild();
116+
}
105117
}
106118
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.mybatis.dynamic.sql.VisitableCondition;
2626
import org.mybatis.dynamic.sql.util.Buildable;
2727
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
28+
import org.mybatis.dynamic.sql.where.WhereApplier;
29+
import org.mybatis.dynamic.sql.where.WhereModel;
2830

2931
/**
3032
* DSL for building count queries. Count queries are specializations of select queries. They have joins and where
@@ -51,10 +53,15 @@ public CountWhereBuilder where() {
5153

5254
public <T> CountWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
5355
SqlCriterion<?>...subCriteria) {
54-
whereBuilder.and(column, condition, subCriteria);
56+
whereBuilder.where(column, condition, subCriteria);
5557
return whereBuilder;
5658
}
5759

60+
@SuppressWarnings("unchecked")
61+
public CountWhereBuilder applyWhere(WhereApplier whereApplier) {
62+
return (CountWhereBuilder) whereApplier.apply(whereBuilder);
63+
}
64+
5865
@Override
5966
public R build() {
6067
return adapterFunction.apply(buildModel());
@@ -100,5 +107,10 @@ public R build() {
100107
protected CountWhereBuilder getThis() {
101108
return this;
102109
}
110+
111+
@Override
112+
protected WhereModel buildWhereModel() {
113+
return super.internalBuild();
114+
}
103115
}
104116
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.mybatis.dynamic.sql.select.join.JoinType;
3434
import org.mybatis.dynamic.sql.util.Buildable;
3535
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
36+
import org.mybatis.dynamic.sql.where.WhereApplier;
37+
import org.mybatis.dynamic.sql.where.WhereModel;
3638

3739
public class QueryExpressionDSL<R> extends AbstractQueryExpressionDSL<QueryExpressionDSL<R>, R>
3840
implements Buildable<R> {
@@ -63,10 +65,15 @@ public QueryExpressionWhereBuilder where() {
6365

6466
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
6567
SqlCriterion<?>...subCriteria) {
66-
whereBuilder.and(column, condition, subCriteria);
68+
whereBuilder.where(column, condition, subCriteria);
6769
return whereBuilder;
6870
}
6971

72+
@SuppressWarnings("unchecked")
73+
public QueryExpressionWhereBuilder applyWhere(WhereApplier whereApplier) {
74+
return (QueryExpressionWhereBuilder) whereApplier.apply(whereBuilder);
75+
}
76+
7077
@Override
7178
public R build() {
7279
return selectDSL.build();
@@ -253,6 +260,11 @@ public R build() {
253260
protected QueryExpressionWhereBuilder getThis() {
254261
return this;
255262
}
263+
264+
@Override
265+
protected WhereModel buildWhereModel() {
266+
return super.internalBuild();
267+
}
256268
}
257269

258270
public class JoinSpecificationStarter {
@@ -322,6 +334,10 @@ public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, Visitable
322334
return QueryExpressionDSL.this.where(column, condition, subCriteria);
323335
}
324336

337+
public QueryExpressionWhereBuilder applyWhere(WhereApplier whereApplier) {
338+
return QueryExpressionDSL.this.applyWhere(whereApplier);
339+
}
340+
325341
public JoinSpecificationFinisher and(BasicColumn joinColumn, JoinCondition joinCondition) {
326342
JoinCriterion joinCriterion = new JoinCriterion.Builder()
327343
.withConnector("and") //$NON-NLS-1$

src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import org.mybatis.dynamic.sql.util.ValueMapping;
4141
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
4242
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
43+
import org.mybatis.dynamic.sql.where.WhereApplier;
44+
import org.mybatis.dynamic.sql.where.WhereModel;
4345

4446
public class UpdateDSL<R> implements Buildable<R> {
4547

@@ -63,10 +65,15 @@ public UpdateWhereBuilder where() {
6365

6466
public <T> UpdateWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
6567
SqlCriterion<?>...subCriteria) {
66-
whereBuilder.and(column, condition, subCriteria);
68+
whereBuilder.where(column, condition, subCriteria);
6769
return whereBuilder;
6870
}
6971

72+
@SuppressWarnings("unchecked")
73+
public UpdateWhereBuilder applyWhere(WhereApplier whereApplier) {
74+
return (UpdateWhereBuilder) whereApplier.apply(whereBuilder);
75+
}
76+
7077
/**
7178
* WARNING! Calling this method could result in an update statement that updates
7279
* all rows in a table.
@@ -175,5 +182,10 @@ public R build() {
175182
protected UpdateWhereBuilder getThis() {
176183
return this;
177184
}
185+
186+
@Override
187+
protected WhereModel buildWhereModel() {
188+
return super.internalBuild();
189+
}
178190
}
179191
}

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,19 @@ protected <S> AbstractWhereDSL() {
3030
super();
3131
}
3232

33-
protected <S> AbstractWhereDSL(BindableColumn<S> column, VisitableCondition<S> condition) {
34-
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
35-
.withCondition(condition)
36-
.build();
37-
criteria.add(criterion);
33+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition) {
34+
addCriterion(column, condition);
35+
return getThis();
3836
}
3937

40-
protected <S> AbstractWhereDSL(BindableColumn<S> column, VisitableCondition<S> condition,
41-
SqlCriterion<?>...subCriteria) {
42-
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
43-
.withCondition(condition)
44-
.withSubCriteria(Arrays.asList(subCriteria))
45-
.build();
46-
criteria.add(criterion);
38+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition, SqlCriterion<?>...subCriteria) {
39+
addCriterion(column, condition, Arrays.asList(subCriteria));
40+
return getThis();
41+
}
42+
43+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition, List<SqlCriterion<?>> subCriteria) {
44+
addCriterion(column, condition, subCriteria);
45+
return getThis();
4746
}
4847

4948
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition) {
@@ -76,6 +75,13 @@ public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition, List<
7675
return getThis();
7776
}
7877

78+
private <S> void addCriterion(BindableColumn<S> column, VisitableCondition<S> condition) {
79+
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
80+
.withCondition(condition)
81+
.build();
82+
criteria.add(criterion);
83+
}
84+
7985
private <S> void addCriterion(String connector, BindableColumn<S> column, VisitableCondition<S> condition) {
8086
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
8187
.withConnector(connector)
@@ -84,6 +90,15 @@ private <S> void addCriterion(String connector, BindableColumn<S> column, Visita
8490
criteria.add(criterion);
8591
}
8692

93+
private <S> void addCriterion(BindableColumn<S> column, VisitableCondition<S> condition,
94+
List<SqlCriterion<?>> subCriteria) {
95+
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
96+
.withCondition(condition)
97+
.withSubCriteria(subCriteria)
98+
.build();
99+
criteria.add(criterion);
100+
}
101+
87102
private <S> void addCriterion(String connector, BindableColumn<S> column, VisitableCondition<S> condition,
88103
List<SqlCriterion<?>> subCriteria) {
89104
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
@@ -94,9 +109,11 @@ private <S> void addCriterion(String connector, BindableColumn<S> column, Visita
94109
criteria.add(criterion);
95110
}
96111

97-
public WhereModel buildWhereModel() {
112+
protected WhereModel internalBuild() {
98113
return WhereModel.of(criteria);
99114
}
100115

116+
protected abstract WhereModel buildWhereModel();
117+
101118
protected abstract T getThis();
102119
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Copyright 2016-2019 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+
* http://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.where;
17+
18+
import java.util.function.UnaryOperator;
19+
20+
@FunctionalInterface
21+
public interface WhereApplier extends UnaryOperator<AbstractWhereDSL<?>> {}

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

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

18-
import org.mybatis.dynamic.sql.BindableColumn;
19-
import org.mybatis.dynamic.sql.SqlCriterion;
20-
import org.mybatis.dynamic.sql.VisitableCondition;
21-
2218
public class WhereDSL extends AbstractWhereDSL<WhereDSL> {
2319

2420
private WhereDSL() {
2521
super();
2622
}
2723

28-
private <T> WhereDSL(BindableColumn<T> column, VisitableCondition<T> condition) {
29-
super(column, condition);
30-
}
31-
32-
private <T> WhereDSL(BindableColumn<T> column, VisitableCondition<T> condition, SqlCriterion<?>... subCriteria) {
33-
super(column, condition, subCriteria);
34-
}
35-
3624
@Override
3725
protected WhereDSL getThis() {
3826
return this;
@@ -42,16 +30,12 @@ public static WhereDSL where() {
4230
return new WhereDSL();
4331
}
4432

45-
public static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition) {
46-
return new WhereDSL(column, condition);
47-
}
48-
49-
public static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition,
50-
SqlCriterion<?>... subCriteria) {
51-
return new WhereDSL(column, condition, subCriteria);
33+
@Override
34+
protected WhereModel buildWhereModel() {
35+
return super.internalBuild();
5236
}
5337

5438
public WhereModel build() {
55-
return super.buildWhereModel();
39+
return buildWhereModel();
5640
}
5741
}

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/AbstractWhereDSLExtensions.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ import org.mybatis.dynamic.sql.BindableColumn
1919
import org.mybatis.dynamic.sql.VisitableCondition
2020
import org.mybatis.dynamic.sql.where.AbstractWhereDSL
2121

22+
typealias WhereApplier = AbstractWhereDSL<*>.() -> AbstractWhereDSL<*>
23+
24+
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
25+
val collector = CriteriaCollector()
26+
collect(collector)
27+
return where(column, condition, collector.criteria)
28+
}
29+
2230
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
2331
val collector = CriteriaCollector()
2432
collect(collector)

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ typealias CountCompleter = CountDSL<SelectModel>.() -> Buildable<SelectModel>
2525

2626
fun <T> CountDSL<SelectModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
2727
apply {
28-
where().and(column, condition, collect)
28+
where().where(column, condition, collect)
2929
}
3030

3131
fun <T> CountDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ typealias DeleteCompleter = DeleteDSL<DeleteModel>.() -> Buildable<DeleteModel>
2525

2626
fun <T> DeleteDSL<DeleteModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
2727
apply {
28-
where().and(column, condition, collect)
28+
where().where(column, condition, collect)
2929
}
3030

3131
fun <T> DeleteDSL<DeleteModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ typealias SelectCompleter = QueryExpressionDSL<SelectModel>.() -> Buildable<Sele
2525

2626
fun <T> QueryExpressionDSL<SelectModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
2727
apply {
28-
where().and(column, condition, collect)
28+
where().where(column, condition, collect)
2929
}
3030

3131
fun <T> QueryExpressionDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ typealias UpdateCompleter = UpdateDSL<UpdateModel>.() -> Buildable<UpdateModel>
3131

3232
fun <T> UpdateDSL<UpdateModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
3333
apply {
34-
where().and(column, condition, collect)
34+
where().where(column, condition, collect)
3535
}
3636

3737
fun <T> UpdateDSL<UpdateModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =

0 commit comments

Comments
 (0)