Skip to content

Commit 2cb100a

Browse files
authored
Merge pull request #126 from jeffgbutler/master
Add Missing Select Statement Features
2 parents d17e8c3 + 74aa965 commit 2cb100a

26 files changed

+1120
-270
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ buildNumber.properties
1414
/bin/
1515
.mvn/wrapper/maven-wrapper.jar
1616
.DS_Store
17+
.idea
18+
*.iml

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
<java.version>1.8</java.version>
4141
<maven.compiler.source>${java.version}</maven.compiler.source>
4242
<maven.compiler.target>${java.version}</maven.compiler.target>
43-
<junit.jupiter.version>5.5.0</junit.jupiter.version>
44-
<junit.platform.version>1.5.0</junit.platform.version>
43+
<junit.jupiter.version>5.5.1</junit.jupiter.version>
44+
<junit.platform.version>1.5.1</junit.platform.version>
4545
<spring.batch.version>4.1.2.RELEASE</spring.batch.version>
4646
<clirr.comparisonVersion>1.1.0</clirr.comparisonVersion>
4747
<module.name>org.mybatis.dynamic.sql</module.name>
@@ -120,7 +120,7 @@
120120
<dependency>
121121
<groupId>org.assertj</groupId>
122122
<artifactId>assertj-core</artifactId>
123-
<version>3.12.2</version>
123+
<version>3.13.2</version>
124124
<scope>test</scope>
125125
</dependency>
126126
<dependency>
@@ -144,7 +144,7 @@
144144
<dependency>
145145
<groupId>org.springframework</groupId>
146146
<artifactId>spring-jdbc</artifactId>
147-
<version>5.1.8.RELEASE</version>
147+
<version>5.1.9.RELEASE</version>
148148
<scope>test</scope>
149149
</dependency>
150150
<dependency>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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;
17+
18+
import org.mybatis.dynamic.sql.BasicColumn;
19+
import org.mybatis.dynamic.sql.BindableColumn;
20+
import org.mybatis.dynamic.sql.SortSpecification;
21+
import org.mybatis.dynamic.sql.SqlCriterion;
22+
import org.mybatis.dynamic.sql.VisitableCondition;
23+
import org.mybatis.dynamic.sql.util.Buildable;
24+
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3SelectListHelper;
25+
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3SelectOneHelper;
26+
27+
/**
28+
* This interface describes operations allowed for a select statement after the from and join clauses. This is
29+
* primarily to support the {@link MyBatis3SelectListHelper} and {@link MyBatis3SelectOneHelper} classes.
30+
*
31+
* @author Jeff Butler
32+
*
33+
* @param <R> the model type created by these operations
34+
*
35+
* @see MyBatis3SelectListHelper
36+
* @see MyBatis3SelectOneHelper
37+
*
38+
*/
39+
public interface CompletableQuery<R> extends Buildable<R> {
40+
QueryExpressionDSL<R>.QueryExpressionWhereBuilder where();
41+
42+
<T> QueryExpressionDSL<R>.QueryExpressionWhereBuilder where(BindableColumn<T> column,
43+
VisitableCondition<T> condition);
44+
45+
<T> QueryExpressionDSL<R>.QueryExpressionWhereBuilder where(BindableColumn<T> column,
46+
VisitableCondition<T> condition, SqlCriterion<?>... subCriteria);
47+
48+
QueryExpressionDSL<R>.GroupByFinisher groupBy(BasicColumn...columns);
49+
50+
SelectDSL<R> orderBy(SortSpecification...columns);
51+
52+
SelectDSL<R>.LimitFinisher limit(long limit);
53+
54+
SelectDSL<R>.OffsetFirstFinisher offset(long offset);
55+
56+
SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows);
57+
}

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

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
4040
import org.mybatis.dynamic.sql.where.WhereModel;
4141

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

4444
private String connector;
4545
private SelectDSL<R> selectDSL;
@@ -82,14 +82,17 @@ public static <R> FromGatherer<R> selectDistinct(SelectDSL<R> selectDSL, BasicCo
8282
.build();
8383
}
8484

85+
@Override
8586
public QueryExpressionWhereBuilder where() {
8687
return new QueryExpressionWhereBuilder();
8788
}
8889

90+
@Override
8991
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition) {
9092
return new QueryExpressionWhereBuilder(column, condition);
9193
}
9294

95+
@Override
9396
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
9497
SqlCriterion<?>...subCriteria) {
9598
return new QueryExpressionWhereBuilder(column, condition, subCriteria);
@@ -141,12 +144,14 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
141144
return fullJoin(joinTable);
142145
}
143146

