Skip to content

Commit 52d897a

Browse files
committed
Add some kotlin error checking
1 parent fbd0461 commit 52d897a

File tree

5 files changed

+55
-31
lines changed

5 files changed

+55
-31
lines changed

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

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,33 @@
1515
*/
1616
package org.mybatis.dynamic.sql.util.kotlin
1717

18-
import org.mybatis.dynamic.sql.AndOrCriteriaGroup
1918
import org.mybatis.dynamic.sql.BindableColumn
20-
import org.mybatis.dynamic.sql.ColumnAndConditionCriterion
2119
import org.mybatis.dynamic.sql.SqlBuilder
22-
import org.mybatis.dynamic.sql.SqlCriterion
2320
import org.mybatis.dynamic.sql.VisitableCondition
2421

2522
typealias JoinReceiver = JoinCollector.() -> Unit
2623

2724
@MyBatisDslMarker
2825
class JoinCollector {
29-
private var initialCriterion: SqlCriterion? = null
30-
internal val subCriteria = mutableListOf<AndOrCriteriaGroup>()
26+
private val criteriaCollector = GroupingCriteriaCollector()
3127

32-
internal fun initialCriterion() : SqlCriterion = invalidIfNull(initialCriterion, "ERROR.22") //$NON-NLS-1$
28+
internal fun initialCriterion() = invalidIfNull(criteriaCollector.initialCriterion, "ERROR.22") //$NON-NLS-1$
29+
internal fun subCriteria() = criteriaCollector.subCriteria
3330

3431
fun on (receiver: GroupingCriteriaReceiver) {
35-
GroupingCriteriaCollector().apply(receiver).also {
36-
initialCriterion = it.initialCriterion
37-
subCriteria.addAll(it.subCriteria)
38-
}
32+
assertNull(criteriaCollector.initialCriterion, "ERROR.45") //$NON-NLS-1$
33+
criteriaCollector.apply(receiver)
3934
}
4035

4136
// TODO - Deprecate?
4237
fun <T> on(leftColumn: BindableColumn<T>): RightColumnCollector<T> = RightColumnCollector {
43-
initialCriterion = ColumnAndConditionCriterion.withColumn(leftColumn)
44-
.withCondition(it)
45-
.build()
38+
assertNull(criteriaCollector.initialCriterion, "ERROR.45") //$NON-NLS-1$
39+
criteriaCollector.apply { leftColumn.invoke(it) }
4640
}
4741

4842
// TODO - Deprecate?
4943
fun <T> and(leftColumn: BindableColumn<T>): RightColumnCollector<T> = RightColumnCollector {
50-
subCriteria.add(
51-
AndOrCriteriaGroup.Builder()
52-
.withConnector("and") //$NON-NLS-1$
53-
.withInitialCriterion(ColumnAndConditionCriterion.withColumn(leftColumn).withCondition(it).build())
54-
.build()
55-
)
44+
criteriaCollector.and { leftColumn.invoke(it) }
5645
}
5746
}
5847

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,74 +66,74 @@ abstract class KotlinBaseJoiningBuilder<D : AbstractQueryExpressionDSL<*, *>> :
6666

6767
fun join(table: SqlTable, joinCriteria: JoinReceiver): Unit =
6868
applyToDsl(joinCriteria) { jc ->
69-
join(table, jc.initialCriterion(), jc.subCriteria)
69+
join(table, jc.initialCriterion(), jc.subCriteria())
7070
}
7171

7272
fun join(table: SqlTable, alias: String, joinCriteria: JoinReceiver): Unit =
7373
applyToDsl(joinCriteria) { jc ->
74-
join(table, alias, jc.initialCriterion(), jc.subCriteria)
74+
join(table, alias, jc.initialCriterion(), jc.subCriteria())
7575
}
7676

7777
fun join(
7878
subQuery: KotlinQualifiedSubQueryBuilder.() -> Unit,
7979
joinCriteria: JoinReceiver
8080
): Unit =
8181
applyToDsl(subQuery, joinCriteria) { sq, jc ->
82-
join(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria)
82+
join(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria())
8383
}
8484

8585
fun fullJoin(table: SqlTable, joinCriteria: JoinReceiver): Unit =
8686
applyToDsl(joinCriteria) { jc ->
87-
fullJoin(table, jc.initialCriterion(), jc.subCriteria)
87+
fullJoin(table, jc.initialCriterion(), jc.subCriteria())
8888
}
8989

9090
fun fullJoin(table: SqlTable, alias: String, joinCriteria: JoinReceiver): Unit =
9191
applyToDsl(joinCriteria) { jc ->
92-
fullJoin(table, alias, jc.initialCriterion(), jc.subCriteria)
92+
fullJoin(table, alias, jc.initialCriterion(), jc.subCriteria())
9393
}
9494

