Skip to content

Commit 96d5627

Browse files
committed
Fix for Kotlin
This change removes the old extension methods in favor of builder classes. This is important because there was a possibility of incorrect code generating if the wrong imports were used. The old method had such highly overloaded methods names that the wrong method could have easily been specified which would cause unpredictable results.
1 parent a9b3ac9 commit 96d5627

File tree

8 files changed

+388
-129
lines changed

8 files changed

+388
-129
lines changed

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

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

1818
import org.mybatis.dynamic.sql.BindableColumn
19+
import org.mybatis.dynamic.sql.SqlTable
1920
import org.mybatis.dynamic.sql.VisitableCondition
2021
import org.mybatis.dynamic.sql.select.CountDSL
2122
import org.mybatis.dynamic.sql.select.SelectModel
22-
import org.mybatis.dynamic.sql.util.Buildable
2323

24-
typealias CountCompleter = CountDSL<SelectModel>.() -> Buildable<SelectModel>
24+
typealias CountCompleter = KotlinCountBuilder.() -> KotlinCountBuilder
2525

26-
fun <T> CountDSL<SelectModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
27-
apply {
28-
where().where(column, condition, collect)
29-
}
26+
class KotlinCountBuilder(val dsl: CountDSL<SelectModel>) {
27+
fun join(table: SqlTable, receiver: JoinReceiver) =
28+
apply {
29+
val collector = JoinCollector()
30+
receiver(collector)
31+
dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria)
32+
}
3033

31-
fun <T> CountDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
32-
apply {
33-
where().and(column, condition)
34-
}
34+
fun join(table: SqlTable, alias: String, receiver: JoinReceiver) =
35+
apply {
36+
val collector = JoinCollector()
37+
receiver(collector)
38+
dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
39+
}
3540

36-
fun <T> CountDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
37-
apply {
38-
where().and(column, condition, collect)
39-
}
41+
fun fullJoin(table: SqlTable, receiver: JoinReceiver) =
42+
apply {
43+
val collector = JoinCollector()
44+
receiver(collector)
45+
dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
46+
}
4047

41-
fun <T> CountDSL<SelectModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
42-
apply {
43-
where().or(column, condition)
44-
}
48+
fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
49+
apply {
50+
val collector = JoinCollector()
51+
receiver(collector)
52+
dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
53+
}
4554

46-
fun <T> CountDSL<SelectModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
47-
apply {
48-
where().or(column, condition, collect)
49-
}
55+
fun leftJoin(table: SqlTable, receiver: JoinReceiver) =
56+
apply {
57+
val collector = JoinCollector()
58+
receiver(collector)
59+
dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
60+
}
5061

51-
fun CountDSL<SelectModel>.allRows() = this as Buildable<SelectModel>
62+
fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
63+
apply {
64+
val collector = JoinCollector()
65+
receiver(collector)
66+
dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
67+
}
68+
69+
fun rightJoin(table: SqlTable, receiver: JoinReceiver) =
70+
apply {
71+
val collector = JoinCollector()
72+
receiver(collector)
73+
dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
74+
}
75+
76+
fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
77+
apply {
78+
val collector = JoinCollector()
79+
receiver(collector)
80+
dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
81+
}
82+
83+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>) =
84+
apply {
85+
dsl.where(column, condition)
86+
}
87+
88+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
89+
apply {
90+
val collector = CriteriaCollector()
91+
collect(collector)
92+
// TODO...awkward
93+
dsl.where(column, condition, *collector.criteria.toTypedArray())
94+
}
95+
96+
fun applyWhere(whereApplier: WhereApplier) =
97+
apply {
98+
dsl.applyWhere(whereApplier)
99+
}
100+
101+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
102+
apply {
103+
dsl.where().and(column, condition)
104+
}
105+
106+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
107+
apply {
108+
val collector = CriteriaCollector()
109+
collect(collector)
110+
// TODO...awkward
111+
dsl.where().and(column, condition, *collector.criteria.toTypedArray())
112+
}
113+
114+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
115+
apply {
116+
dsl.where().or(column, condition)
117+
}
118+
119+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
120+
apply {
121+
val collector = CriteriaCollector()
122+
collect(collector)
123+
// TODO...awkward
124+
dsl.where().or(column, condition, *collector.criteria.toTypedArray())
125+
}
126+
127+
fun allRows() = this
128+
}

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

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,53 @@ import org.mybatis.dynamic.sql.BindableColumn
1919
import org.mybatis.dynamic.sql.VisitableCondition
2020
import org.mybatis.dynamic.sql.delete.DeleteDSL
2121
import org.mybatis.dynamic.sql.delete.DeleteModel
22-
import org.mybatis.dynamic.sql.util.Buildable
2322