147+
@Override
144148
public GroupByFinisher groupBy(BasicColumn...columns) {
145149
groupByModel = GroupByModel.of(columns);
146150
selectDSL.addQueryExpression(buildModel());
147151
return new GroupByFinisher();
148152
}
149153

154+
@Override
150155
public SelectDSL<R> orderBy(SortSpecification...columns) {
151156
buildDelegateMethod = selectDSL::build;
152157
selectDSL.addQueryExpression(buildModel());
@@ -156,12 +161,12 @@ public SelectDSL<R> orderBy(SortSpecification...columns) {
156161

157162
public UnionBuilder union() {
158163
selectDSL.addQueryExpression(buildModel());
159-
return new UnionBuilder("union"); //$NON-NLS-1$
164+
return new UnionBuilder();
160165
}
161166

162167
public UnionBuilder unionAll() {
163168
selectDSL.addQueryExpression(buildModel());
164-
return new UnionBuilder("union all"); //$NON-NLS-1$
169+
return new UnionAllBuilder();
165170
}
166171

167172
protected QueryExpressionModel buildModel() {
@@ -176,18 +181,21 @@ protected QueryExpressionModel buildModel() {
176181
.build();
177182
}
178183

184+
@Override
179185
public SelectDSL<R>.LimitFinisher limit(long limit) {
180186
buildDelegateMethod = selectDSL::build;
181187
selectDSL.addQueryExpression(buildModel());
182188
return selectDSL.limit(limit);
183189
}
184190

191+
@Override
185192
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
186193
buildDelegateMethod = selectDSL::build;
187194
selectDSL.addQueryExpression(buildModel());
188195
return selectDSL.offset(offset);
189196
}
190197

198+
@Override
191199
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
192200
buildDelegateMethod = selectDSL::build;
193201
selectDSL.addQueryExpression(buildModel());
@@ -283,13 +291,13 @@ private <T> QueryExpressionWhereBuilder(BindableColumn<T> column, VisitableCondi
283291
public UnionBuilder union() {
284292
whereModel = buildWhereModel();
285293
selectDSL.addQueryExpression(buildModel());
286-
return new UnionBuilder("union"); //$NON-NLS-1$
294+
return new UnionBuilder();
287295
}
288296

289297
public UnionBuilder unionAll() {
290298
whereModel = buildWhereModel();
291299
selectDSL.addQueryExpression(buildModel());
292-
return new UnionBuilder("union all"); //$NON-NLS-1$
300+
return new UnionAllBuilder();
293301
}
294302

295303
public SelectDSL<R> orderBy(SortSpecification...columns) {
@@ -364,7 +372,7 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCo
364372
}
365373
}
366374

367-
public class JoinSpecificationFinisher implements Buildable<R> {
375+
public class JoinSpecificationFinisher implements CompletableQuery<R> {
368376
private SqlTable joinTable;
369377
private List<JoinCriterion> joinCriteria = new ArrayList<>();
370378
private JoinType joinType;
@@ -420,17 +428,20 @@ private R internalbuild() {
420428
selectDSL.addQueryExpression(buildModel());
421429
return selectDSL.build();
422430
}
423-
431+
432+
@Override
424433
public QueryExpressionWhereBuilder where() {
425434
joinModel = buildJoinModel();
426435
return new QueryExpressionWhereBuilder();
427436
}
428437

438+
@Override
429439
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition) {
430440
joinModel = buildJoinModel();
431441
return new QueryExpressionWhereBuilder(column, condition);
432442
}
433443

444+
@Override
434445
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
435446
SqlCriterion<?>...subCriteria) {
436447
joinModel = buildJoinModel();
@@ -486,33 +497,44 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
486497
return fullJoin(joinTable);
487498
}
488499

500+
@Override
501+
public GroupByFinisher groupBy(BasicColumn...columns) {
502+
joinModel = buildJoinModel();
503+
return QueryExpressionDSL.this.groupBy(columns);
504+
}
505+
506+
public UnionBuilder union() {
507+
joinModel = buildJoinModel();
508+
return QueryExpressionDSL.this.union();
509+
}
510+
511+
public UnionBuilder unionAll() {
512+
joinModel = buildJoinModel();
513+
return QueryExpressionDSL.this.unionAll();
514+
}
515+
516+
@Override
489517
public SelectDSL<R> orderBy(SortSpecification...columns) {
490-
buildDelegateMethod = selectDSL::build;
491518
joinModel = buildJoinModel();
492-
selectDSL.addQueryExpression(buildModel());
493-
selectDSL.setOrderByModel(OrderByModel.of(columns));
494-
return selectDSL;
519+
return QueryExpressionDSL.this.orderBy(columns);
495520
}
496521

522+
@Override
497523
public SelectDSL<R>.LimitFinisher limit(long limit) {
498-
buildDelegateMethod = selectDSL::build;
499524
joinModel = buildJoinModel();
500-
selectDSL.addQueryExpression(buildModel());
501-
return selectDSL.limit(limit);
525+
return QueryExpressionDSL.this.limit(limit);
502526
}
503527

528+
@Override
504529
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
505-
buildDelegateMethod = selectDSL::build;
506530
joinModel = buildJoinModel();
507-
selectDSL.addQueryExpression(buildModel());
508-
return selectDSL.offset(offset);
531+
return QueryExpressionDSL.this.offset(offset);
509532
}
510533

534+
@Override
511535
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
512-
buildDelegateMethod = selectDSL::build;
513536
joinModel = buildJoinModel();
514-
selectDSL.addQueryExpression(buildModel());
515-
return selectDSL.fetchFirst(fetchFirstRows);
537+
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
516538
}
517539
}
518540

