Skip to content

Commit 92eb860

Browse files
committed
Add Alternative Join Construction Methods
Added a few methods to QueryExpressionDSL to allow building joins with a single method. This allows us to remove the weird CompletableQuery interface and makes the forthcoming Kotlin DSL easier to implement. With this addition, joins can be coded in a single method, rather than the current method chaining technique: ```java .join(SomeTable, on(a, equalTo(b))) ``` This does not alter or remove the existing method chaining technique.
1 parent d1e02d9 commit 92eb860

File tree

10 files changed

+375
-119
lines changed

10 files changed

+375
-119
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@
4444
import org.mybatis.dynamic.sql.select.function.Subtract;
4545
import org.mybatis.dynamic.sql.select.function.Upper;
4646
import org.mybatis.dynamic.sql.select.join.EqualTo;
47+
import org.mybatis.dynamic.sql.select.join.AndJoinCriterion;
4748
import org.mybatis.dynamic.sql.select.join.JoinCondition;
48-
import org.mybatis.dynamic.sql.select.join.JoinCriterion;
49+
import org.mybatis.dynamic.sql.select.join.OnJoinCriterion;
4950
import org.mybatis.dynamic.sql.update.UpdateDSL;
5051
import org.mybatis.dynamic.sql.update.UpdateModel;
5152
import org.mybatis.dynamic.sql.util.Buildable;
@@ -191,10 +192,17 @@ static <T> SqlCriterion<T> and(BindableColumn<T> column, VisitableCondition<T> c
191192
}
192193

193194
// join support
194-
static JoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
195-
return JoinCriterion.withJoinColumn(joinColumn)
195+
static OnJoinCriterion on(BasicColumn joinColumn, JoinCondition joinCondition) {
196+
return new OnJoinCriterion.Builder()
197+
.withJoinColumn(joinColumn)
198+
.withJoinCondition(joinCondition)
199+
.build();
200+
}
201+
202+
static AndJoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
203+
return new AndJoinCriterion.Builder()
204+
.withJoinColumn(joinColumn)
196205
.withJoinCondition(joinCondition)
197-
.withConnector("and") //$NON-NLS-1$
198206
.build();
199207
}
200208

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

Lines changed: 0 additions & 52 deletions
This file was deleted.

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

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@
2929
import org.mybatis.dynamic.sql.SqlCriterion;
3030
import org.mybatis.dynamic.sql.SqlTable;
3131
import org.mybatis.dynamic.sql.VisitableCondition;
32+
import org.mybatis.dynamic.sql.select.join.AndJoinCriterion;
3233
import org.mybatis.dynamic.sql.select.join.JoinCondition;
3334
import org.mybatis.dynamic.sql.select.join.JoinCriterion;
3435
import org.mybatis.dynamic.sql.select.join.JoinModel;
36+
import org.mybatis.dynamic.sql.select.join.OnJoinCriterion;
3537
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
3638
import org.mybatis.dynamic.sql.select.join.JoinType;
3739
import org.mybatis.dynamic.sql.util.Buildable;
3840
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
3941

40-
public class QueryExpressionDSL<R> implements CompletableQuery<R> {
42+
public class QueryExpressionDSL<R> implements Buildable<R> {
4143

4244
private String connector;
4345
private SelectDSL<R> selectDSL;
@@ -62,19 +64,16 @@ public class QueryExpressionDSL<R> implements CompletableQuery<R> {
6264
tableAliases.put(table, tableAlias);
6365
}
6466

65-
@Override
6667
public QueryExpressionWhereBuilder where() {
6768
whereBuilder = new QueryExpressionWhereBuilder();
6869
return whereBuilder;
6970
}
7071

71-
@Override
7272
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition) {
7373
whereBuilder = new QueryExpressionWhereBuilder(column, condition);
7474
return whereBuilder;
7575
}
7676

77-
@Override
7877
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
7978
SqlCriterion<?>...subCriteria) {
8079
whereBuilder = new QueryExpressionWhereBuilder(column, condition, subCriteria);
@@ -95,6 +94,16 @@ public JoinSpecificationStarter join(SqlTable joinTable, String tableAlias) {
9594
return join(joinTable);
9695
}
9796

97+
public QueryExpressionDSL<R> join(SqlTable joinTable, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
98+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.INNER, joinCriteria);
99+
return this;
100+
}
101+
102+
public QueryExpressionDSL<R> join(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
103+
tableAliases.put(joinTable, tableAlias);
104+
return join(joinTable, joinCriterion, joinCriteria);
105+
}
106+
98107
public JoinSpecificationStarter leftJoin(SqlTable joinTable) {
99108
return new JoinSpecificationStarter(joinTable, JoinType.LEFT);
100109
}
@@ -104,6 +113,16 @@ public JoinSpecificationStarter leftJoin(SqlTable joinTable, String tableAlias)
104113
return leftJoin(joinTable);
105114
}
106115