24-
typealias DeleteCompleter = DeleteDSL<DeleteModel>.() -> Buildable<DeleteModel>
23+
typealias DeleteCompleter = KotlinDeleteBuilder.() -> KotlinDeleteBuilder
2524

26-
fun <T> DeleteDSL<DeleteModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
27-
apply {
28-
where().where(column, condition, collect)
29-
}
25+
class KotlinDeleteBuilder(val dsl: DeleteDSL<DeleteModel>) {
26+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>) =
27+
apply {
28+
dsl.where(column, condition)
29+
}
3030

31-
fun <T> DeleteDSL<DeleteModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
32-
apply {
33-
where().and(column, condition)
34-
}
31+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
32+
apply {
33+
val collector = CriteriaCollector()
34+
collect(collector)
35+
// TODO...awkward
36+
dsl.where(column, condition, *collector.criteria.toTypedArray())
37+
}
3538

36-
fun <T> DeleteDSL<DeleteModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
37-
apply {
38-
where().and(column, condition, collect)
39-
}
39+
fun applyWhere(whereApplier: WhereApplier) =
40+
apply {
41+
dsl.applyWhere(whereApplier)
42+
}
4043

41-
fun <T> DeleteDSL<DeleteModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
42-
apply {
43-
where().or(column, condition)
44-
}
44+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
45+
apply {
46+
dsl.where().and(column, condition)
47+
}
4548

46-
fun <T> DeleteDSL<DeleteModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
47-
apply {
48-
where().or(column, condition, collect)
49-
}
49+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
50+
apply {
51+
val collector = CriteriaCollector()
52+
collect(collector)
53+
// TODO...awkward
54+
dsl.where().and(column, condition, *collector.criteria.toTypedArray())
55+
}
5056

51-
fun DeleteDSL<DeleteModel>.allRows() = this as Buildable<DeleteModel>
57+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
58+
apply {
59+
dsl.where().or(column, condition)
60+
}
61+
62+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
63+
apply {
64+
val collector = CriteriaCollector()
65+
collect(collector)
66+
// TODO...awkward
67+
dsl.where().or(column, condition, *collector.criteria.toTypedArray())
68+
}
69+
70+
fun allRows() = this
71+
}

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

Lines changed: 125 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,137 @@
1515
*/
1616
package org.mybatis.dynamic.sql.util.kotlin
1717

18-
import org.mybatis.dynamic.sql.BindableColumn
19-
import org.mybatis.dynamic.sql.VisitableCondition
18+
import org.mybatis.dynamic.sql.*
2019
import org.mybatis.dynamic.sql.select.QueryExpressionDSL
2120
import org.mybatis.dynamic.sql.select.SelectModel
22-
import org.mybatis.dynamic.sql.util.Buildable
2321

24-
typealias SelectCompleter = QueryExpressionDSL<SelectModel>.() -> Buildable<SelectModel>
22+
typealias SelectCompleter = KotlinQueryBuilder.() -> KotlinQueryBuilder
2523

26-
fun <T> QueryExpressionDSL<SelectModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
27-
apply {
28-
where().where(column, condition, collect)
29-
}
24+
class KotlinQueryBuilder(val dsl: QueryExpressionDSL<SelectModel>) {
25+
fun join(table: SqlTable, receiver: JoinReceiver) =
26+
apply {
27+
val collector = JoinCollector()
28+
receiver(collector)
29+
dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria)
30+
}
3031

