Skip to content

Commit 76ae7c4

Browse files
committed
Support reuse of where clauses in all applicable DSLs
1 parent 53ab8d2 commit 76ae7c4

File tree

11 files changed

+358
-39
lines changed

11 files changed

+358
-39
lines changed

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
@@ -18,6 +18,7 @@
1818
import java.util.Objects;
1919
import java.util.function.Function;
2020
import java.util.function.ToIntFunction;
21+
import java.util.function.UnaryOperator;
2122

2223
import org.mybatis.dynamic.sql.BindableColumn;
2324
import org.mybatis.dynamic.sql.SqlCriterion;
@@ -27,6 +28,7 @@
2728
import org.mybatis.dynamic.sql.util.Buildable;
2829
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
2930
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
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(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
56+
return (DeleteWhereBuilder) whereApplyer.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
@@ -17,6 +17,7 @@
1717

1818
import java.util.Objects;
1919
import java.util.function.Function;
20+
import java.util.function.UnaryOperator;
2021

2122
import org.mybatis.dynamic.sql.BindableColumn;
2223
import org.mybatis.dynamic.sql.SqlBuilder;
@@ -25,6 +26,7 @@
2526
import org.mybatis.dynamic.sql.VisitableCondition;
2627
import org.mybatis.dynamic.sql.util.Buildable;
2728
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
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(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
62+
return (CountWhereBuilder) whereApplyer.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
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.Objects;
23+
import java.util.function.UnaryOperator;
2324

2425
import org.mybatis.dynamic.sql.BasicColumn;
2526
import org.mybatis.dynamic.sql.BindableColumn;
@@ -33,6 +34,7 @@
3334
import org.mybatis.dynamic.sql.select.join.JoinType;
3435
import org.mybatis.dynamic.sql.util.Buildable;
3536
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
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(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
74+
return (QueryExpressionWhereBuilder) whereApplyer.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(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
338+
return QueryExpressionDSL.this.applyWhere(whereApplyer);
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
@@ -21,6 +21,7 @@
2121
import java.util.function.Function;
2222
import java.util.function.Supplier;
2323
import java.util.function.ToIntFunction;
24+
import java.util.function.UnaryOperator;
2425

2526
import org.mybatis.dynamic.sql.BasicColumn;
2627
import org.mybatis.dynamic.sql.BindableColumn;
@@ -40,6 +41,7 @@
4041
import org.mybatis.dynamic.sql.util.ValueMapping;
4142
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
4243
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
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(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
74+
return (UpdateWhereBuilder) whereApplyer.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
}

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ import org.mybatis.dynamic.sql.BindableColumn
1919
import org.mybatis.dynamic.sql.VisitableCondition
2020
import org.mybatis.dynamic.sql.where.AbstractWhereDSL
2121

22+
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
23+
val collector = CriteriaCollector()
24+
collect(collector)
25+
return where(column, condition, collector.criteria)
26+
}
27+
2228
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
2329
val collector = CriteriaCollector()
2430
collect(collector)

src/test/java/examples/joins/JoinMapperTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,37 @@ public void testMultipleTableJoinWithWhereClause() {
252252
}
253253
}
254254

255+
@Test
256+
public void testMultipleTableJoinWithApplyWhere() {
257+
try (SqlSession session = sqlSessionFactory.openSession()) {
258+
JoinMapper mapper = session.getMapper(JoinMapper.class);
259+
260+
SelectStatementProvider selectStatement = select(orderMaster.orderId, orderDate, orderLine.lineNumber, itemMaster.description, orderLine.quantity)
261+
.from(orderMaster, "om")
262+
.join(orderLine, "ol").on(orderMaster.orderId, equalTo(orderLine.orderId))
263+
.join(itemMaster, "im").on(orderLine.itemId, equalTo(itemMaster.itemId))
264+
.applyWhere(d -> d.where(orderMaster.orderId, isEqualTo(2)))
265+
.build()
266+
.render(RenderingStrategies.MYBATIS3);
267+
268+
String expectedStatment = "select om.order_id, om.order_date, ol.line_number, im.description, ol.quantity"
269+
+ " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id join ItemMaster im on ol.item_id = im.item_id"
270+
+ " where om.order_id = #{parameters.p1,jdbcType=INTEGER}";
271+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expectedStatment);
272+
273+
List<OrderMaster> rows = mapper.selectMany(selectStatement);
274+
275+
assertThat(rows.size()).isEqualTo(1);
276+
OrderMaster orderMaster = rows.get(0);
277+
assertThat(orderMaster.getId()).isEqualTo(2);
278+
assertThat(orderMaster.getDetails().size()).isEqualTo(2);
279+
OrderDetail orderDetail = orderMaster.getDetails().get(0);
280+
assertThat(orderDetail.getLineNumber()).isEqualTo(1);
281+
orderDetail = orderMaster.getDetails().get(1);
282+
assertThat(orderDetail.getLineNumber()).isEqualTo(2);
283+
}
284+
}
285+
255286
@Test
256287
public void testMultipleTableJoinWithComplexWhereClause() {
257288
try (SqlSession session = sqlSessionFactory.openSession()) {

0 commit comments

Comments
 (0)