Skip to content

Commit 8739524

Browse files
authored
Merge pull request #438 from jeffgbutler/not-criteria
Add Support for a "not" Criteria Group for Where Clauses
2 parents 33c69f3 + e331b60 commit 8739524

File tree

16 files changed

+451
-136
lines changed

16 files changed

+451
-136
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
public class CriteriaGroup extends SqlCriterion {
2929
private final SqlCriterion initialCriterion;
3030

31-
private CriteriaGroup(Builder builder) {
31+
protected CriteriaGroup(AbstractGroupBuilder<?> builder) {
3232
super(builder);
3333
initialCriterion = Objects.requireNonNull(builder.initialCriterion);
3434
}
@@ -42,14 +42,16 @@ public <R> R accept(SqlCriterionVisitor<R> visitor) {
4242
return visitor.visit(this);
4343
}
4444

45-
public static class Builder extends AbstractBuilder<Builder> {
45+
public abstract static class AbstractGroupBuilder<T extends AbstractGroupBuilder<T>> extends AbstractBuilder<T> {
4646
private SqlCriterion initialCriterion;
4747

48-
public Builder withInitialCriterion(SqlCriterion initialCriterion) {
48+
public T withInitialCriterion(SqlCriterion initialCriterion) {
4949
this.initialCriterion = initialCriterion;
50-
return this;
50+
return getThis();
5151
}
52+
}
5253

54+
public static class Builder extends AbstractGroupBuilder<Builder> {
5355
public CriteriaGroup build() {
5456
return new CriteriaGroup(this);
5557
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2016-2022 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;
17+
18+
/**
19+
* This class represents a criteria group with a NOT.
20+
*
21+
* @author Jeff Butler
22+
* @since 1.4.0
23+
*/
24+
public class NotCriterion extends CriteriaGroup {
25+
private NotCriterion(Builder builder) {
26+
super(builder);
27+
}
28+
29+
@Override
30+
public <R> R accept(SqlCriterionVisitor<R> visitor) {
31+
return visitor.visit(this);
32+
}
33+
34+
public static class Builder extends AbstractGroupBuilder<Builder> {
35+
public NotCriterion build() {
36+
return new NotCriterion(this);
37+
}
38+
39+
@Override
40+
protected Builder getThis() {
41+
return this;
42+
}
43+
}
44+
}

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

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condit
219219
return WhereDSL.where().where(column, condition, subCriteria);
220220
}
221221

222-
static WhereDSL where(CriteriaGroup criteriaGroup, AndOrCriteriaGroup... subCriteria) {
223-
return WhereDSL.where().where(criteriaGroup, subCriteria);
222+
static WhereDSL where(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria) {
223+
return WhereDSL.where().where(initialCriterion, subCriteria);
224224
}
225225

226226
static WhereDSL where(ExistsPredicate existsPredicate, AndOrCriteriaGroup... subCriteria) {
@@ -254,13 +254,50 @@ static CriteriaGroup group(ExistsPredicate existsPredicate, List<AndOrCriteriaGr
254254
.build();
255255
}
256256

257-
static CriteriaGroup group(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
258-
return group(criteriaGroup, Arrays.asList(subCriteria));
257+
static CriteriaGroup group(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
258+
return group(initialCriterion, Arrays.asList(subCriteria));
259259
}
260260

261-
static CriteriaGroup group(CriteriaGroup criteriaGroup, List<AndOrCriteriaGroup> subCriteria) {
261+
static CriteriaGroup group(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
262262
return new CriteriaGroup.Builder()
263-
.withInitialCriterion(criteriaGroup)
263+
.withInitialCriterion(initialCriterion)
264+
.withSubCriteria(subCriteria)
265+
.build();
266+
}
267+
268+
static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
269+
AndOrCriteriaGroup...subCriteria) {
270+
return not(column, condition, Arrays.asList(subCriteria));
271+
}
272+
273+
static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
274+
List<AndOrCriteriaGroup> subCriteria) {
275+
return new NotCriterion.Builder()
276+
.withInitialCriterion(new ColumnAndConditionCriterion.Builder<T>().withColumn(column)
277+
.withCondition(condition).build())
278+
.withSubCriteria(subCriteria)
279+
.build();
280+
}
281+
282+
static NotCriterion not(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria) {
283+
return not(existsPredicate, Arrays.asList(subCriteria));
284+
}
285+
286+
static NotCriterion not(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
287+
return new NotCriterion.Builder()
288+
.withInitialCriterion(new ExistsCriterion.Builder()
289+
.withExistsPredicate(existsPredicate).build())
290+
.withSubCriteria(subCriteria)
291+
.build();
292+
}
293+
294+
static NotCriterion not(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
295+
return not(initialCriterion, Arrays.asList(subCriteria));
296+
}
297+
298+
static NotCriterion not(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
299+
return new NotCriterion.Builder()
300+
.withInitialCriterion(initialCriterion)
264301
.withSubCriteria(subCriteria)
265302
.build();
266303
}
@@ -285,10 +322,10 @@ static AndOrCriteriaGroup or(ExistsPredicate existsPredicate, AndOrCriteriaGroup
285322
.build();
286323
}
287324

288-
static AndOrCriteriaGroup or(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
325+
static AndOrCriteriaGroup or(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
289326
return new AndOrCriteriaGroup.Builder()
290327
.withConnector("or") //$NON-NLS-1$
291-
.withInitialCriterion(criteriaGroup)
328+
.withInitialCriterion(initialCriterion)
292329
.withSubCriteria(Arrays.asList(subCriteria))
293330
.build();
294331
}
@@ -313,10 +350,10 @@ static AndOrCriteriaGroup and(ExistsPredicate existsPredicate, AndOrCriteriaGrou
313350
.build();
314351
}
315352

316-
static AndOrCriteriaGroup and(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
353+
static AndOrCriteriaGroup and(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
317354
return new AndOrCriteriaGroup.Builder()
318355
.withConnector("and") //$NON-NLS-1$
319-
.withInitialCriterion(criteriaGroup)
356+
.withInitialCriterion(initialCriterion)
320357
.withSubCriteria(Arrays.asList(subCriteria))
321358
.build();
322359
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ public interface SqlCriterionVisitor<R> {
2121
R visit(ExistsCriterion criterion);
2222

2323
R visit(CriteriaGroup criterion);
24+
25+
R visit(NotCriterion criterion);
2426
}

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

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ public T where(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCrit
5858
}
5959

6060
@NotNull
61-
public T where(CriteriaGroup criterion, AndOrCriteriaGroup...subCriteria) {
62-
return where(criterion, Arrays.asList(subCriteria));
61+
public T where(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
62+
return where(initialCriterion, Arrays.asList(subCriteria));
6363
}
6464

6565
@NotNull
66-
public T where(CriteriaGroup criterion, List<AndOrCriteriaGroup> subCriteria) {
67-
initialCriterion = buildCriterion(criterion, subCriteria);
66+
public T where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
67+
this.initialCriterion = buildCriterion(initialCriterion, subCriteria);
6868
return getThis();
6969
}
7070

@@ -83,7 +83,7 @@ public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
8383
@NotNull
8484
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
8585
List<AndOrCriteriaGroup> subCriteria) {
86-
addCriteriaGroup("and", buildCriterion(column, condition), subCriteria);
86+
addSubCriteria("and", buildCriterion(column, condition), subCriteria);
8787
return getThis();
8888
}
8989

@@ -94,18 +94,18 @@ public T and(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria)
9494

9595
@NotNull
9696
public T and(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
97-
addCriteriaGroup("and", buildCriterion(existsPredicate), subCriteria);
97+
addSubCriteria("and", buildCriterion(existsPredicate), subCriteria);
9898
return getThis();
9999
}
100100

101101
@NotNull
102-
public T and(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
103-
return and(criteriaGroup, Arrays.asList(subCriteria));
102+
public T and(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
103+
return and(initialCriterion, Arrays.asList(subCriteria));
104104
}
105105

106106
@NotNull
107-
public T and(CriteriaGroup criteriaGroup, List<AndOrCriteriaGroup> subCriteria) {
108-
addCriteriaGroup("and", buildCriterion(criteriaGroup), subCriteria);
107+
public T and(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
108+
addSubCriteria("and", buildCriterion(initialCriterion), subCriteria);
109109
return getThis();
110110
}
111111

@@ -118,7 +118,7 @@ public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
118118
@NotNull
119119
public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
120120
List<AndOrCriteriaGroup> subCriteria) {
121-
addCriteriaGroup("or", buildCriterion(column, condition), subCriteria);
121+
addSubCriteria("or", buildCriterion(column, condition), subCriteria);
122122
return getThis();
123123
}
124124

@@ -129,57 +129,56 @@ public T or(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria) {
129129

130130
@NotNull
131131
public T or(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
132-
addCriteriaGroup("or", buildCriterion(existsPredicate), subCriteria);
132+
addSubCriteria("or", buildCriterion(existsPredicate), subCriteria);
133133
return getThis();
134134
}
135135

136136
@NotNull
137-
public T or(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
138-
return or(criteriaGroup, Arrays.asList(subCriteria));
137+
public T or(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
138+
return or(initialCriterion, Arrays.asList(subCriteria));
139139
}
140140

141141
@NotNull
142-
public T or(CriteriaGroup criteriaGroup, List<AndOrCriteriaGroup> subCriteria) {
143-
addCriteriaGroup("or", buildCriterion(criteriaGroup), subCriteria);
142+
public T or(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
143+
addSubCriteria("or", buildCriterion(initialCriterion), subCriteria);
144144
return getThis();
145145
}
146146

147147
protected WhereModel internalBuild() {
148148
return new WhereModel(initialCriterion, subCriteria);
149149
}
150150

151-
private <R> ColumnAndConditionCriterion<R> buildCriterion(BindableColumn<R> column,
152-
VisitableCondition<R> condition) {
151+
private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition) {
153152
return ColumnAndConditionCriterion.withColumn(column).withCondition(condition).build();
154153
}
155154

156-
private <R> ColumnAndConditionCriterion<R> buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition,
157-
List<AndOrCriteriaGroup> subCriteria) {
155+
private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition,
156+
List<AndOrCriteriaGroup> subCriteria) {
158157
return ColumnAndConditionCriterion.withColumn(column)
159158
.withCondition(condition)
160159
.withSubCriteria(subCriteria)
161160
.build();
162161
}
163162

164-
private ExistsCriterion buildCriterion(ExistsPredicate existsPredicate) {
163+
private SqlCriterion buildCriterion(ExistsPredicate existsPredicate) {
165164
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).build();
166165
}
167166

168-
private ExistsCriterion buildCriterion(ExistsPredicate existsPredicate,
169-
List<AndOrCriteriaGroup> subCriteria) {
167+
private SqlCriterion buildCriterion(ExistsPredicate existsPredicate,
168+
List<AndOrCriteriaGroup> subCriteria) {
170169
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
171170
}
172171

173-
private CriteriaGroup buildCriterion(CriteriaGroup criteriaGroup) {
174-
return new CriteriaGroup.Builder().withInitialCriterion(criteriaGroup).build();
172+
private SqlCriterion buildCriterion(SqlCriterion initialCriterion) {
173+
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).build();
175174
}
176175

177-
private CriteriaGroup buildCriterion(CriteriaGroup criteriaGroup, List<AndOrCriteriaGroup> subCriteria) {
178-
return new CriteriaGroup.Builder().withInitialCriterion(criteriaGroup).withSubCriteria(subCriteria).build();
176+
private SqlCriterion buildCriterion(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
177+
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).withSubCriteria(subCriteria).build();
179178
}
180179

181-
private void addCriteriaGroup(String connector, SqlCriterion initialCriterion,
182-
List<AndOrCriteriaGroup> subCriteria) {
180+
private void addSubCriteria(String connector, SqlCriterion initialCriterion,
181+
List<AndOrCriteriaGroup> subCriteria) {
183182
this.subCriteria.add(new AndOrCriteriaGroup.Builder()
184183
.withInitialCriterion(initialCriterion)
185184
.withConnector(connector)

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
2323
import org.mybatis.dynamic.sql.BindableColumn;
24-
import org.mybatis.dynamic.sql.CriteriaGroup;
2524
import org.mybatis.dynamic.sql.ExistsPredicate;
25+
import org.mybatis.dynamic.sql.SqlCriterion;
2626
import org.mybatis.dynamic.sql.VisitableCondition;
2727

2828
/**
@@ -54,12 +54,12 @@ public W where(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCrit
5454
return apply(w -> w.where(existsPredicate, subCriteria));
5555
}
5656

57-
public W where(CriteriaGroup criterion, AndOrCriteriaGroup...subCriteria) {
58-
return where(criterion, Arrays.asList(subCriteria));
57+
public W where(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
58+
return where(initialCriterion, Arrays.asList(subCriteria));
5959
}
6060

61-
public W where(CriteriaGroup criterion, List<AndOrCriteriaGroup> subCriteria) {
62-
return apply(w -> w.where(criterion, subCriteria));
61+
public W where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
62+
return apply(w -> w.where(initialCriterion, subCriteria));
6363
}
6464

6565
public W applyWhere(WhereApplier whereApplier) {

0 commit comments

Comments
 (0)