Skip to content

Commit aff3640

Browse files
authored
Merge pull request #281 from jeffgbutler/rework-kotlin-select
Refactor Kotlin Select and Count DSL
2 parents a568b1f + 4fd4b51 commit aff3640

25 files changed

+870
-656
lines changed

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,33 @@ This log will detail notable changes to MyBatis Dynamic SQL. Full details are av
44

55
## Release 1.3.0 - Unreleased
66

7+
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.3.0+](https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.3.0+)
8+
9+
### Breaking Change for Kotlin
10+
11+
In this release the Kotlin support for `select` and `count` statements has been refactored. This will not impact code
12+
created by MyBatis generator. It will have an impact on Spring users as well as MyBatis users that coded joins or
13+
other queries directly in Kotlin. The difference is that the `from` clause has been moved inside the lambda for select
14+
and count statements.
15+
16+
Previously, code looked like this:
17+
```kotlin
18+
val selectStatement = select(foo).from(bar) {
19+
where(id, isLessThan(3))
20+
}
21+
```
22+
23+
The new code looks like this:
24+
```kotlin
25+
val selectStatement = select(foo) {
26+
from(bar)
27+
where(id, isLessThan(3))
28+
}
29+
```
30+
31+
This change makes the Kotlin DSL a bit more consistent and also makes it easier to implement sub-query support in the
32+
Kotlin DSL.
33+
734
### Added
835