@@ -536,6 +558,14 @@ private R internalBuild() {
536558
return selectDSL.build();
537559
}
538560

561+
public UnionBuilder union() {
562+
return new UnionBuilder();
563+
}
564+
565+
public UnionBuilder unionAll() {
566+
return new UnionAllBuilder();
567+
}
568+
539569
public SelectDSL<R>.LimitFinisher limit(long limit) {
540570
buildDelegateMethod = selectDSL::build;
541571
return selectDSL.limit(limit);
@@ -553,10 +583,10 @@ public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
553583
}
554584

555585
public class UnionBuilder {
556-
private String connector;
586+
protected String connector;
557587

558-
public UnionBuilder(String connector) {
559-
this.connector = Objects.requireNonNull(connector);
588+
public UnionBuilder() {
589+
this.connector = "union"; //$NON-NLS-1$
560590
}
561591

562592
public FromGatherer<R> select(BasicColumn...selectList) {
@@ -578,4 +608,10 @@ public FromGatherer<R> selectDistinct(BasicColumn...selectList) {
578608
.build();
579609
}
580610
}
611+
612+
public class UnionAllBuilder extends UnionBuilder {
613+
public UnionAllBuilder() {
614+
connector = "union all"; //$NON-NLS-1$
615+
}
616+
}
581617
}

src/main/java/org/mybatis/dynamic/sql/util/mybatis3/MyBatis3SelectListHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import java.util.function.Function;
2020

2121
import org.mybatis.dynamic.sql.SortSpecification;
22+
import org.mybatis.dynamic.sql.select.CompletableQuery;
2223
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
23-
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
2424
import org.mybatis.dynamic.sql.util.Buildable;
2525

2626
/**
@@ -74,7 +74,7 @@
7474
*/
7575
@FunctionalInterface
7676
public interface MyBatis3SelectListHelper<T> extends
77-
Function<QueryExpressionDSL<MyBatis3SelectModelAdapter<List<T>>>,
77+
Function<CompletableQuery<MyBatis3SelectModelAdapter<List<T>>>,
7878
Buildable<MyBatis3SelectModelAdapter<List<T>>>> {
7979

8080
/**
@@ -96,7 +96,7 @@ static <T> MyBatis3SelectListHelper<T> allRows() {
9696
*
9797
* @return the helper that will select every row in a table in the specified order
9898
*/
99-
static <T> MyBatis3SelectListHelper<T> allRowsOrderdBy(SortSpecification...columns) {
99+
static <T> MyBatis3SelectListHelper<T> allRowsOrderedBy(SortSpecification...columns) {
100100
return h -> h.orderBy(columns);
101101
}
102102
}

src/main/java/org/mybatis/dynamic/sql/util/mybatis3/MyBatis3SelectOneHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import java.util.Optional;
1919
import java.util.function.Function;
2020

21+
import org.mybatis.dynamic.sql.select.CompletableQuery;
2122
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
22-
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
2323
import org.mybatis.dynamic.sql.util.Buildable;
2424

2525
/**
@@ -53,6 +53,6 @@
5353
*/
5454
@FunctionalInterface
5555
public interface MyBatis3SelectOneHelper<T> extends
56-
Function<QueryExpressionDSL<MyBatis3SelectModelAdapter<Optional<T>>>,
56+
Function<CompletableQuery<MyBatis3SelectModelAdapter<Optional<T>>>,
5757
Buildable<MyBatis3SelectModelAdapter<Optional<T>>>> {
5858
}

0 commit comments

Comments
 (0)