Skip to content

Commit 3d7b921

Browse files
authored
Merge pull request #462 from jeffgbutler/gh-430-redux
Add Where Utility Methods to Accept Pre-Built Lists of Criteria
2 parents e33aa54 + 6d575b6 commit 3d7b921

File tree

13 files changed

+606
-41
lines changed

13 files changed

+606
-41
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
This log will detail notable changes to MyBatis Dynamic SQL. Full details are available on the GitHub milestone pages.
44

5+
## Release 1.4.1 - Unreleased
6+
7+
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.4.1+](https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.4.1+)
8+
9+
1. Added support for criteria groups without an initial criteria. This makes it possible to create an independent list
10+
of pre-created criteria and then add the list to a where clause. See the tests in the related pull request for
11+
usage examples. ([#462](https://github.com/mybatis/mybatis-dynamic-sql/pull/462))
12+
513
## Release 1.4.0 - March 3, 2022
614

715
The release includes new functionality in the Where Clause DSL to support arbitrary grouping of conditions, and also use

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

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

18-
import java.util.Objects;
18+
import java.util.Optional;
1919

2020
/**
2121
* This class represents a criteria group without an AND or an OR connector. This is useful
@@ -30,11 +30,11 @@ public class CriteriaGroup extends SqlCriterion {
3030

3131
protected CriteriaGroup(AbstractGroupBuilder<?> builder) {
3232
super(builder);
33-
initialCriterion = Objects.requireNonNull(builder.initialCriterion);
33+
initialCriterion = builder.initialCriterion;
3434
}
3535

36-
public SqlCriterion initialCriterion() {
37-
return initialCriterion;
36+
public Optional<SqlCriterion> initialCriterion() {
37+
return Optional.ofNullable(initialCriterion);
3838
}
3939

4040
@Override

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,12 @@ static CriteriaGroup group(SqlCriterion initialCriterion, List<AndOrCriteriaGrou
265265
.build();
266266
}
267267

268+
static CriteriaGroup group(List<AndOrCriteriaGroup> subCriteria) {
269+
return new CriteriaGroup.Builder()
270+
.withSubCriteria(subCriteria)
271+
.build();
272+
}
273+
268274
static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
269275
AndOrCriteriaGroup...subCriteria) {
270276
return not(column, condition, Arrays.asList(subCriteria));
@@ -302,6 +308,12 @@ static NotCriterion not(SqlCriterion initialCriterion, List<AndOrCriteriaGroup>
302308
.build();
303309
}
304310

311+
static NotCriterion not(List<AndOrCriteriaGroup> subCriteria) {
312+
return new NotCriterion.Builder()
313+
.withSubCriteria(subCriteria)
314+
.build();
315+
}
316+
305317
static <T> AndOrCriteriaGroup or(BindableColumn<T> column, VisitableCondition<T> condition,
306318
AndOrCriteriaGroup...subCriteria) {
307319
return new AndOrCriteriaGroup.Builder()
@@ -330,6 +342,13 @@ static AndOrCriteriaGroup or(SqlCriterion initialCriterion, AndOrCriteriaGroup..
330342
.build();
331343
}
332344

345+
static AndOrCriteriaGroup or(List<AndOrCriteriaGroup> subCriteria) {
346+
return new AndOrCriteriaGroup.Builder()
347+
.withConnector("or") //$NON-NLS-1$
348+
.withSubCriteria(subCriteria)
349+
.build();
350+
}
351+
333352
static <T> AndOrCriteriaGroup and(BindableColumn<T> column, VisitableCondition<T> condition,
334353
AndOrCriteriaGroup...subCriteria) {
335354
return new AndOrCriteriaGroup.Builder()
@@ -358,6 +377,13 @@ static AndOrCriteriaGroup and(SqlCriterion initialCriterion, AndOrCriteriaGroup.
358377
.build();
359378
}
360379

380+
static AndOrCriteriaGroup and(List<AndOrCriteriaGroup> subCriteria) {
381+
return new AndOrCriteriaGroup.Builder()
382+
.withConnector("and") //$NON-NLS-1$
383+
.withSubCriteria(subCriteria)
384+
.build();
385+
}
386+
361387
// join support
362388
static JoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
363389
return new JoinCriterion.Builder()

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
4242
@NotNull
4343
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
4444
List<AndOrCriteriaGroup> subCriteria) {
45-
initialCriterion = buildCriterion(column, condition, subCriteria);
45+
initialCriterion = ColumnAndConditionCriterion.withColumn(column)
46+
.withCondition(condition)
47+
.withSubCriteria(subCriteria)
48+
.build();
4649
return getThis();
4750
}
4851

@@ -53,7 +56,8 @@ public T where(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria
5356

5457
@NotNull
5558
public T where(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
56-
initialCriterion = buildCriterion(existsPredicate, subCriteria);
59+
initialCriterion = new ExistsCriterion.Builder()
60+
.withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
5761
return getThis();
5862
}
5963

@@ -64,7 +68,18 @@ public T where(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria)
6468

6569
@NotNull
6670
public T where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
67-
this.initialCriterion = buildCriterion(initialCriterion, subCriteria);
71+
this.initialCriterion = new CriteriaGroup.Builder()
72+
.withInitialCriterion(initialCriterion)
73+
.withSubCriteria(subCriteria)
74+
.build();
75+
return getThis();
76+
}
77+
78+
@NotNull
79+
public T where(List<AndOrCriteriaGroup> criteria) {
80+
initialCriterion = new CriteriaGroup.Builder()
81+
.withSubCriteria(criteria)
82+
.build();
6883
return getThis();
6984
}
7085

@@ -83,7 +98,7 @@ public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
8398
@NotNull
8499
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
85100
List<AndOrCriteriaGroup> subCriteria) {
86-
addSubCriteria("and", buildCriterion(column, condition), subCriteria);
101+
addSubCriteria("and", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
87102
return getThis();
88103
}
89104

@@ -94,7 +109,7 @@ public T and(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria)
94109

95110
@NotNull
96111
public T and(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
97-
addSubCriteria("and", buildCriterion(existsPredicate), subCriteria);
112+
addSubCriteria("and", buildCriterion(existsPredicate), subCriteria); //$NON-NLS-1$
98113
return getThis();
99114
}
100115

@@ -105,7 +120,13 @@ public T and(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
105120

106121
@NotNull
107122
public T and(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
108-
addSubCriteria("and", buildCriterion(initialCriterion), subCriteria);
123+
addSubCriteria("and", buildCriterion(initialCriterion), subCriteria); //$NON-NLS-1$
124+
return getThis();
125+
}
126+
127+
@NotNull
128+
public T and(List<AndOrCriteriaGroup> criteria) {
129+
addSubCriteria("and", criteria); //$NON-NLS-1$
109130
return getThis();
110131
}
111132

@@ -118,7 +139,7 @@ public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
118139
@NotNull
119140
public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
120141
List<AndOrCriteriaGroup> subCriteria) {
121-
addSubCriteria("or", buildCriterion(column, condition), subCriteria);
142+
addSubCriteria("or", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
122143
return getThis();
123144
}
124145

@@ -129,7 +150,7 @@ public T or(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria) {
129150

130151
@NotNull
131152
public T or(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
132-
addSubCriteria("or", buildCriterion(existsPredicate), subCriteria);
153+
addSubCriteria("or", buildCriterion(existsPredicate), subCriteria); //$NON-NLS-1$
133154
return getThis();
134155
}
135156

@@ -140,7 +161,13 @@ public T or(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
140161

141162
@NotNull
142163
public T or(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
143-
addSubCriteria("or", buildCriterion(initialCriterion), subCriteria);
164+
addSubCriteria("or", buildCriterion(initialCriterion), subCriteria); //$NON-NLS-1$
165+
return getThis();
166+
}
167+
168+
@NotNull
169+
public T or(List<AndOrCriteriaGroup> criteria) {
170+
addSubCriteria("or", criteria); //$NON-NLS-1$
144171
return getThis();
145172
}
146173

@@ -152,31 +179,14 @@ private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondi
152179
return ColumnAndConditionCriterion.withColumn(column).withCondition(condition).build();
153180
}
154181

155-
private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition,
156-
List<AndOrCriteriaGroup> subCriteria) {
157-
return ColumnAndConditionCriterion.withColumn(column)
158-
.withCondition(condition)
159-
.withSubCriteria(subCriteria)
160-
.build();
161-
}
162-
163182
private SqlCriterion buildCriterion(ExistsPredicate existsPredicate) {
164183
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).build();
165184
}
166185

167-
private SqlCriterion buildCriterion(ExistsPredicate existsPredicate,
168-
List<AndOrCriteriaGroup> subCriteria) {
169-
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
170-
}
171-
172186
private SqlCriterion buildCriterion(SqlCriterion initialCriterion) {
173187
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).build();
174188
}
175189

176-
private SqlCriterion buildCriterion(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
177-
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).withSubCriteria(subCriteria).build();
178-
}
179-
180190
private void addSubCriteria(String connector, SqlCriterion initialCriterion,
181191
List<AndOrCriteriaGroup> subCriteria) {
182192
this.subCriteria.add(new AndOrCriteriaGroup.Builder()
@@ -186,5 +196,12 @@ private void addSubCriteria(String connector, SqlCriterion initialCriterion,
186196
.build());
187197
}
188198

199+
private void addSubCriteria(String connector, List<AndOrCriteriaGroup> criteria) {
200+
this.subCriteria.add(new AndOrCriteriaGroup.Builder()
201+
.withConnector(connector)
202+
.withSubCriteria(criteria)
203+
.build());
204+
}
205+
189206
protected abstract T getThis();
190207
}

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereSupport.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public W where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriter
6262
return apply(w -> w.where(initialCriterion, subCriteria));
6363
}
6464

65+
public W where(List<AndOrCriteriaGroup> subCriteria) {
66+
return apply(w -> w.where(subCriteria));
67+
}
68+
6569
public W applyWhere(WhereApplier whereApplier) {
6670
return apply(w -> w.applyWhere(whereApplier));
6771
}

src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,18 @@ public Optional<RenderedCriterion> visit(ExistsCriterion criterion) {
8787

8888
@Override
8989
public Optional<RenderedCriterion> visit(CriteriaGroup criterion) {
90-
return render(criterion.initialCriterion(), criterion.subCriteria(), this::calculateFragment);
90+
return renderCriteriaGroup(criterion, this::calculateFragment);
9191
}
9292

9393
@Override
9494
public Optional<RenderedCriterion> visit(NotCriterion criterion) {
95-
return render(criterion.initialCriterion(), criterion.subCriteria(), this::calculateNotFragment);
95+
return renderCriteriaGroup(criterion, this::calculateNotFragment);
96+
}
97+
98+
private Optional<RenderedCriterion> renderCriteriaGroup(CriteriaGroup criterion,
99+
Function<FragmentCollector, String> fragmentCalculator) {
100+
return criterion.initialCriterion().map(ic -> render(ic, criterion.subCriteria(), fragmentCalculator))
101+
.orElseGet(() -> render(criterion.subCriteria(), fragmentCalculator));
96102
}
97103

98104
public Optional<RenderedCriterion> render(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria,

src/main/java/org/mybatis/dynamic/sql/where/render/WhereRenderer.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.concurrent.atomic.AtomicInteger;
2121
import java.util.stream.Collectors;
2222

23+
import org.mybatis.dynamic.sql.SqlCriterion;
2324
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2425
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2526
import org.mybatis.dynamic.sql.util.FragmentCollector;
@@ -41,15 +42,22 @@ private WhereRenderer(Builder builder) {
4142
}
4243

4344
public Optional<WhereClauseProvider> render() {
44-
return whereModel.initialCriterion().map(ic ->
45-
criterionRenderer.render(ic, whereModel.subCriteria(), this::calculateWhereClause))
46-
.orElseGet(() -> criterionRenderer.render(whereModel.subCriteria(), this::calculateWhereClause))
45+
return whereModel.initialCriterion().map(this::renderWithInitialCriterion)
46+
.orElseGet(this::renderWithoutInitialCriterion)
4747
.map(rc -> WhereClauseProvider.withWhereClause(rc.fragmentAndParameters().fragment())
4848
.withParameters(rc.fragmentAndParameters().parameters())
4949
.build()
5050
);
5151
}
5252

53+
private Optional<RenderedCriterion> renderWithInitialCriterion(SqlCriterion initialCriterion) {
54+
return criterionRenderer.render(initialCriterion, whereModel.subCriteria(), this::calculateWhereClause);
55+
}
56+
57+
private Optional<RenderedCriterion> renderWithoutInitialCriterion() {
58+
return criterionRenderer.render(whereModel.subCriteria(), this::calculateWhereClause);
59+
}
60+
5361
private String calculateWhereClause(FragmentCollector collector) {
5462
return collector.fragments()
5563
.collect(Collectors.joining(" ", "where ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

0 commit comments

Comments
 (0)