Skip to content

Commit baabdb0

Browse files
authored
Merge pull request #132 from jeffgbutler/master
Add Alternative Join Construction Methods
2 parents d1e02d9 + 0d0599a commit baabdb0

File tree

10 files changed

+383
-119
lines changed

10 files changed

+383
-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
@@ -43,9 +43,10 @@
4343
import org.mybatis.dynamic.sql.select.function.Substring;
4444
import org.mybatis.dynamic.sql.select.function.Subtract;
4545
import org.mybatis.dynamic.sql.select.function.Upper;
46+
import org.mybatis.dynamic.sql.select.join.AndJoinCriterion;
4647
import org.mybatis.dynamic.sql.select.join.EqualTo;
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 AndJoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
196+
return new AndJoinCriterion.Builder()
197+
.withJoinColumn(joinColumn)
198+
.withJoinCondition(joinCondition)
199+
.build();
200+
}
201+
202+
static OnJoinCriterion on(BasicColumn joinColumn, JoinCondition joinCondition) {
203+
return new OnJoinCriterion.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: 69 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;
3536
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
3637
import org.mybatis.dynamic.sql.select.join.JoinType;
38+
import org.mybatis.dynamic.sql.select.join.OnJoinCriterion;
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,18 @@ public JoinSpecificationStarter join(SqlTable joinTable, String tableAlias) {
9594
return join(joinTable);
9695
}
9796

97+
public QueryExpressionDSL<R> join(SqlTable joinTable, OnJoinCriterion joinCriterion,
98+
AndJoinCriterion...joinCriteria) {
99+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.INNER, joinCriteria);
100+
return this;
101+
}
102+
103+
public QueryExpressionDSL<R> join(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion,
104+
AndJoinCriterion...joinCriteria) {
105+
tableAliases.put(joinTable, tableAlias);
106+
return join(joinTable, joinCriterion, joinCriteria);
107+
}
108+
98109
public JoinSpecificationStarter leftJoin(SqlTable joinTable) {
99110
return new JoinSpecificationStarter(joinTable, JoinType.LEFT);
100111
}
@@ -104,6 +115,18 @@ public JoinSpecificationStarter leftJoin(SqlTable joinTable, String tableAlias)
104115
return leftJoin(joinTable);
105116
}
106117

118+
public QueryExpressionDSL<R> leftJoin(SqlTable joinTable, OnJoinCriterion joinCriterion,
119+
AndJoinCriterion...joinCriteria) {
120+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.LEFT, joinCriteria);
121+
return this;
122+
}
123+
124+
public QueryExpressionDSL<R> leftJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion,
125+
AndJoinCriterion...joinCriteria) {
126+
tableAliases.put(joinTable, tableAlias);
127+
return leftJoin(joinTable, joinCriterion, joinCriteria);
128+
}
129+
107130
public JoinSpecificationStarter rightJoin(SqlTable joinTable) {
108131
return new JoinSpecificationStarter(joinTable, JoinType.RIGHT);
109132
}
@@ -113,6 +136,18 @@ public JoinSpecificationStarter rightJoin(SqlTable joinTable, String tableAlias)
113136
return rightJoin(joinTable);
114137
}
115138

139+
public QueryExpressionDSL<R> rightJoin(SqlTable joinTable, OnJoinCriterion joinCriterion,
140+
AndJoinCriterion...joinCriteria) {
141+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.RIGHT, joinCriteria);
142+
return this;
143+
}
144+
145+
public QueryExpressionDSL<R> rightJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion,
146+
AndJoinCriterion...joinCriteria) {
147+
tableAliases.put(joinTable, tableAlias);
148+
return rightJoin(joinTable, joinCriterion, joinCriteria);
149+
}
150+
116151
public JoinSpecificationStarter fullJoin(SqlTable joinTable) {
117152
return new JoinSpecificationStarter(joinTable, JoinType.FULL);
118153
}
@@ -122,13 +157,32 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
122157
return fullJoin(joinTable);
123158
}
124159

125-
@Override
160+
public QueryExpressionDSL<R> fullJoin(SqlTable joinTable, OnJoinCriterion joinCriterion,
161+
AndJoinCriterion...joinCriteria) {
162+
addJoinSpecificationBuilder(joinTable, joinCriterion, JoinType.FULL, joinCriteria);
163+
return this;
164+
}
165+
166+
public QueryExpressionDSL<R> fullJoin(SqlTable joinTable, String tableAlias, OnJoinCriterion joinCriterion,
167+
AndJoinCriterion...joinCriteria) {
168+
tableAliases.put(joinTable, tableAlias);
169+
return fullJoin(joinTable, joinCriterion, joinCriteria);
170+
}
171+
172+
private void addJoinSpecificationBuilder(SqlTable joinTable, OnJoinCriterion joinCriterion, JoinType joinType,
173+
AndJoinCriterion...joinCriteria) {
174+
joinSpecificationBuilders.add(new JoinSpecification.Builder()
175+
.withJoinTable(joinTable)
176+
.withJoinType(joinType)
177+
.withJoinCriterion(joinCriterion)
178+
.withJoinCriteria(Arrays.asList(joinCriteria)));
179+
}
180+
126181
public GroupByFinisher groupBy(BasicColumn...columns) {
127182
groupByModel = GroupByModel.of(columns);
128183
return new GroupByFinisher();
129184
}
130185

