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)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy