Skip to content

Commit 4215d85

Browse files
authored
Merge pull request #839 from jeffgbutler/limit-with-objects
Add "WhenPresent" Versions of the Paging Methods
2 parents 5bb77de + e48c7f6 commit 4215d85

File tree

17 files changed

+456
-192
lines changed

17 files changed

+456
-192
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Other important changes:
3030
an empty In condition would render as invalid SQL and would usually cause a runtime exception from the database.
3131
With this change, the exception thrown is more predictable and the error is caught before sending the SQL to the
3232
database.
33+
- All the paging methods (limit, offset, fetchFirst) now have "WhenPresent" variations that will drop the phrase from
34+
rendering if a null value is passed in
3335

3436
## Release 1.5.2 - June 3, 2024
3537

src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public DeleteWhereBuilder where() {
5656
}
5757

5858
public DeleteDSL<R> limit(long limit) {
59+
return limitWhenPresent(limit);
60+
}
61+
62+
public DeleteDSL<R> limitWhenPresent(Long limit) {
5963
this.limit = limit;
6064
return this;
6165
}
@@ -115,7 +119,11 @@ private DeleteWhereBuilder() {
115119
}
116120

117121
public DeleteDSL<R> limit(long limit) {
118-
return DeleteDSL.this.limit(limit);
122+
return limitWhenPresent(limit);
123+
}
124+
125+
public DeleteDSL<R> limitWhenPresent(Long limit) {
126+
return DeleteDSL.this.limitWhenPresent(limit);
119127
}
120128