116+
public QueryExpressionDSL<R> leftJoin(SqlTable joinTable, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
117+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.LEFT, joinCriteria);
118+
return this;
119+
}
120+
121+
public QueryExpressionDSL<R> leftJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
122+
tableAliases.put(joinTable, tableAlias);
123+
return leftJoin(joinTable, joinCriterion, joinCriteria);
124+
}
125+
107126
public JoinSpecificationStarter rightJoin(SqlTable joinTable) {
108127
return new JoinSpecificationStarter(joinTable, JoinType.RIGHT);
109128
}
@@ -113,6 +132,16 @@ public JoinSpecificationStarter rightJoin(SqlTable joinTable, String tableAlias)
113132
return rightJoin(joinTable);
114133
}
115134

135+
public QueryExpressionDSL<R> rightJoin(SqlTable joinTable, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
136+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.RIGHT, joinCriteria);
137+
return this;
138+
}
139+
140+
public QueryExpressionDSL<R> rightJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
141+
tableAliases.put(joinTable, tableAlias);
142+
return rightJoin(joinTable, joinCriterion, joinCriteria);
143+
}
144+
116145
public JoinSpecificationStarter fullJoin(SqlTable joinTable) {
117146
return new JoinSpecificationStarter(joinTable, JoinType.FULL);
118147
}
@@ -122,13 +151,30 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
122151
return fullJoin(joinTable);
123152
}
124153

125-
@Override
154+
public QueryExpressionDSL<R> fullJoin(SqlTable joinTable, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
155+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.FULL, joinCriteria);
156+
return this;
157+
}
158+
159+
public QueryExpressionDSL<R> fullJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion, AndJoinCriterion...joinCriteria) {
160+
tableAliases.put(joinTable, tableAlias);
161+
return fullJoin(joinTable, joinCriterion, joinCriteria);
162+
}
163+
164+
private void addJoinSpecificationBuilder(SqlTable joinTable, OnJoinCriterion joinCriterion, JoinType joinType,
165+
AndJoinCriterion...joinCriteria) {
166+
joinSpecificationBuilders.add(new JoinSpecification.Builder()
167+
.withJoinTable(joinTable)
168+
.withJoinType(joinType)
169+
.withJoinCriterion(joinCriterion)
170+
.withJoinCriteria(Arrays.asList(joinCriteria)));
171+
}
172+
126173
public GroupByFinisher groupBy(BasicColumn...columns) {
127174
groupByModel = GroupByModel.of(columns);
128175
return new GroupByFinisher();
129176
}
130177

131-
@Override
132178
public SelectDSL<R> orderBy(SortSpecification...columns) {
133179
selectDSL.orderBy(columns);
134180
return selectDSL;
@@ -160,17 +206,14 @@ private JoinModel buildJoinModel() {
160206
.collect(Collectors.toList()));
161207
}
162208

163-
@Override
164209
public SelectDSL<R>.LimitFinisher limit(long limit) {
165210
return selectDSL.limit(limit);
166211
}
167212

168-
@Override
169213
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
170214
return selectDSL.offset(offset);
171215
}
172216

173-
@Override
174217
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
175218
return selectDSL.fetchFirst(fetchFirstRows);
176219
}
@@ -298,19 +341,19 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCo
298341
}
299342

300343
public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCondition,
301-
JoinCriterion...joinCriteria) {
344+
AndJoinCriterion...joinCriteria) {
302345
return new JoinSpecificationFinisher(joinTable, joinColumn, joinCondition, joinType, joinCriteria);
303346
}
304347
}
305348

