@@ -19,6 +19,7 @@ import org.mybatis.dynamic.sql.BindableColumn
19
19
import org.mybatis.dynamic.sql.ColumnAndConditionCriterion
20
20
import org.mybatis.dynamic.sql.CriteriaGroup
21
21
import org.mybatis.dynamic.sql.AndOrCriteriaGroup
22
+ import org.mybatis.dynamic.sql.BasicColumn
22
23
import org.mybatis.dynamic.sql.ExistsCriterion
23
24
import org.mybatis.dynamic.sql.NotCriterion
24
25
import org.mybatis.dynamic.sql.SqlBuilder
@@ -40,9 +41,17 @@ typealias GroupingCriteriaReceiver = GroupingCriteriaCollector.() -> Unit
40
41
* Only one of these initial criterion functions should be called within each scope. If you need more than one,
41
42
* use a sub-criteria joined with "and" or "or"
42
43
*/
44
+ @Suppress(" TooManyFunctions" )
43
45
@MyBatisDslMarker
44
46
class GroupingCriteriaCollector {
45
47
internal var initialCriterion: SqlCriterion ? = null
48
+ private set(value) {
49
+ if (field != null ) {
50
+ throw DuplicateInitialCriterionException ()
51
+ }
52
+ field = value
53
+ }
54
+
46
55
internal val subCriteria = mutableListOf<AndOrCriteriaGroup >()
47
56
48
57
fun and (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
@@ -104,9 +113,168 @@ class GroupingCriteriaCollector {
104
113
* Build an initial criterion for a where clause, or a nested and/or/not group.
105
114
* You can use it like A (isEqualTo(3))
106
115
*/
107
- infix operator fun <T : Any > BindableColumn<T>.invoke (condition : VisitableCondition <T >) {
116
+ operator fun <T > BindableColumn<T>.invoke (condition : VisitableCondition <T >) {
108
117
initialCriterion = ColumnAndConditionCriterion .withColumn(this )
109
118
.withCondition(condition)
110
119
.build()
111
120
}
121
+
122
+ // infix functions...we may be able to rewrite these as extension functions once Kotlin solves the multiple
123
+ // receivers problem (https://youtrack.jetbrains.com/issue/KT-42435)
124
+
125
+ // conditions for all data types
126
+ fun <T > BindableColumn<T>.isNull () = invoke(SqlBuilder .isNull())
127
+
128
+ fun <T > BindableColumn<T>.isNotNull () = invoke(SqlBuilder .isNotNull())
129
+
130
+ infix fun <T : Any > BindableColumn<T>.isEqualTo (value : T ) = invoke(SqlBuilder .isEqualTo(value))
131
+
132
+ infix fun <T > BindableColumn<T>.isEqualToSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
133
+ invoke(SqlBuilder .isEqualTo(KotlinSubQueryBuilder ().apply (subQuery)))
134
+
135
+ infix fun <T > BindableColumn<T>.isEqualTo (column : BasicColumn ) = invoke(SqlBuilder .isEqualTo(column))
136
+
137
+ infix fun <T : Any > BindableColumn<T>.isEqualToWhenPresent (value : T ? ) =
138
+ invoke(SqlBuilder .isEqualToWhenPresent<T >(value))
139
+
140
+ infix fun <T : Any > BindableColumn<T>.isNotEqualTo (value : T ) = invoke(SqlBuilder .isNotEqualTo(value))
141
+
142
+ infix fun <T > BindableColumn<T>.isNotEqualToSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
143
+ invoke(SqlBuilder .isNotEqualTo(KotlinSubQueryBuilder ().apply (subQuery)))
144
+
145
+ infix fun <T > BindableColumn<T>.isNotEqualTo (column : BasicColumn ) = invoke(SqlBuilder .isNotEqualTo(column))
146
+
147
+ infix fun <T : Any > BindableColumn<T>.isNotEqualToWhenPresent (value : T ? ) =
148
+ invoke(SqlBuilder .isNotEqualToWhenPresent<T >(value))
149
+
150
+ infix fun <T : Any > BindableColumn<T>.isGreaterThan (value : T ) = invoke(SqlBuilder .isGreaterThan(value))
151
+
152
+ infix fun <T > BindableColumn<T>.isGreaterThanSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
153
+ invoke(SqlBuilder .isGreaterThan(KotlinSubQueryBuilder ().apply (subQuery)))
154
+
155
+ infix fun <T > BindableColumn<T>.isGreaterThan (column : BasicColumn ) = invoke(SqlBuilder .isGreaterThan(column))
156
+
157
+ infix fun <T : Any > BindableColumn<T>.isGreaterThanWhenPresent (value : T ? ) =
158
+ invoke(SqlBuilder .isGreaterThanWhenPresent<T >(value))
159
+
160
+ infix fun <T : Any > BindableColumn<T>.isGreaterThanOrEqualTo (value : T ) =
161
+ invoke(SqlBuilder .isGreaterThanOrEqualTo(value))
162
+
163
+ infix fun <T > BindableColumn<T>.isGreaterThanOrEqualToSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
164
+ invoke(SqlBuilder .isGreaterThanOrEqualTo(KotlinSubQueryBuilder ().apply (subQuery)))
165
+
166
+ infix fun <T > BindableColumn<T>.isGreaterThanOrEqualTo (column : BasicColumn ) =
167
+ invoke(SqlBuilder .isGreaterThanOrEqualTo(column))
168
+
169
+ infix fun <T : Any > BindableColumn<T>.isGreaterThanOrEqualToWhenPresent (value : T ? ) =
170
+ invoke(SqlBuilder .isGreaterThanOrEqualToWhenPresent<T >(value))
171
+
172
+ infix fun <T : Any > BindableColumn<T>.isLessThan (value : T ) = invoke(SqlBuilder .isLessThan(value))
173
+
174
+ infix fun <T > BindableColumn<T>.isLessThanSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
175
+ invoke(SqlBuilder .isLessThan(KotlinSubQueryBuilder ().apply (subQuery)))
176
+
177
+ infix fun <T > BindableColumn<T>.isLessThan (column : BasicColumn ) = invoke(SqlBuilder .isLessThan(column))
178
+
179
+ infix fun <T : Any > BindableColumn<T>.isLessThanWhenPresent (value : T ? ) =
180
+ invoke(SqlBuilder .isLessThanWhenPresent<T >(value))
181
+
182
+ infix fun <T : Any > BindableColumn<T>.isLessThanOrEqualTo (value : T ) = invoke(SqlBuilder .isLessThanOrEqualTo(value))
183
+
184
+ infix fun <T > BindableColumn<T>.isLessThanOrEqualToSubQuery (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
185
+ invoke(SqlBuilder .isLessThanOrEqualTo(KotlinSubQueryBuilder ().apply (subQuery)))
186
+
187
+ infix fun <T > BindableColumn<T>.isLessThanOrEqualTo (column : BasicColumn ) =
188
+ invoke(SqlBuilder .isLessThanOrEqualTo(column))
189
+
190
+ infix fun <T : Any > BindableColumn<T>.isLessThanOrEqualToWhenPresent (value : T ? ) =
191
+ invoke(SqlBuilder .isLessThanOrEqualToWhenPresent<T >(value))
192
+
193
+ fun <T : Any > BindableColumn<T>.isIn (vararg values : T ) = isIn(values.asList())
194
+
195
+ infix fun <T : Any > BindableColumn<T>.isIn (values : Collection <T >) = invoke(SqlBuilder .isIn(values))
196
+
197
+ infix fun <T > BindableColumn<T>.isIn (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
198
+ invoke(SqlBuilder .isIn(KotlinSubQueryBuilder ().apply (subQuery)))
199
+
200
+ fun <T : Any > BindableColumn<T>.isInWhenPresent (vararg values : T ? ) = isInWhenPresent(values.asList())
201
+
202
+ infix fun <T : Any > BindableColumn<T>.isInWhenPresent (values : Collection <T ?>? ) =
203
+ invoke(SqlBuilder .isInWhenPresent<T >(values))
204
+
205
+ fun <T : Any > BindableColumn<T>.isNotIn (vararg values : T ) = isNotIn(values.asList())
206
+
207
+ infix fun <T : Any > BindableColumn<T>.isNotIn (values : Collection <T >) = invoke(SqlBuilder .isNotIn(values))
208
+
209
+ infix fun <T > BindableColumn<T>.isNotIn (subQuery : KotlinSubQueryBuilder .() -> Unit ) =
210
+ invoke(SqlBuilder .isNotIn(KotlinSubQueryBuilder ().apply (subQuery)))
211
+
212
+ fun <T : Any > BindableColumn<T>.isNotInWhenPresent (vararg values : T ? ) = isNotInWhenPresent(values.asList())
213
+
214
+ infix fun <T : Any > BindableColumn<T>.isNotInWhenPresent (values : Collection <T ?>? ) =
215
+ invoke(SqlBuilder .isNotInWhenPresent<T >(values))
216
+
217
+ infix fun <T : Any > BindableColumn<T>.isBetween (value1 : T ) =
218
+ InfixBetweenBuilder (value1) { invoke(it) }
219
+
220
+ infix fun <T : Any > BindableColumn<T>.isBetweenWhenPresent (value1 : T ? ) =
221
+ InfixBetweenWhenPresentBuilder (value1) { invoke(it) }
222
+
223
+ infix fun <T : Any > BindableColumn<T>.isNotBetween (value1 : T ) =
224
+ InfixNotBetweenBuilder (value1) { invoke(it) }
225
+
226
+ infix fun <T : Any > BindableColumn<T>.isNotBetweenWhenPresent (value1 : T ? ) =
227
+ InfixNotBetweenWhenPresentBuilder (value1) { invoke(it) }
228
+
229
+ // for string columns, but generic for columns with type handlers
230
+ infix fun <T : Any > BindableColumn<T>.isLike (value : T ) = invoke(SqlBuilder .isLike(value))
231
+
232
+ infix fun <T : Any > BindableColumn<T>.isLikeWhenPresent (value : T ? ) =
233
+ invoke(SqlBuilder .isLikeWhenPresent<T >(value))
234
+
235
+ infix fun <T : Any > BindableColumn<T>.isNotLike (value : T ) = invoke(SqlBuilder .isNotLike(value))
236
+
237
+ infix fun <T : Any > BindableColumn<T>.isNotLikeWhenPresent (value : T ? ) =
238
+ invoke(SqlBuilder .isNotLikeWhenPresent<T >(value))
239
+
240
+ // shortcuts for booleans
241
+ fun BindableColumn<Boolean>.isTrue () = isEqualTo(true )
242
+
243
+ fun BindableColumn<Boolean>.isFalse () = isEqualTo(false )
244
+
245
+ // conditions for strings only
246
+ infix fun BindableColumn<String>.isLikeCaseInsensitive (value : String ) =
247
+ invoke(SqlBuilder .isLikeCaseInsensitive(value))
248
+
249
+ infix fun BindableColumn<String>.isLikeCaseInsensitiveWhenPresent (value : String? ) =
250
+ invoke(SqlBuilder .isLikeCaseInsensitiveWhenPresent(value))
251
+
252
+ infix fun BindableColumn<String>.isNotLikeCaseInsensitive (value : String ) =
253
+ invoke(SqlBuilder .isNotLikeCaseInsensitive(value))
254
+
255
+ infix fun BindableColumn<String>.isNotLikeCaseInsensitiveWhenPresent (value : String? ) =
256
+ invoke(SqlBuilder .isNotLikeCaseInsensitiveWhenPresent(value))
257
+
258
+ fun BindableColumn<String>.isInCaseInsensitive (vararg values : String ) = isInCaseInsensitive(values.asList())
259
+
260
+ infix fun BindableColumn<String>.isInCaseInsensitive (values : Collection <String >) =
261
+ invoke(SqlBuilder .isInCaseInsensitive(values))
262
+
263
+ fun BindableColumn<String>.isInCaseInsensitiveWhenPresent (vararg values : String? ) =
264
+ isInCaseInsensitiveWhenPresent(values.asList())
265
+
266
+ infix fun BindableColumn<String>.isInCaseInsensitiveWhenPresent (values : Collection <String ?>? ) =
267
+ invoke(SqlBuilder .isInCaseInsensitiveWhenPresent(values))
268
+
269
+ fun BindableColumn<String>.isNotInCaseInsensitive (vararg values : String ) =
270
+ isNotInCaseInsensitive(values.asList())
271
+
272
+ infix fun BindableColumn<String>.isNotInCaseInsensitive (values : Collection <String >) =
273
+ invoke(SqlBuilder .isNotInCaseInsensitive(values))
274
+
275
+ fun BindableColumn<String>.isNotInCaseInsensitiveWhenPresent (vararg values : String? ) =
276
+ isNotInCaseInsensitiveWhenPresent(values.asList())
277
+
278
+ infix fun BindableColumn<String>.isNotInCaseInsensitiveWhenPresent (values : Collection <String ?>? ) =
279
+ invoke(SqlBuilder .isNotInCaseInsensitiveWhenPresent(values))
112
280
}
0 commit comments