936
- Added a new sort specification that is useful in selects with joins ([#269](https://github.com/mybatis/mybatis-dynamic-sql/pull/269))

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ import org.mybatis.dynamic.sql.where.AbstractWhereDSL
2222
typealias WhereApplier = AbstractWhereDSL<*>.() -> Unit
2323

2424
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.where(
25-
column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver
25+
column: BindableColumn<T>,
26+
condition: VisitableCondition<T>,
27+
collect: CriteriaReceiver
2628
) =
2729
where(column, condition, collect(CriteriaCollector()).criteria)
2830

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.mybatis.dynamic.sql.where.AbstractWhereDSL
2727
annotation class MyBatisDslMarker
2828

2929
@MyBatisDslMarker
30+
@Suppress("TooManyFunctions")
3031
abstract class KotlinBaseBuilder<W : AbstractWhereDSL<W>, B : KotlinBaseBuilder<W, B>> {
3132
fun <T> where(column: BindableColumn<T>, condition: VisitableCondition<T>): B =
3233
applySelf {
@@ -63,6 +64,8 @@ abstract class KotlinBaseBuilder<W : AbstractWhereDSL<W>, B : KotlinBaseBuilder<
6364
getWhere().or(column, condition, collect)
6465
}
6566

67+
fun allRows() = self()
68+
6669
protected fun applySelf(block: B.() -> Unit): B =
6770
self().apply { block() }
6871

@@ -72,46 +75,47 @@ abstract class KotlinBaseBuilder<W : AbstractWhereDSL<W>, B : KotlinBaseBuilder<
7275
}
7376

7477
abstract class KotlinBaseJoiningBuilder<T : AbstractQueryExpressionDSL<T, SelectModel>, W : AbstractWhereDSL<W>,
75-
B : KotlinBaseJoiningBuilder<T, W, B>>
76-
(private val dsl: AbstractQueryExpressionDSL<T, SelectModel>) : KotlinBaseBuilder<W, B>() {
78+
B : KotlinBaseJoiningBuilder<T, W, B>> : KotlinBaseBuilder<W, B>() {
7779

7880
fun join(table: SqlTable, receiver: JoinReceiver): B =
7981
applySelf {
80-
dsl.join(table, receiver)
82+
getDsl().join(table, receiver)
8183
}
8284

8385
fun join(table: SqlTable, alias: String, receiver: JoinReceiver): B =
8486
applySelf {
85-
dsl.join(table, alias, receiver)
87+
getDsl().join(table, alias, receiver)
8688
}
8789

8890
fun fullJoin(table: SqlTable, receiver: JoinReceiver): B =
8991
applySelf {
90-
dsl.fullJoin(table, receiver)
92+
getDsl().fullJoin(table, receiver)
9193
}
9294

9395
fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver): B =
9496
applySelf {
95-
dsl.fullJoin(table, alias, receiver)
97+
getDsl().fullJoin(table, alias, receiver)
9698
}
9799

98100
fun leftJoin(table: SqlTable, receiver: JoinReceiver): B =
99101
applySelf {
100-
dsl.leftJoin(table, receiver)
102+
getDsl().leftJoin(table, receiver)
101103
}
102104

103105
fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver): B =
104106
applySelf {
105-
dsl.leftJoin(table, alias, receiver)
107+
getDsl().leftJoin(table, alias, receiver)
106108
}
107109

108110
fun rightJoin(table: SqlTable, receiver: JoinReceiver): B =
109111
applySelf {
110-
dsl.rightJoin(table, receiver)
112+
getDsl().rightJoin(table, receiver)
111113
}
112114

113115
fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver): B =
114116
applySelf {
115-
dsl.rightJoin(table, alias, receiver)
117+
getDsl().rightJoin(table, alias, receiver)
116118
}
119+
120+
protected abstract fun getDsl(): AbstractQueryExpressionDSL<T, SelectModel>
117121
}

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

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2016-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.util.kotlin
17+
18+
import org.mybatis.dynamic.sql.SqlTable
19+
import org.mybatis.dynamic.sql.select.CountDSL
20+
import org.mybatis.dynamic.sql.select.SelectModel
21+
import org.mybatis.dynamic.sql.util.Buildable
22+
23+
typealias CountCompleter = KotlinCountBuilder.() -> Buildable<SelectModel>
24+
25+
typealias CountColumnCompleter = KotlinCountColumnBuilder.() -> Buildable<SelectModel>
26+
27+
class KotlinCountBuilder(private val dsl: CountDSL<SelectModel>) :
28+
KotlinBaseJoiningBuilder<CountDSL<SelectModel>, CountDSL<SelectModel>.CountWhereBuilder, KotlinCountBuilder>(),
29+
Buildable<SelectModel> {
30+
31+
override fun build(): SelectModel = getDsl().build()
32+
33+
override fun getWhere(): CountDSL<SelectModel>.CountWhereBuilder = getDsl().where()
34+
35+
override fun self() = this
36+
37+
override fun getDsl() = dsl
38+
}
39+
40+
class KotlinCountColumnBuilder(private val fromGatherer: CountDSL.FromGatherer<SelectModel>) :
41+
KotlinBaseJoiningBuilder<CountDSL<SelectModel>,
42+
CountDSL<SelectModel>.CountWhereBuilder, KotlinCountColumnBuilder>(),
43+
Buildable<SelectModel> {
44+
45+
private lateinit var dsl: CountDSL<SelectModel>
46+
47+
fun from(table: SqlTable) =
48+
apply {
49+
dsl = fromGatherer.from(table)
50+
}
51+
52+
override fun build(): SelectModel = getDsl().build()
53+
54+
override fun getWhere(): CountDSL<SelectModel>.CountWhereBuilder = getDsl().where()
55+
56+
override fun self() = this
57+
58+
override fun getDsl(): CountDSL<SelectModel> {
59+
try {
60+
return dsl
61+
} catch (e: UninitializedPropertyAccessException) {
62+
throw UninitializedPropertyAccessException(
63+
"You must specify a \"from\" clause before any other clauses in a count statement", e
64+
)
65+
}
66+
}
67+
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ typealias DeleteCompleter = KotlinDeleteBuilder.() -> Buildable<DeleteModel>
2424
class KotlinDeleteBuilder(private val dsl: DeleteDSL<DeleteModel>) :
2525
KotlinBaseBuilder<DeleteDSL<DeleteModel>.DeleteWhereBuilder, KotlinDeleteBuilder>(), Buildable<DeleteModel> {
2626

27-
fun allRows() = this
28-
2927
override fun build(): DeleteModel = dsl.build()
3028

3129
override fun getWhere(): DeleteDSL<DeleteModel>.DeleteWhereBuilder = dsl.where()

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

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)