306-
public class JoinSpecificationFinisher implements CompletableQuery<R> {
349+
public class JoinSpecificationFinisher implements Buildable<R> {
307350
private JoinSpecification.Builder joinSpecificationBuilder;
308351

309352
public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
310353
JoinCondition joinCondition, JoinType joinType) {
311-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
354+
JoinCriterion joinCriterion = new OnJoinCriterion.Builder()
355+
.withJoinColumn(joinColumn)
312356
.withJoinCondition(joinCondition)
313-
.withConnector("on") //$NON-NLS-1$
314357
.build();
315358

316359
joinSpecificationBuilder = JoinSpecification.withJoinTable(table)
@@ -321,10 +364,10 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
321364
}
322365

323366
public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
324-
JoinCondition joinCondition, JoinType joinType, JoinCriterion...joinCriteria) {
325-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
367+
JoinCondition joinCondition, JoinType joinType, AndJoinCriterion...joinCriteria) {
368+
JoinCriterion joinCriterion = new OnJoinCriterion.Builder()
369+
.withJoinColumn(joinColumn)
326370
.withJoinCondition(joinCondition)
327-
.withConnector("on") //$NON-NLS-1$
328371
.build();
329372

330373
joinSpecificationBuilder = JoinSpecification.withJoinTable(table)
@@ -340,26 +383,23 @@ public R build() {
340383
return QueryExpressionDSL.this.build();
341384
}
342385

343-
@Override
344386
public QueryExpressionWhereBuilder where() {
345387
return QueryExpressionDSL.this.where();
346388
}
347389

348-
@Override
349390
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition) {
350391
return QueryExpressionDSL.this.where(column, condition);
351392
}
352393

353-
@Override
354394
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
355395
SqlCriterion<?>...subCriteria) {
356396
return QueryExpressionDSL.this.where(column, condition, subCriteria);
357397
}
358398

359399
public JoinSpecificationFinisher and(BasicColumn joinColumn, JoinCondition joinCondition) {
360-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
400+
JoinCriterion joinCriterion = new AndJoinCriterion.Builder()
401+
.withJoinColumn(joinColumn)
361402
.withJoinCondition(joinCondition)
362-
.withConnector("and") //$NON-NLS-1$
363403
.build();
364404
joinSpecificationBuilder.withJoinCriterion(joinCriterion);
365405
return this;
@@ -397,7 +437,6 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
397437
return QueryExpressionDSL.this.fullJoin(joinTable, tableAlias);
398438
}
399439

400-
@Override
401440
public GroupByFinisher groupBy(BasicColumn...columns) {
402441
return QueryExpressionDSL.this.groupBy(columns);
403442
}
@@ -410,22 +449,18 @@ public UnionBuilder unionAll() {
410449
return QueryExpressionDSL.this.unionAll();
411450
}
412451

413-
@Override
414452
public SelectDSL<R> orderBy(SortSpecification...columns) {
415453
return QueryExpressionDSL.this.orderBy(columns);
416454
}
417455

418-
@Override
419456
public SelectDSL<R>.LimitFinisher limit(long limit) {
420457
return QueryExpressionDSL.this.limit(limit);
421458
}
422459

423-
@Override
424460
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
425461
return QueryExpressionDSL.this.offset(offset);
426462
}
427463

428-
@Override
429464
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
430465
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
431466
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
*/
6464
@FunctionalInterface
6565
public interface SelectDSLCompleter extends
66-
Function<CompletableQuery<SelectModel>, Buildable<SelectModel>> {
66+
Function<QueryExpressionDSL<SelectModel>, Buildable<SelectModel>> {
6767

6868
/**
6969
* Returns a completer that can be used to select every row in a table.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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.select.join;
17+
18+
public class AndJoinCriterion extends JoinCriterion {
19+
20+
private AndJoinCriterion(Builder builder) {
21+
super(builder);
22+
}
23+
24+
@Override
25+
public String connector() {
26+
return "and"; //$NON-NLS-1$
27+
}
28+
29+
public static class Builder extends AbstractBuilder<Builder> {
30+
@Override
31+
protected Builder getThis() {
32+
return this;
33+
}
34+
35+
public AndJoinCriterion build() {
36+
return new AndJoinCriterion(this);
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)