@@ -29,30 +29,13 @@ import org.mybatis.dynamic.sql.util.Messages
29
29
30
30
typealias GroupingCriteriaReceiver = GroupingCriteriaCollector .() -> Unit
31
31
32
- /* *
33
- * This class is used to gather criteria for a where clause. The class gathers two types of criteria:
34
- * an initial criterion, and sub-criteria connected by either an "and" or an "or".
35
- *
36
- * An initial criterion can be one of four types:
37
- * - A column and condition (called with the invoke operator on a column, or an infix function)
38
- * - An exists operator (called with the "exists" function)
39
- * - A criteria group which is essentially parenthesis within the where clause (called with the "group" function)
40
- * - A criteria group preceded with "not" (called with the "not" function)
41
- *
42
- * Only one of the initial criterion functions should be called within each scope. If you need more than one,
43
- * use a sub-criterion joined with "and" or "or"
44
- */
45
- @Suppress(" TooManyFunctions" )
46
- @MyBatisDslMarker
47
- class GroupingCriteriaCollector {
48
- internal var initialCriterion: SqlCriterion ? = null
49
- private set(value) {
50
- if (field != null ) {
51
- throw KInvalidSQLException (Messages .getString(" ERROR.21" )) // $NON-NLS-1$
52
- }
53
- field = value
54
- }
32
+ fun GroupingCriteriaReceiver.andThen (after : SubCriteriaCollector .() -> Unit ): GroupingCriteriaReceiver = {
33
+ invoke(this )
34
+ after(this )
35
+ }
55
36
37
+ @MyBatisDslMarker
38
+ sealed class SubCriteriaCollector {
56
39
internal val subCriteria = mutableListOf<AndOrCriteriaGroup >()
57
40
58
41
/* *
@@ -64,11 +47,11 @@ class GroupingCriteriaCollector {
64
47
* @param criteriaReceiver a function to create the contained criteria
65
48
*/
66
49
fun and (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
67
- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
68
- this @GroupingCriteriaCollector. subCriteria.add(
50
+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
51
+ subCriteria.add(
69
52
AndOrCriteriaGroup .Builder ().withConnector(" and" ) // $NON-NLS-1$
70
- .withInitialCriterion(initialCriterion)
71
- .withSubCriteria(subCriteria)
53
+ .withInitialCriterion(it. initialCriterion)
54
+ .withSubCriteria(it. subCriteria)
72
55
.build()
73
56
)
74
57
}
@@ -85,7 +68,7 @@ class GroupingCriteriaCollector {
85
68
*
86
69
*/
87
70
fun and (criteria : List <AndOrCriteriaGroup >) {
88
- this @GroupingCriteriaCollector. subCriteria.add(
71
+ subCriteria.add(
89
72
AndOrCriteriaGroup .Builder ().withConnector(" and" ) // $NON-NLS-1$
90
73
.withSubCriteria(criteria)
91
74
.build()
@@ -101,11 +84,11 @@ class GroupingCriteriaCollector {
101
84
* @param criteriaReceiver a function to create the contained criteria
102
85
*/
103
86
fun or (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
104
- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
105
- this @GroupingCriteriaCollector. subCriteria.add(
87
+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
88
+ subCriteria.add(
106
89
AndOrCriteriaGroup .Builder ().withConnector(" or" ) // $NON-NLS-1$
107
- .withInitialCriterion(initialCriterion)
108
- .withSubCriteria(subCriteria)
90
+ .withInitialCriterion(it. initialCriterion)
91
+ .withSubCriteria(it. subCriteria)
109
92
.build()
110
93
)
111
94
}
@@ -122,12 +105,37 @@ class GroupingCriteriaCollector {
122
105
*
123
106
*/
124
107
fun or (criteria : List <AndOrCriteriaGroup >) {
125
- this @GroupingCriteriaCollector. subCriteria.add(
108
+ subCriteria.add(
126
109
AndOrCriteriaGroup .Builder ().withConnector(" or" ) // $NON-NLS-1$
127
110
.withSubCriteria(criteria)
128
111
.build()
129
112
)
130
113
}
114
+ }
115
+
116
+ /* *
117
+ * This class is used to gather criteria for a where clause. The class gathers two types of criteria:
118
+ * an initial criterion, and sub-criteria connected by either an "and" or an "or".
119
+ *
120
+ * An initial criterion can be one of four types:
121
+ * - A column and condition (called with the invoke operator on a column, or an infix function)
122
+ * - An exists operator (called with the "exists" function)
123
+ * - A criteria group which is essentially parenthesis within the where clause (called with the "group" function)
124
+ * - A criteria group preceded with "not" (called with the "not" function)
125
+ *
126
+ * Only one of the initial criterion functions should be called within each scope. If you need more than one,
127
+ * use a sub-criterion joined with "and" or "or"
128
+ */
129
+ @Suppress(" TooManyFunctions" )
130
+ @MyBatisDslMarker
131
+ class GroupingCriteriaCollector : SubCriteriaCollector () {
132
+ internal var initialCriterion: SqlCriterion ? = null
133
+ private set(value) {
134
+ if (field != null ) {
135
+ throw KInvalidSQLException (Messages .getString(" ERROR.21" )) // $NON-NLS-1$
136
+ }
137
+ field = value
138
+ }
131
139
132
140
/* *
133
141
* Add an initial criterion preceded with "not" to the current context. If the receiver adds more than one
@@ -139,10 +147,10 @@ class GroupingCriteriaCollector {
139
147
* @param criteriaReceiver a function to create the contained criteria
140
148
*/
141
149
fun not (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
142
- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
143
- this @GroupingCriteriaCollector. initialCriterion = NotCriterion .Builder ()
144
- .withInitialCriterion(initialCriterion)
145
- .withSubCriteria(subCriteria)
150
+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
151
+ initialCriterion = NotCriterion .Builder ()
152
+ .withInitialCriterion(it. initialCriterion)
153
+ .withSubCriteria(it. subCriteria)
146
154
.build()
147
155
}
148
156
@@ -159,9 +167,7 @@ class GroupingCriteriaCollector {
159
167
*
160
168
*/
161
169
fun not (criteria : List <AndOrCriteriaGroup >) {
162
- this @GroupingCriteriaCollector.initialCriterion = NotCriterion .Builder ()
163
- .withSubCriteria(criteria)
164
- .build()
170
+ initialCriterion = NotCriterion .Builder ().withSubCriteria(criteria).build()
165
171
}
166
172
167
173
/* *
@@ -173,9 +179,8 @@ class GroupingCriteriaCollector {
173
179
* @param kotlinSubQueryBuilder a function to create a select statement
174
180
*/
175
181
fun exists (kotlinSubQueryBuilder : KotlinSubQueryBuilder .() -> Unit ): Unit =
176
- with (KotlinSubQueryBuilder ().apply (kotlinSubQueryBuilder)) {
177
- this @GroupingCriteriaCollector.initialCriterion =
178
- ExistsCriterion .Builder ().withExistsPredicate(SqlBuilder .exists(this )).build()
182
+ KotlinSubQueryBuilder ().apply (kotlinSubQueryBuilder).let {
183
+ initialCriterion = ExistsCriterion .Builder ().withExistsPredicate(SqlBuilder .exists(it)).build()
179
184
}
180
185
181
186
/* *
@@ -192,10 +197,10 @@ class GroupingCriteriaCollector {
192
197
* @param criteriaReceiver a function to create the contained criteria
193
198
*/
194
199
fun group (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
195
- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
196
- this @GroupingCriteriaCollector. initialCriterion = CriteriaGroup .Builder ()
197
- .withInitialCriterion(initialCriterion)
198
- .withSubCriteria(subCriteria)
200
+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
201
+ initialCriterion = CriteriaGroup .Builder ()
202
+ .withInitialCriterion(it. initialCriterion)
203
+ .withSubCriteria(it. subCriteria)
199
204
.build()
200
205
}
201
206
@@ -212,9 +217,7 @@ class GroupingCriteriaCollector {
212
217
*
213
218
*/
214
219
fun group (criteria : List <AndOrCriteriaGroup >) {
215
- this @GroupingCriteriaCollector.initialCriterion = CriteriaGroup .Builder ()
216
- .withSubCriteria(criteria)
217
- .build()
220
+ initialCriterion = CriteriaGroup .Builder ().withSubCriteria(criteria).build()
218
221
}
219
222
220
223
/* *
0 commit comments