31-
fun <T> QueryExpressionDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
32-
apply {
33-
where().and(column, condition)
34-
}
32+
fun join(table: SqlTable, alias: String, receiver: JoinReceiver) =
33+
apply {
34+
val collector = JoinCollector()
35+
receiver(collector)
36+
dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
37+
}
3538

36-
fun <T> QueryExpressionDSL<SelectModel>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
37-
apply {
38-
where().and(column, condition, collect)
39-
}
39+
fun fullJoin(table: SqlTable, receiver: JoinReceiver) =
40+
apply {
41+
val collector = JoinCollector()
42+
receiver(collector)
43+
dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
44+
}
4045

41-
fun <T> QueryExpressionDSL<SelectModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
42-
apply {
43-
where().or(column, condition)
44-
}
46+
fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
47+
apply {
48+
val collector = JoinCollector()
49+
receiver(collector)
50+
dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
51+
}
4552

46-
fun <T> QueryExpressionDSL<SelectModel>.or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
47-
apply {
48-
where().or(column, condition, collect)
49-
}
53+
fun leftJoin(table: SqlTable, receiver: JoinReceiver) =
54+
apply {
55+
val collector = JoinCollector()
56+
receiver(collector)
57+
dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
58+
}
5059

51-
fun QueryExpressionDSL<SelectModel>.allRows() = this as Buildable<SelectModel>
60+
fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
61+
apply {
62+
val collector = JoinCollector()
63+
receiver(collector)
64+
dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
65+
}
66+
67+
fun rightJoin(table: SqlTable, receiver: JoinReceiver) =
68+
apply {
69+
val collector = JoinCollector()
70+
receiver(collector)
71+
dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria)
72+
}
73+
74+
fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) =
75+
apply {
76+
val collector = JoinCollector()
77+
receiver(collector)
78+
dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria)
79+
}
80+
81+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>) =
82+
apply {
83+
dsl.where(column, condition)
84+
}
85+
86+
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
87+
apply {
88+
val collector = CriteriaCollector()
89+
collect(collector)
90+
// TODO...awkward
91+
dsl.where(column, condition, *collector.criteria.toTypedArray())
92+
}
93+
94+
fun applyWhere(whereApplier: WhereApplier) =
95+
apply {
96+
dsl.applyWhere(whereApplier)
97+
}
98+
99+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>) =
100+
apply {
101+
dsl.where().and(column, condition)
102+
}
103+
104+
fun <T> and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
105+
apply {
106+
val collector = CriteriaCollector()
107+
collect(collector)
108+
// TODO...awkward
109+
dsl.where().and(column, condition, *collector.criteria.toTypedArray())
110+
}
111+
112+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>) =
113+
apply {
114+
dsl.where().or(column, condition)
115+
}
116+
117+
fun <T> or(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =
118+
apply {
119+
val collector = CriteriaCollector()
120+
collect(collector)
121+
// TODO...awkward
122+
dsl.where().or(column, condition, *collector.criteria.toTypedArray())
123+
}
124+
125+
fun groupBy(vararg columns: BasicColumn) =
126+
apply {
127+
dsl.groupBy(*columns)
128+
}
129+
130+
fun orderBy(vararg columns: SortSpecification) =
131+
apply {
132+
dsl.orderBy(*columns)
133+
}
134+
135+
fun limit(limit: Long) =
136+
apply {
137+
dsl.limit(limit)
138+
}
139+
140+
fun offset(offset: Long) =
141+
apply {
142+
dsl.offset(offset)
143+
}
144+
145+
fun fetchFirst(fetchFirstRows: Long) =
146+
apply {
147+
dsl.fetchFirst(fetchFirstRows)
148+
}
149+
150+
fun allRows() = this
151+
}

0 commit comments

Comments
 (0)