131-
@Override
132186
public SelectDSL<R> orderBy(SortSpecification...columns) {
133187
selectDSL.orderBy(columns);
134188
return selectDSL;
@@ -160,17 +214,14 @@ private JoinModel buildJoinModel() {
160214
.collect(Collectors.toList()));
161215
}
162216

163-
@Override
164217
public SelectDSL<R>.LimitFinisher limit(long limit) {
165218
return selectDSL.limit(limit);
166219
}
167220

168-
@Override
169221
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
170222
return selectDSL.offset(offset);
171223
}
172224

173-
@Override
174225
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
175226
return selectDSL.fetchFirst(fetchFirstRows);
176227
}
@@ -298,19 +349,19 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCo
298349
}
299350

300351
public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCondition,
301-
JoinCriterion...joinCriteria) {
352+
AndJoinCriterion...joinCriteria) {
302353
return new JoinSpecificationFinisher(joinTable, joinColumn, joinCondition, joinType, joinCriteria);
303354
}
304355
}
305356

306-
public class JoinSpecificationFinisher implements CompletableQuery<R> {
357+
public class JoinSpecificationFinisher implements Buildable<R> {
307358
private JoinSpecification.Builder joinSpecificationBuilder;
308359

309360
public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
310361
JoinCondition joinCondition, JoinType joinType) {
311-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
362+
JoinCriterion joinCriterion = new OnJoinCriterion.Builder()
363+
.withJoinColumn(joinColumn)
312364
.withJoinCondition(joinCondition)
313-
.withConnector("on") //$NON-NLS-1$
314365
.build();
315366

316367
joinSpecificationBuilder = JoinSpecification.withJoinTable(table)
@@ -321,10 +372,10 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
321372
}
322373

323374
public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn,
324-
JoinCondition joinCondition, JoinType joinType, JoinCriterion...joinCriteria) {
325-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
375+
JoinCondition joinCondition, JoinType joinType, AndJoinCriterion...joinCriteria) {
376+
JoinCriterion joinCriterion = new OnJoinCriterion.Builder()
377+
.withJoinColumn(joinColumn)
326378
.withJoinCondition(joinCondition)
327-
.withConnector("on") //$NON-NLS-1$
328379
.build();
329380

330381
joinSpecificationBuilder = JoinSpecification.withJoinTable(table)
@@ -340,26 +391,23 @@ public R build() {
340391
return QueryExpressionDSL.this.build();
341392
}
342393

343-
@Override
344394
public QueryExpressionWhereBuilder where() {
345395
return QueryExpressionDSL.this.where();
346396
}
347397

348-
@Override
349398
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition) {
350399
return QueryExpressionDSL.this.where(column, condition);
351400
}
352401

353-
@Override
354402
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
355403
SqlCriterion<?>...subCriteria) {
356404
return QueryExpressionDSL.this.where(column, condition, subCriteria);
357405
}
358406

359407
public JoinSpecificationFinisher and(BasicColumn joinColumn, JoinCondition joinCondition) {
360-
JoinCriterion joinCriterion = JoinCriterion.withJoinColumn(joinColumn)
408+
JoinCriterion joinCriterion = new AndJoinCriterion.Builder()
409+
.withJoinColumn(joinColumn)
361410
.withJoinCondition(joinCondition)
362-
.withConnector("and") //$NON-NLS-1$
363411
.build();
364412
joinSpecificationBuilder.withJoinCriterion(joinCriterion);
365413
return this;
@@ -397,7 +445,6 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
397445
return QueryExpressionDSL.this.fullJoin(joinTable, tableAlias);
398446
}
399447

400-
@Override
401448
public GroupByFinisher groupBy(BasicColumn...columns) {
402449
return QueryExpressionDSL.this.groupBy(columns);
403450
}
@@ -410,22 +457,18 @@ public UnionBuilder unionAll() {
410457
return QueryExpressionDSL.this.unionAll();
411458
}
412459

413-
@Override
414460
public SelectDSL<R> orderBy(SortSpecification...columns) {
415461
return QueryExpressionDSL.this.orderBy(columns);
416462
}
417463

418-
@Override
419464
public SelectDSL<R>.LimitFinisher limit(long limit) {
420465
return QueryExpressionDSL.this.limit(limit);
421466
}
422467

423-
@Override
424468
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
425469
return QueryExpressionDSL.this.offset(offset);
426470
}
427471

428-
@Override
429472
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
430473
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
431474
}

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)