@@ -29,30 +29,13 @@ import org.mybatis.dynamic.sql.util.Messages
2929
3030typealias GroupingCriteriaReceiver = GroupingCriteriaCollector .() -> Unit
3131
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+ }
5536
37+ @MyBatisDslMarker
38+ sealed class SubCriteriaCollector {
5639 internal val subCriteria = mutableListOf<AndOrCriteriaGroup >()
5740
5841 /* *
@@ -64,11 +47,11 @@ class GroupingCriteriaCollector {
6447 * @param criteriaReceiver a function to create the contained criteria
6548 */
6649 fun and (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
67- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
68- this @GroupingCriteriaCollector. subCriteria.add(
50+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
51+ subCriteria.add(
6952 AndOrCriteriaGroup .Builder ().withConnector(" and" ) // $NON-NLS-1$
70- .withInitialCriterion(initialCriterion)
71- .withSubCriteria(subCriteria)
53+ .withInitialCriterion(it. initialCriterion)
54+ .withSubCriteria(it. subCriteria)
7255 .build()
7356 )
7457 }
@@ -85,7 +68,7 @@ class GroupingCriteriaCollector {
8568 *
8669 */
8770 fun and (criteria : List <AndOrCriteriaGroup >) {
88- this @GroupingCriteriaCollector. subCriteria.add(
71+ subCriteria.add(
8972 AndOrCriteriaGroup .Builder ().withConnector(" and" ) // $NON-NLS-1$
9073 .withSubCriteria(criteria)
9174 .build()
@@ -101,11 +84,11 @@ class GroupingCriteriaCollector {
10184 * @param criteriaReceiver a function to create the contained criteria
10285 */
10386 fun or (criteriaReceiver : GroupingCriteriaReceiver ): Unit =
104- with ( GroupingCriteriaCollector ().apply (criteriaReceiver)) {
105- this @GroupingCriteriaCollector. subCriteria.add(
87+ GroupingCriteriaCollector ().apply (criteriaReceiver). let {
88+ subCriteria.add(
10689 AndOrCriteriaGroup .Builder ().withConnector(" or" ) // $NON-NLS-1$
107- .withInitialCriterion(initialCriterion)
108- .withSubCriteria(subCriteria)
90+ .withInitialCriterion(it. initialCriterion)
91+ .withSubCriteria(it. subCriteria)
10992 .build()
11093 )
11194 }
@@ -122,12 +105,37 @@ class GroupingCriteriaCollector {
122105 *
123106 */
124107 fun or (criteria : List <AndOrCriteriaGroup >) {
125- this @GroupingCriteriaCollector. subCriteria.add(
108+ subCriteria.add(
126109 AndOrCriteriaGroup .Builder ().withConnector(" or" ) // $NON-NLS-1$
127110 .withSubCriteria(criteria)
128111 .build()
129112 )
130113 }
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+ }
131139
132140 /* *
133141 * Add an initial criterion preceded with "not" to the current context. If the receiver adds more than one
@@ -139,10 +147,10 @@ class GroupingCriteriaCollector {
139147 * @param criteriaReceiver a function to create the contained criteria
140148 */
141149 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)
146154 .build()
147155 }
148156
@@ -159,9 +167,7 @@ class GroupingCriteriaCollector {
159167 *
160168 */
161169 fun not (criteria : List <AndOrCriteriaGroup >) {
162- this @GroupingCriteriaCollector.initialCriterion = NotCriterion .Builder ()
163- .withSubCriteria(criteria)
164- .build()
170+ initialCriterion = NotCriterion .Builder ().withSubCriteria(criteria).build()
165171 }
166172
167173 /* *
@@ -173,9 +179,8 @@ class GroupingCriteriaCollector {
173179 * @param kotlinSubQueryBuilder a function to create a select statement
174180 */
175181 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()
179184 }
180185
181186 /* *
@@ -192,10 +197,10 @@ class GroupingCriteriaCollector {
192197 * @param criteriaReceiver a function to create the contained criteria
193198 */
194199 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)
199204 .build()
200205 }
201206
@@ -212,9 +217,7 @@ class GroupingCriteriaCollector {
212217 *
213218 */
214219 fun group (criteria : List <AndOrCriteriaGroup >) {
215- this @GroupingCriteriaCollector.initialCriterion = CriteriaGroup .Builder ()
216- .withSubCriteria(criteria)
217- .build()
220+ initialCriterion = CriteriaGroup .Builder ().withSubCriteria(criteria).build()
218221 }
219222
220223 /* *
0 commit comments