9595
fun fullJoin(
9696
subQuery: KotlinQualifiedSubQueryBuilder.() -> Unit,
9797
joinCriteria: JoinReceiver
9898
): Unit =
9999
applyToDsl(subQuery, joinCriteria) { sq, jc ->
100-
fullJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria)
100+
fullJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria())
101101
}
102102

103103
fun leftJoin(table: SqlTable, joinCriteria: JoinReceiver): Unit =
104104
applyToDsl(joinCriteria) { jc ->
105-
leftJoin(table, jc.initialCriterion(), jc.subCriteria)
105+
leftJoin(table, jc.initialCriterion(), jc.subCriteria())
106106
}
107107

108108
fun leftJoin(table: SqlTable, alias: String, joinCriteria: JoinReceiver): Unit =
109109
applyToDsl(joinCriteria) { jc ->
110-
leftJoin(table, alias, jc.initialCriterion(), jc.subCriteria)
110+
leftJoin(table, alias, jc.initialCriterion(), jc.subCriteria())
111111
}
112112

113113
fun leftJoin(
114114
subQuery: KotlinQualifiedSubQueryBuilder.() -> Unit,
115115
joinCriteria: JoinReceiver
116116
): Unit =
117117
applyToDsl(subQuery, joinCriteria) { sq, jc ->
118-
leftJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria)
118+
leftJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria())
119119
}
120120

121121
fun rightJoin(table: SqlTable, joinCriteria: JoinReceiver): Unit =
122122
applyToDsl(joinCriteria) { jc ->
123-
rightJoin(table, jc.initialCriterion(), jc.subCriteria)
123+
rightJoin(table, jc.initialCriterion(), jc.subCriteria())
124124
}
125125

126126
fun rightJoin(table: SqlTable, alias: String, joinCriteria: JoinReceiver): Unit =
127127
applyToDsl(joinCriteria) { jc ->
128-
rightJoin(table, alias, jc.initialCriterion(), jc.subCriteria)
128+
rightJoin(table, alias, jc.initialCriterion(), jc.subCriteria())
129129
}
130130

131131
fun rightJoin(
132132
subQuery: KotlinQualifiedSubQueryBuilder.() -> Unit,
133133
joinCriteria: JoinReceiver
134134
): Unit =
135135
applyToDsl(subQuery, joinCriteria) { sq, jc ->
136-
rightJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria)
136+
rightJoin(sq, sq.correlationName, jc.initialCriterion(), jc.subCriteria())
137137
}
138138

139139
private fun applyToDsl(joinCriteria: JoinReceiver, applyJoin: D.(JoinCollector) -> Unit) {

src/main/resources/org/mybatis/dynamic/sql/util/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ ERROR.41=You cannot call "then" in a Kotlin case expression more than once
6161
ERROR.42=You cannot call `else` in a Kotlin case expression more than once
6262
ERROR.43=A Kotlin cast expression must have one, and only one, `as` element
6363
ERROR.44={0} conditions must contain at least one value
64+
ERROR.45=You cannot call "on" in a Kotlin join expression more than once
6465
INTERNAL.ERROR=Internal Error {0}

src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperNewSyntaxTest.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,4 +815,21 @@ class JoinMapperNewSyntaxTest {
815815
}
816816
}.withMessage(Messages.getString("ERROR.22")) //$NON-NLS-1$
817817
}
818+
819+
@Test
820+
fun testJoinWithDoubleOnCondition() {
821+
// create second table instance for self-join
822+
val user2 = user.withAlias("other_user")
823+
824+
assertThatExceptionOfType(KInvalidSQLException::class.java).isThrownBy {
825+
select(user.userId, user.userName, user.parentId) {
826+
from(user, "u1")
827+
join(user2, "u2") {
828+
on { user.userId isEqualTo user2.parentId }
829+
on { user.userId isEqualTo user2.parentId }
830+
}
831+
where { user2.userId isEqualTo 4 }
832+
}
833+
}.withMessage(Messages.getString("ERROR.45")) //$NON-NLS-1$
834+
}
818835
}

src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperTest.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,23 @@ class JoinMapperTest {
813813
}.withMessage(Messages.getString("ERROR.22")) //$NON-NLS-1$
814814
}
815815

816+
@Test
817+
fun testJoinWithDoubleOnCondition() {
818+
// create second table instance for self-join
819+
val user2 = user.withAlias("other_user")
820+
821+
assertThatExceptionOfType(KInvalidSQLException::class.java).isThrownBy {
822+
select(user.userId, user.userName, user.parentId) {
823+
from(user, "u1")
824+
join(user2, "u2") {
825+
on(user.userId) equalTo user2.parentId
826+
on(user.userId) equalTo user2.parentId
827+
}
828+
where { user2.userId isEqualTo 4 }
829+
}
830+
}.withMessage(Messages.getString("ERROR.45")) //$NON-NLS-1$
831+
}
832+
816833
@Test
817834
fun testThatAliasesPropagateToSubQueryConditions() {
818835
sqlSessionFactory.openSession().use { session ->

0 commit comments

Comments
 (0)