121129
public DeleteDSL<R> orderBy(SortSpecification... columns) {

src/main/java/org/mybatis/dynamic/sql/exception/NonRenderingWhereClauseException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*/
1616
package org.mybatis.dynamic.sql.exception;
1717

18+
import java.io.Serial;
19+
1820
import org.mybatis.dynamic.sql.configuration.GlobalConfiguration;
1921
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
2022
import org.mybatis.dynamic.sql.util.Messages;
2123

22-
import java.io.Serial;
23-
2424
/**
2525
* This exception is thrown when the where clause in a statement will not render.
2626
* This can happen if all the optional conditions in a where clause fail to

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

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
import org.mybatis.dynamic.sql.util.Buildable;
3030
import org.mybatis.dynamic.sql.util.ConfigurableStatement;
3131

32-
public class MultiSelectDSL implements Buildable<MultiSelectModel>, ConfigurableStatement<MultiSelectDSL> {
32+
public class MultiSelectDSL implements Buildable<MultiSelectModel>, ConfigurableStatement<MultiSelectDSL>,
33+
PagingDSL<MultiSelectModel> {
3334
private final List<UnionQuery> unionQueries = new ArrayList<>();
3435
private final SelectModel initialSelect;
3536
private OrderByModel orderByModel;
@@ -61,19 +62,22 @@ public MultiSelectDSL orderBy(Collection<? extends SortSpecification> columns) {
6162
return this;
6263
}
6364

64-
public LimitFinisher limit(long limit) {
65+
@Override
66+
public LimitFinisher<MultiSelectModel> limitWhenPresent(Long limit) {
6567
this.limit = limit;
66-
return new LimitFinisher();
68+
return new LF();
6769
}
6870

69-
public OffsetFirstFinisher offset(long offset) {
71+
@Override
72+
public OffsetFirstFinisher<MultiSelectModel> offsetWhenPresent(Long offset) {
7073
this.offset = offset;
71-
return new OffsetFirstFinisher();
74+
return new OFF();
7275
}
7376

74-
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
77+
@Override
78+
public FetchFirstFinisher<MultiSelectModel> fetchFirstWhenPresent(Long fetchFirstRows) {
7579
this.fetchFirstRows = fetchFirstRows;
76-
return new FetchFirstFinisher();
80+
return new FFF();
7781
}
7882

7983
@NotNull
@@ -102,31 +106,18 @@ public MultiSelectDSL configureStatement(Consumer<StatementConfiguration> consum
102106
return this;
103107
}
104108

105-
public class LimitFinisher implements Buildable<MultiSelectModel> {
106-
public OffsetFinisher offset(long offset) {
107-
MultiSelectDSL.this.offset(offset);
108-
return new OffsetFinisher();
109-
}
110-
111-
@NotNull
109+
class FFF implements FetchFirstFinisher<MultiSelectModel> {
112110
@Override
113-
public MultiSelectModel build() {
114-
return MultiSelectDSL.this.build();
111+
public Buildable<MultiSelectModel> rowsOnly() {
112+
return MultiSelectDSL.this;
115113
}
116114
}
117115

118-
public class OffsetFinisher implements Buildable<MultiSelectModel> {
119-
@NotNull
116+
class LF implements LimitFinisher<MultiSelectModel> {
120117
@Override
121-
public MultiSelectModel build() {
122-
return MultiSelectDSL.this.build();
123-
}
124-
}
125-
126-
public class OffsetFirstFinisher implements Buildable<MultiSelectModel> {
127-
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
128-
MultiSelectDSL.this.fetchFirst(fetchFirstRows);
129-
return new FetchFirstFinisher();
118+
public Buildable<MultiSelectModel> offsetWhenPresent(Long offset) {
119+
MultiSelectDSL.this.offset = offset;
120+
return MultiSelectDSL.this;
130121
}
131122

132123
@NotNull
@@ -136,13 +127,13 @@ public MultiSelectModel build() {
136127
}
137128
}
138129

139-
public class FetchFirstFinisher {
140-
public RowsOnlyFinisher rowsOnly() {
141-
return new RowsOnlyFinisher();
130+
class OFF implements OffsetFirstFinisher<MultiSelectModel> {
131+
@Override
132+
public FetchFirstFinisher<MultiSelectModel> fetchFirstWhenPresent(Long fetchFirstRows) {
133+
MultiSelectDSL.this.fetchFirstRows = fetchFirstRows;
134+
return new FFF();
142135
}
143-
}
144136

145-
public class RowsOnlyFinisher implements Buildable<MultiSelectModel> {
146137
@NotNull
147138
@Override
148139
public MultiSelectModel build() {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright 2016-2024 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+
* https://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.util.Buildable;
19+
20+
public interface PagingDSL<T> {
21+
default LimitFinisher<T> limit(long limit) {
22+
return limitWhenPresent(limit);
23+
}
24+
25+
LimitFinisher<T> limitWhenPresent(Long limit);
26+
27+
default OffsetFirstFinisher<T> offset(long offset) {
28+
return offsetWhenPresent(offset);
29+
}
30+
31+
OffsetFirstFinisher<T> offsetWhenPresent(Long offset);
32+
33+
default FetchFirstFinisher<T> fetchFirst(long fetchFirstRows) {
34+
return fetchFirstWhenPresent(fetchFirstRows);
35+
}
36+
37+
FetchFirstFinisher<T> fetchFirstWhenPresent(Long fetchFirstRows);
38+
39+
interface LimitFinisher<T> extends Buildable<T> {
40+
default Buildable<T> offset(long offset) {
41+
return offsetWhenPresent(offset);
42+
}
43+
44+
Buildable<T> offsetWhenPresent(Long offset);
45+
}
46+
47+
interface OffsetFirstFinisher<T> extends Buildable<T> {
48+
default FetchFirstFinisher<T> fetchFirst(long fetchFirstRows) {
49+
return fetchFirstWhenPresent(fetchFirstRows);
50+
}
51+
52+
FetchFirstFinisher<T> fetchFirstWhenPresent(Long fetchFirstRows);
53+
}
54+
55+
interface FetchFirstFinisher<T> {
56+
Buildable<T> rowsOnly();
57+
}
58+
}

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

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
public class QueryExpressionDSL<R>
4444
extends AbstractQueryExpressionDSL<QueryExpressionDSL<R>.QueryExpressionWhereBuilder, QueryExpressionDSL<R>>
45-
implements Buildable<R> {
45+
implements Buildable<R>, PagingDSL<R> {
4646

4747
private final String connector;
4848
private final SelectDSL<R> selectDSL;
@@ -194,16 +194,19 @@ protected QueryExpressionModel buildModel() {
194194
.build();
195195
}
196196

197-
public SelectDSL<R>.LimitFinisher limit(long limit) {
198-
return selectDSL.limit(limit);
197+
@Override
198+
public PagingDSL.LimitFinisher<R> limitWhenPresent(Long limit) {
199+
return selectDSL.limitWhenPresent(limit);
199200
}
200201

201-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
202-
return selectDSL.offset(offset);
202+
@Override
203+
public PagingDSL.OffsetFirstFinisher<R> offsetWhenPresent(Long offset) {
204+
return selectDSL.offsetWhenPresent(offset);
203205
}
204206

205-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
206-
return selectDSL.fetchFirst(fetchFirstRows);
207+
@Override
208+
public PagingDSL.FetchFirstFinisher<R> fetchFirstWhenPresent(Long fetchFirstRows) {
209+
return selectDSL.fetchFirstWhenPresent(fetchFirstRows);
207210
}
208211

209212
@Override
@@ -273,7 +276,7 @@ public FromGatherer<R> build() {
273276
}
274277

275278
public class QueryExpressionWhereBuilder extends AbstractWhereFinisher<QueryExpressionWhereBuilder>
276-
implements Buildable<R> {
279+
implements Buildable<R>, PagingDSL<R> {
277280
private QueryExpressionWhereBuilder() {
278281
super(QueryExpressionDSL.this);
279282
}
@@ -302,16 +305,19 @@ public GroupByFinisher groupBy(Collection<? extends BasicColumn> columns) {
302305
return QueryExpressionDSL.this.groupBy(columns);
303306
}
304307

305-
public SelectDSL<R>.LimitFinisher limit(long limit) {
306-
return QueryExpressionDSL.this.limit(limit);
308+
@Override
309+
public PagingDSL.LimitFinisher<R> limitWhenPresent(Long limit) {
310+
return QueryExpressionDSL.this.limitWhenPresent(limit);
307311
}
308312

309-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
310-
return QueryExpressionDSL.this.offset(offset);
313+
@Override
314+
public PagingDSL.OffsetFirstFinisher<R> offsetWhenPresent(Long offset) {
315+
return QueryExpressionDSL.this.offsetWhenPresent(offset);
311316
}
312317

313-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
314-
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
318+
@Override
319+
public PagingDSL.FetchFirstFinisher<R> fetchFirstWhenPresent(Long fetchFirstRows) {
320+
return QueryExpressionDSL.this.fetchFirstWhenPresent(fetchFirstRows);
315321
}
316322

317323
@NotNull
@@ -351,7 +357,7 @@ public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, JoinCondit
351357

352358
public class JoinSpecificationFinisher
353359
extends AbstractWhereStarter<QueryExpressionWhereBuilder, JoinSpecificationFinisher>
354-
implements Buildable<R> {
360+
implements Buildable<R>, PagingDSL<R> {
355361
private final JoinSpecification.Builder joinSpecificationBuilder;
356362

357363
public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> joinColumn,
@@ -484,20 +490,24 @@ public SelectDSL<R> orderBy(Collection<? extends SortSpecification> columns) {
484490
return QueryExpressionDSL.this.orderBy(columns);
485491
}
486492

487-
public SelectDSL<R>.LimitFinisher limit(long limit) {
488-
return QueryExpressionDSL.this.limit(limit);
493+
@Override
494+
public PagingDSL.LimitFinisher<R> limitWhenPresent(Long limit) {
495+
return QueryExpressionDSL.this.limitWhenPresent(limit);
489496
}
490497

491-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
492-
return QueryExpressionDSL.this.offset(offset);
498+
@Override
499+
public PagingDSL.OffsetFirstFinisher<R> offsetWhenPresent(Long offset) {
500+
return QueryExpressionDSL.this.offsetWhenPresent(offset);
493501
}
494502

495-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
496-
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
503+
@Override
504+
public PagingDSL.FetchFirstFinisher<R> fetchFirstWhenPresent(Long fetchFirstRows) {
505+
return QueryExpressionDSL.this.fetchFirstWhenPresent(fetchFirstRows);
497506
}
498507
}
499508

500-
public class GroupByFinisher extends AbstractHavingStarter<QueryExpressionHavingBuilder> implements Buildable<R> {
509+
public class GroupByFinisher extends AbstractHavingStarter<QueryExpressionHavingBuilder>
510+
implements Buildable<R>, PagingDSL<R> {
501511
public SelectDSL<R> orderBy(SortSpecification... columns) {
502512
return orderBy(Arrays.asList(columns));
503513
}
@@ -520,16 +530,19 @@ public UnionBuilder unionAll() {
520530
return QueryExpressionDSL.this.unionAll();
521531
}
522532

523-
public SelectDSL<R>.LimitFinisher limit(long limit) {
524-
return QueryExpressionDSL.this.limit(limit);
533+
@Override
534+
public PagingDSL.LimitFinisher<R> limitWhenPresent(Long limit) {
535+
return QueryExpressionDSL.this.limitWhenPresent(limit);
525536
}
526537

527-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
528-
return QueryExpressionDSL.this.offset(offset);
538+
@Override
539+
public PagingDSL.OffsetFirstFinisher<R> offsetWhenPresent(Long offset) {
540+
return QueryExpressionDSL.this.offsetWhenPresent(offset);
529541
}
530542

531-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
532-
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
543+
@Override
544+
public PagingDSL.FetchFirstFinisher<R> fetchFirstWhenPresent(Long fetchFirstRows) {
545+
return QueryExpressionDSL.this.fetchFirstWhenPresent(fetchFirstRows);
533546
}
534547

535548
@Override
@@ -572,18 +585,21 @@ public FromGatherer<R> selectDistinct(List<BasicColumn> selectList) {
572585
}
573586

574587
public class QueryExpressionHavingBuilder extends AbstractHavingFinisher<QueryExpressionHavingBuilder>
575-
implements Buildable<R> {
588+
implements Buildable<R>, PagingDSL<R> {
576589

577-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
578-
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
590+
@Override
591+
public PagingDSL.LimitFinisher<R> limitWhenPresent(Long limit) {
592+
return QueryExpressionDSL.this.limitWhenPresent(limit);
579593
}
580594

581-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
582-
return QueryExpressionDSL.this.offset(offset);
595+
@Override
596+
public PagingDSL.OffsetFirstFinisher<R> offsetWhenPresent(Long offset) {
597+
return QueryExpressionDSL.this.offsetWhenPresent(offset);
583598
}
584599

585-
public SelectDSL<R>.LimitFinisher limit(long limit) {
586-
return QueryExpressionDSL.this.limit(limit);
600+
@Override
601+
public PagingDSL.FetchFirstFinisher<R> fetchFirstWhenPresent(Long fetchFirstRows) {
602+
return QueryExpressionDSL.this.fetchFirstWhenPresent(fetchFirstRows);
587603
}
588604

589605
public SelectDSL<R> orderBy(SortSpecification... columns) {

0 commit comments

Comments
 (0)