Skip to content

Commit 0e52b34

Browse files
committed
Polishing
1 parent 36be6dd commit 0e52b34

File tree

2 files changed

+104
-58
lines changed

2 files changed

+104
-58
lines changed

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

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,49 +27,63 @@ import org.mybatis.dynamic.sql.VisitableCondition
2727

2828
typealias GroupingCriteriaReceiver = GroupingCriteriaCollector.() -> Unit
2929

30+
/**
31+
* This class is used to gather criteria for a where clause. The class gathers two types of criteria:
32+
* an initial criterion, and sub-criteria connected by either an "and" or an "or".
33+
*
34+
* An initial criterion can be one of four types:
35+
* - A column and condition (called with the invoke operator on a column)
36+
* - An exists operator (called with the "exists" function)
37+
* - A criteria group which is essentially parenthesis within the where clause (called with the group function)
38+
* - A "not" group (called with the not function)
39+
*
40+
* Only one of these initial criterion functions should be called within each scope. If you need more than one,
41+
* use a sub-criteria joined with "and" or "or"
42+
*/
3043
@MyBatisDslMarker
3144
class GroupingCriteriaCollector {
3245
internal var initialCriterion: SqlCriterion? = null
3346
internal val subCriteria = mutableListOf<AndOrCriteriaGroup>()
3447

35-
fun and(criteriaReceiver: GroupingCriteriaReceiver) {
36-
val cc = GroupingCriteriaCollector().apply(criteriaReceiver)
37-
subCriteria.add(
38-
AndOrCriteriaGroup.Builder().withConnector("and")
39-
.withInitialCriterion(cc.initialCriterion)
40-
.withSubCriteria(cc.subCriteria)
41-
.build()
42-
)
43-
}
48+
fun and(criteriaReceiver: GroupingCriteriaReceiver): Unit =
49+
with(GroupingCriteriaCollector().apply(criteriaReceiver)) {
50+
this@GroupingCriteriaCollector.subCriteria.add(
51+
AndOrCriteriaGroup.Builder().withConnector("and")
52+
.withInitialCriterion(initialCriterion)
53+
.withSubCriteria(subCriteria)
54+
.build()
55+
)
56+
}
4457

45-
fun or(criteriaReceiver: GroupingCriteriaReceiver) {
46-
val cc = GroupingCriteriaCollector().apply(criteriaReceiver)
47-
subCriteria.add(
48-
AndOrCriteriaGroup.Builder().withConnector("or")
49-
.withInitialCriterion(cc.initialCriterion)
50-
.withSubCriteria(cc.subCriteria)
51-
.build()
52-
)
53-
}
58+
fun or(criteriaReceiver: GroupingCriteriaReceiver): Unit =
59+
with(GroupingCriteriaCollector().apply(criteriaReceiver)) {
60+
this@GroupingCriteriaCollector.subCriteria.add(
61+
AndOrCriteriaGroup.Builder().withConnector("or")
62+
.withInitialCriterion(initialCriterion)
63+
.withSubCriteria(subCriteria)
64+
.build()
65+
)
66+
}
5467

5568
/**
5669
* This should only be specified once per scope, and should be first
5770
*/
58-
fun not(criteriaReceiver: GroupingCriteriaReceiver) {
59-
val cc = GroupingCriteriaCollector().apply(criteriaReceiver)
60-
initialCriterion = NotCriterion.Builder()
61-
.withInitialCriterion(cc.initialCriterion)
62-
.withSubCriteria(cc.subCriteria)
63-
.build()
64-
}
71+
fun not(criteriaReceiver: GroupingCriteriaReceiver): Unit =
72+
with(GroupingCriteriaCollector().apply(criteriaReceiver)) {
73+
this@GroupingCriteriaCollector.initialCriterion = NotCriterion.Builder()
74+
.withInitialCriterion(initialCriterion)
75+
.withSubCriteria(subCriteria)
76+
.build()
77+
}
6578

6679
/**
6780
* This should only be specified once per scope, and should be first
6881
*/
69-
fun exists(kotlinSubQueryBuilder: KotlinSubQueryBuilder.() -> Unit) {
70-
val f = KotlinSubQueryBuilder().apply(kotlinSubQueryBuilder)
71-
initialCriterion = ExistsCriterion.Builder().withExistsPredicate(SqlBuilder.exists(f)).build()
72-
}
82+
fun exists(kotlinSubQueryBuilder: KotlinSubQueryBuilder.() -> Unit): Unit =
83+
with(KotlinSubQueryBuilder().apply(kotlinSubQueryBuilder)) {
84+
this@GroupingCriteriaCollector.initialCriterion =
85+
ExistsCriterion.Builder().withExistsPredicate(SqlBuilder.exists(this)).build()
86+
}
7387

7488
/**
7589
* This could "almost" be an operator invoke function. The problem is that
@@ -78,13 +92,13 @@ class GroupingCriteriaCollector {
7892
*
7993
* This should only be specified once per scope, and should be first
8094
*/
81-
fun group(criteriaReceiver: GroupingCriteriaReceiver) {
82-
val cc = GroupingCriteriaCollector().apply(criteriaReceiver)
83-
initialCriterion = CriteriaGroup.Builder()
84-
.withInitialCriterion(cc.initialCriterion)
85-
.withSubCriteria(cc.subCriteria)
86-
.build()
87-
}
95+
fun group(criteriaReceiver: GroupingCriteriaReceiver): Unit =
96+
with(GroupingCriteriaCollector().apply(criteriaReceiver)) {
97+
this@GroupingCriteriaCollector.initialCriterion = CriteriaGroup.Builder()
98+
.withInitialCriterion(initialCriterion)
99+
.withSubCriteria(subCriteria)
100+
.build()
101+
}
88102

89103
/**
90104
* Build an initial criterion for a where clause, or a nested and/or/not group.

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

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,61 +38,93 @@ fun WhereApplier.andThen(after: WhereApplier): WhereApplier = {
3838
@MyBatisDslMarker
3939
@Suppress("TooManyFunctions")
4040
abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*>, B : KotlinBaseBuilder<D, B>> {
41-
fun where(criteria: GroupingCriteriaReceiver) {
42-
val criteriaCollector = GroupingCriteriaCollector().apply(criteria)
43-
44-
getDsl().where(criteriaCollector.initialCriterion, criteriaCollector.subCriteria)
45-
}
41+
fun where(criteria: GroupingCriteriaReceiver): Unit =
42+
with(GroupingCriteriaCollector().apply(criteria)) {
43+
this@KotlinBaseBuilder.getDsl().where(initialCriterion, subCriteria)
44+
}
4645

47-
fun and(criteria: GroupingCriteriaReceiver) {
48-
val criteriaCollector = GroupingCriteriaCollector().apply(criteria)
46+
fun and(criteria: GroupingCriteriaReceiver): Unit =
47+
with(GroupingCriteriaCollector().apply(criteria)) {
48+
this@KotlinBaseBuilder.getDsl().where().and(initialCriterion, subCriteria)
49+
}
4950

50-
getDsl().where().and(criteriaCollector.initialCriterion, criteriaCollector.subCriteria)
51-
}
51+
fun or(criteria: GroupingCriteriaReceiver): Unit =
52+
with(GroupingCriteriaCollector().apply(criteria)) {
53+
this@KotlinBaseBuilder.getDsl().where().or(initialCriterion, subCriteria)
54+
}
5255

53-
fun or(criteria: GroupingCriteriaReceiver) {
54-
val criteriaCollector = GroupingCriteriaCollector().apply(criteria)
56+
fun applyWhere(whereApplier: WhereApplier): B =
57+
self().apply {
58+
whereApplier.invoke(this)
59+
}
5560

56-
getDsl().where().or(criteriaCollector.initialCriterion, criteriaCollector.subCriteria)
57-
}
61+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>): B =
62+
applyToWhere {
63+
where(column, condition)
64+
}
5865

59-
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver = {}): B =
66+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver): B =
6067
applyToWhere(subCriteria) { sc ->
6168
where(column, condition, sc)
6269
}
6370

64-
fun where(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver = {}): B =
71+
fun where(existsPredicate: ExistsPredicate): B =
72+
applyToWhere {
73+
where(existsPredicate)
74+
}
75+
76+
fun where(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver): B =
6577
applyToWhere(subCriteria) { sc ->
6678
where(existsPredicate, sc)
6779
}
6880

69-
fun applyWhere(whereApplier: WhereApplier): B =
70-
self().apply {
71-
whereApplier.invoke(this)
81+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>): B =
82+
applyToWhere {
83+
and(column, condition)
7284
}
7385

74-
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver = {}): B =
86+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver): B =
7587
applyToWhere(subCriteria) { sc ->
7688
and(column, condition, sc)
7789
}
7890

79-
fun and(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver = {}): B =
91+
fun and(existsPredicate: ExistsPredicate): B =
92+
applyToWhere {
93+
and(existsPredicate)
94+
}
95+
96+
fun and(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver): B =
8097
applyToWhere(subCriteria) { sc ->
8198
and(existsPredicate, sc)
8299
}
83100

84-
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver = {}): B =
101+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>): B =
102+
applyToWhere {
103+
or(column, condition)
104+
}
105+
106+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, subCriteria: CriteriaReceiver): B =
85107
applyToWhere(subCriteria) { sc ->
86108
or(column, condition, sc)
87109
}
88110

89-
fun or(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver = {}): B =
111+
fun or(existsPredicate: ExistsPredicate): B =
112+
applyToWhere {
113+
or(existsPredicate)
114+
}
115+
116+
fun or(existsPredicate: ExistsPredicate, subCriteria: CriteriaReceiver): B =
90117
applyToWhere(subCriteria) { sc ->
91118
or(existsPredicate, sc)
92119
}
93120

94121
fun allRows(): B = self()
95122

123+
private fun applyToWhere(block: AbstractWhereDSL<*>.() -> Unit): B {
124+
getDsl().where().apply(block)
125+
return self()
126+
}
127+
96128
private fun applyToWhere(
97129
subCriteria: CriteriaReceiver,
98130
block: AbstractWhereDSL<*>.(List<AndOrCriteriaGroup>) -> Unit

0 commit comments

Comments
 (0)