Skip to content

Commit 8f37d01

Browse files
committed
Kotlin support for not criteria group
1 parent d3efd1e commit 8f37d01

File tree

6 files changed

+123
-22
lines changed

6 files changed

+123
-22
lines changed

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

Lines changed: 14 additions & 14 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,13 @@ 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)
264264
.withSubCriteria(subCriteria)
265265
.build();
266266
}
@@ -291,13 +291,13 @@ static NotCriterion not(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup
291291
.build();
292292
}
293293

294-
static NotCriterion not(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
295-
return not(criteriaGroup, Arrays.asList(subCriteria));
294+
static NotCriterion not(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
295+
return not(initialCriterion, Arrays.asList(subCriteria));
296296
}
297297

298-
static NotCriterion not(CriteriaGroup criteriaGroup, List<AndOrCriteriaGroup> subCriteria) {
298+
static NotCriterion not(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
299299
return new NotCriterion.Builder()
300-
.withInitialCriterion(criteriaGroup)
300+
.withInitialCriterion(initialCriterion)
301301
.withSubCriteria(subCriteria)
302302
.build();
303303
}
@@ -322,10 +322,10 @@ static AndOrCriteriaGroup or(ExistsPredicate existsPredicate, AndOrCriteriaGroup
322322
.build();
323323
}
324324

325-
static AndOrCriteriaGroup or(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
325+
static AndOrCriteriaGroup or(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
326326
return new AndOrCriteriaGroup.Builder()
327327
.withConnector("or") //$NON-NLS-1$
328-
.withInitialCriterion(criteriaGroup)
328+
.withInitialCriterion(initialCriterion)
329329
.withSubCriteria(Arrays.asList(subCriteria))
330330
.build();
331331
}
@@ -350,10 +350,10 @@ static AndOrCriteriaGroup and(ExistsPredicate existsPredicate, AndOrCriteriaGrou
350350
.build();
351351
}
352352

353-
static AndOrCriteriaGroup and(CriteriaGroup criteriaGroup, AndOrCriteriaGroup...subCriteria) {
353+
static AndOrCriteriaGroup and(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {
354354
return new AndOrCriteriaGroup.Builder()
355355
.withConnector("and") //$NON-NLS-1$
356-
.withInitialCriterion(criteriaGroup)
356+
.withInitialCriterion(initialCriterion)
357357
.withSubCriteria(Arrays.asList(subCriteria))
358358
.build();
359359
}

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
package org.mybatis.dynamic.sql.util.kotlin
1717

1818
import org.mybatis.dynamic.sql.BindableColumn
19-
import org.mybatis.dynamic.sql.CriteriaGroup
2019
import org.mybatis.dynamic.sql.AndOrCriteriaGroup
2120
import org.mybatis.dynamic.sql.ExistsPredicate
21+
import org.mybatis.dynamic.sql.SqlCriterion
2222
import org.mybatis.dynamic.sql.SqlTable
2323
import org.mybatis.dynamic.sql.VisitableCondition
2424
import org.mybatis.dynamic.sql.select.AbstractQueryExpressionDSL
@@ -49,9 +49,9 @@ abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*>, B : KotlinBaseBuil
4949
where(existsPredicate, sc)
5050
}
5151

52-
fun where(criteriaGroup: CriteriaGroup, subCriteria: CriteriaReceiver): B =
52+
fun where(initialCriterion: SqlCriterion, subCriteria: CriteriaReceiver = {}): B =
5353
applyToWhere(subCriteria) { sc ->
54-
where(criteriaGroup, sc)
54+
where(initialCriterion, sc)
5555
}
5656

5757
fun applyWhere(whereApplier: WhereApplier): B =
@@ -69,9 +69,9 @@ abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*>, B : KotlinBaseBuil
6969
and(existsPredicate, sc)
7070
}
7171

72-
fun and(criteriaGroup: CriteriaGroup, subCriteria: CriteriaReceiver): B =
72+
fun and(initialCriterion: SqlCriterion, subCriteria: CriteriaReceiver = {}): B =
7373
applyToWhere(subCriteria) { sc ->
74-
and(criteriaGroup, sc)
74+
and(initialCriterion, sc)
7575
}
7676

7777
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver = {}): B =
@@ -84,9 +84,9 @@ abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*>, B : KotlinBaseBuil
8484
or(existsPredicate, sc)
8585
}
8686

87-
fun or(criteriaGroup: CriteriaGroup, subCriteria: CriteriaReceiver): B =
87+
fun or(initialCriterion: SqlCriterion, subCriteria: CriteriaReceiver = {}): B =
8888
applyToWhere(subCriteria) { sc ->
89-
or(criteriaGroup, sc)
89+
or(initialCriterion, sc)
9090
}
9191

9292
fun allRows(): B = self()

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ import org.mybatis.dynamic.sql.BindableColumn
2121
import org.mybatis.dynamic.sql.Constant
2222
import org.mybatis.dynamic.sql.CriteriaGroup
2323
import org.mybatis.dynamic.sql.ExistsPredicate
24+
import org.mybatis.dynamic.sql.NotCriterion
2425
import org.mybatis.dynamic.sql.SortSpecification
2526
import org.mybatis.dynamic.sql.SqlBuilder
2627
import org.mybatis.dynamic.sql.SqlColumn
28+
import org.mybatis.dynamic.sql.SqlCriterion
2729
import org.mybatis.dynamic.sql.StringConstant
2830
import org.mybatis.dynamic.sql.VisitableCondition
2931
import org.mybatis.dynamic.sql.select.aggregate.Avg
@@ -150,7 +152,7 @@ fun <T> substring(
150152

151153
fun <T> upper(column: BindableColumn<T>): Upper<T> = SqlBuilder.upper(column)
152154

153-
fun group(initialCriterion: CriteriaGroup, subCriteria: CriteriaReceiver): CriteriaGroup =
155+
fun group(initialCriterion: SqlCriterion, subCriteria: CriteriaReceiver): CriteriaGroup =
154156
SqlBuilder.group(initialCriterion, CriteriaCollector().apply(subCriteria).criteria)
155157

156158
fun group(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver): CriteriaGroup =
@@ -163,6 +165,19 @@ fun <T> group(
163165
): CriteriaGroup =
164166
SqlBuilder.group(column, condition, CriteriaCollector().apply(subCriteria).criteria)
165167

168+
fun not(initialCriterion: SqlCriterion, subCriteria: CriteriaReceiver = {}): NotCriterion =
169+
SqlBuilder.not(initialCriterion, CriteriaCollector().apply(subCriteria).criteria)
170+
171+
fun not(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver = {}): NotCriterion =
172+
SqlBuilder.not(existsPredicate, CriteriaCollector().apply(subCriteria).criteria)
173+
174+
fun <T> not(
175+
column: BindableColumn<T>,
176+
condition: VisitableCondition<T>,
177+
subCriteria: CriteriaReceiver = {}
178+
): NotCriterion =
179+
SqlBuilder.not(column, condition, CriteriaCollector().apply(subCriteria).criteria)
180+
166181
// conditions for all data types
167182
fun <T> isNull(): IsNull<T> = SqlBuilder.isNull()
168183

src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import org.mybatis.dynamic.sql.util.kotlin.elements.isLike
4545
import org.mybatis.dynamic.sql.util.kotlin.elements.isNotLike
4646
import org.mybatis.dynamic.sql.util.kotlin.elements.isNull
4747
import org.mybatis.dynamic.sql.util.kotlin.elements.isTrue
48+
import org.mybatis.dynamic.sql.util.kotlin.elements.not
4849
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.insertInto
4950
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select
5051
import java.io.InputStreamReader
@@ -169,6 +170,21 @@ class PersonMapperTest {
169170
}
170171
}
171172

173+
@Test
174+
fun testFirstNameNotIn() {
175+
newSession().use { session ->
176+
val mapper = session.getMapper(PersonMapper::class.java)
177+
178+
val rows = mapper.select {
179+
where(not(firstName, isIn("Fred", "Barney")))
180+
}
181+
182+
assertThat(rows).hasSize(4)
183+
assertThat(rows[0].firstName).isEqualTo("Wilma")
184+
assertThat(rows[1].firstName).isEqualTo("Pebbles")
185+
}
186+
}
187+
172188
@Test
173189
fun testDelete() {
174190
newSession().use { session ->

src/test/kotlin/examples/kotlin/mybatis3/general/KGroupingTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import org.mybatis.dynamic.sql.util.kotlin.elements.exists
2626
import org.mybatis.dynamic.sql.util.kotlin.elements.group
2727
import org.mybatis.dynamic.sql.util.kotlin.elements.isEqualTo
2828
import org.mybatis.dynamic.sql.util.kotlin.elements.isGreaterThan
29+
import org.mybatis.dynamic.sql.util.kotlin.elements.isGreaterThanOrEqualTo
2930
import org.mybatis.dynamic.sql.util.kotlin.elements.isLessThan
31+
import org.mybatis.dynamic.sql.util.kotlin.elements.not
3032
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select
3133

3234
object FooDynamicSqlSupport {
@@ -216,4 +218,38 @@ class KGroupingTest {
216218
assertThat(selectStatement.parameters).containsEntry("p8", 0)
217219
assertThat(selectStatement.parameters).containsEntry("p9", 2)
218220
}
221+
222+
@Test
223+
fun testNotGroupAndOrCriteriaGroups() {
224+
val selectStatement = select(A, B, C) {
225+
from(foo)
226+
where(not(group(B, isEqualTo(4)) {
227+
and(C, isLessThan(5))
228+
}) {
229+
and(A, isGreaterThan(3))
230+
})
231+
and(not(A, isGreaterThan(4)))
232+
or(
233+
not(
234+
group(C, isLessThan(6)) {
235+
and(A, isGreaterThanOrEqualTo(7))
236+
}
237+
)
238+
)
239+
}
240+
241+
val expected = "select A, B, C" +
242+
" from Foo" +
243+
" where not ((B = #{parameters.p1} and C < #{parameters.p2}) and A > #{parameters.p3})" +
244+
" and not A > #{parameters.p4}" +
245+
" or not (C < #{parameters.p5} and A >= #{parameters.p6})"
246+
247+
assertThat(selectStatement.selectStatement).isEqualTo(expected)
248+
assertThat(selectStatement.parameters).containsEntry("p1", 4)
249+
assertThat(selectStatement.parameters).containsEntry("p2", 5)
250+
assertThat(selectStatement.parameters).containsEntry("p3", 3)
251+
assertThat(selectStatement.parameters).containsEntry("p4", 4)
252+
assertThat(selectStatement.parameters).containsEntry("p5", 6)
253+
assertThat(selectStatement.parameters).containsEntry("p6", 7)
254+
}
219255
}

src/test/kotlin/examples/kotlin/mybatis3/joins/ExistsTest.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test
2929
import org.mybatis.dynamic.sql.util.kotlin.elements.exists
3030
import org.mybatis.dynamic.sql.util.kotlin.elements.isEqualTo
3131
import org.mybatis.dynamic.sql.util.kotlin.elements.isGreaterThan
32+
import org.mybatis.dynamic.sql.util.kotlin.elements.not
3233
import org.mybatis.dynamic.sql.util.kotlin.elements.notExists
3334
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select
3435
import org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper
@@ -130,6 +131,39 @@ class ExistsTest {
130131
}
131132
}
132133

134+
@Test
135+
fun testNotExistsNewNot() {
136+
newSession().use { session ->
137+
val mapper = session.getMapper(CommonSelectMapper::class.java)
138+
139+
val selectStatement = select(itemMaster.allColumns()) {
140+
from(itemMaster, "im")
141+
where(
142+
not(exists {
143+
select(orderLine.allColumns()) {
144+
from(orderLine, "ol")
145+
where(orderLine.itemId, isEqualTo(itemMaster.itemId.qualifiedWith("im")))
146+
}
147+
})
148+
)
149+
orderBy(itemMaster.itemId)
150+
}
151+
152+
val expectedStatement: String = "select im.* from ItemMaster im" +
153+
" where not exists (select ol.* from OrderLine ol where ol.item_id = im.item_id)" +
154+
" order by item_id"
155+
assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement)
156+
157+
val rows = mapper.selectManyMappedRows(selectStatement)
158+
assertThat(rows).hasSize(1)
159+
160+
with(rows[0]) {
161+
assertThat(this).containsEntry("ITEM_ID", 55)
162+
assertThat(this).containsEntry("DESCRIPTION", "Catcher Glove")
163+
}
164+
}
165+
}
166+
133167
@Test
134168
fun testAndExists() {
135169
newSession().use { session ->

0 commit comments

Comments
 (0)