Skip to content

Commit e966810

Browse files
committed
Add support for union all Kotlin queries
1 parent 0d89029 commit e966810

File tree

3 files changed

+97
-16
lines changed

3 files changed

+97
-16
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ class KotlinQueryBuilder(private val dsl: QueryExpressionDSL<SelectModel>) :
5252

5353
fun union(union: KotlinUnionBuilder.() -> QueryExpressionDSL<SelectModel>) =
5454
apply {
55-
union(KotlinUnionBuilder(dsl))
55+
union(KotlinUnionBuilder(dsl, dsl.union()))
56+
}
57+
58+
fun unionAll(unionAll: KotlinUnionBuilder.() -> QueryExpressionDSL<SelectModel>) =
59+
apply {
60+
unionAll(KotlinUnionBuilder(dsl, dsl.unionAll()))
5661
}
5762

5863
override fun build(): SelectModel = dsl.build()

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,25 @@ import org.mybatis.dynamic.sql.SqlTable
2020
import org.mybatis.dynamic.sql.select.QueryExpressionDSL
2121
import org.mybatis.dynamic.sql.select.SelectModel
2222

23-
class KotlinUnionBuilder(private val dsl: QueryExpressionDSL<SelectModel>) {
23+
class KotlinUnionBuilder(
24+
private val outerDsl: QueryExpressionDSL<SelectModel>,
25+
private val unionBuilder: QueryExpressionDSL<SelectModel>.UnionBuilder
26+
) {
2427
fun select(vararg selectList: BasicColumn) =
2528
select(selectList.toList())
2629

2730
fun select(selectList: List<BasicColumn>) =
28-
KotlinUnionFromGatherer(dsl, dsl.union().select(selectList))
31+
KotlinUnionFromGatherer(outerDsl, unionBuilder.select(selectList))
2932

3033
fun selectDistinct(vararg selectList: BasicColumn) =
3134
selectDistinct(selectList.toList())
3235

3336
fun selectDistinct(selectList: List<BasicColumn>) =
34-
KotlinUnionFromGatherer(dsl, dsl.union().selectDistinct(selectList))
37+
KotlinUnionFromGatherer(outerDsl, unionBuilder.selectDistinct(selectList))
3538
}
3639

3740
class KotlinUnionFromGatherer(
38-
private val dsl: QueryExpressionDSL<SelectModel>,
41+
private val outerDsl: QueryExpressionDSL<SelectModel>,
3942
private val fromGatherer: QueryExpressionDSL.FromGatherer<SelectModel>
4043
) {
4144
fun from(
@@ -44,7 +47,7 @@ class KotlinUnionFromGatherer(
4447
): QueryExpressionDSL<SelectModel> {
4548
val unionBuilder = KotlinUnionQueryBuilder(fromGatherer.from(table))
4649
enhance(unionBuilder)
47-
return dsl
50+
return outerDsl
4851
}
4952

5053
fun from(
@@ -54,14 +57,14 @@ class KotlinUnionFromGatherer(
5457
): QueryExpressionDSL<SelectModel> {
5558
val unionBuilder = KotlinUnionQueryBuilder(fromGatherer.from(table, alias))
5659
enhance(unionBuilder)
57-
return dsl
60+
return outerDsl
5861
}
5962
}
6063

61-
class KotlinUnionQueryBuilder(private val dsl: QueryExpressionDSL<SelectModel>) :
64+
class KotlinUnionQueryBuilder(private val unionDsl: QueryExpressionDSL<SelectModel>) :
6265
KotlinBaseJoiningBuilder<QueryExpressionDSL<SelectModel>, QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder,
63-
KotlinUnionQueryBuilder>(dsl) {
66+
KotlinUnionQueryBuilder>(unionDsl) {
6467
override fun self() = this
6568

66-
override fun getWhere(): QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder = dsl.where()
69+
override fun getWhere(): QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder = unionDsl.where()
6770
}

src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTest.kt

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ class CanonicalSpringKotlinTest {
412412
}
413413

414414
assertThat(records).hasSize(3)
415-
with(records[0]!!) {
415+
with(records[0]) {
416416
assertThat(id).isEqualTo(1)
417417
assertThat(firstName).isEqualTo("Fred")
418418
assertThat(lastName).isEqualTo("Flintstone")
@@ -422,7 +422,7 @@ class CanonicalSpringKotlinTest {
422422
assertThat(addressId).isEqualTo(1)
423423
}
424424

425-
with(records[2]!!) {
425+
with(records[2]) {
426426
assertThat(id).isEqualTo(3)
427427
assertThat(firstName).isEqualTo("Pebbles")
428428
assertThat(lastName).isEqualTo("Flintstone")
@@ -485,7 +485,7 @@ class CanonicalSpringKotlinTest {
485485
}
486486

487487
assertThat(records).hasSize(3)
488-
with(records[0]!!) {
488+
with(records[0]) {
489489
assertThat(id).isEqualTo(1)
490490
assertThat(firstName).isEqualTo("Fred")
491491
assertThat(lastName).isEqualTo("Flintstone")
@@ -495,7 +495,7 @@ class CanonicalSpringKotlinTest {
495495
assertThat(addressId).isEqualTo(1)
496496
}
497497

498-
with(records[2]!!) {
498+
with(records[2]) {
499499
assertThat(id).isEqualTo(3)
500500
assertThat(firstName).isEqualTo("Pebbles")
501501
assertThat(lastName).isEqualTo("Flintstone")
@@ -558,7 +558,7 @@ class CanonicalSpringKotlinTest {
558558
}
559559

560560
assertThat(records).hasSize(3)
561-
with(records[0]!!) {
561+
with(records[0]) {
562562
assertThat(id).isEqualTo(1)
563563
assertThat(firstName).isEqualTo("Fred")
564564
assertThat(lastName).isEqualTo("Flintstone")
@@ -568,7 +568,80 @@ class CanonicalSpringKotlinTest {
568568
assertThat(addressId).isEqualTo(1)
569569
}
570570

571-
with(records[2]!!) {
571+
with(records[2]) {
572+
assertThat(id).isEqualTo(3)
573+
assertThat(firstName).isEqualTo("Pebbles")
574+
assertThat(lastName).isEqualTo("Flintstone")
575+
assertThat(birthDate).isNotNull()
576+
assertThat(employed).isEqualTo("No")
577+
assertThat(occupation).isNull()
578+
assertThat(addressId).isEqualTo(1)
579+
}
580+
}
581+
582+
@Test
583+
fun testRawSelectWithUnionAllAndDistinct() {
584+
val selectStatement = select(
585+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
586+
addressId
587+
).from(Person) {
588+
where(id, isEqualTo(1))
589+
union {
590+
select(
591+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
592+
addressId
593+
).from(Person) {
594+
where(id, isEqualTo(2))
595+
}
596+
}
597+
unionAll {
598+
selectDistinct(
599+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
600+
addressId
601+
).from(Person, "p") {
602+
where(id, isEqualTo(3))
603+
}
604+
}
605+
}
606+
607+
val expected = "select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
608+
"from Person " +
609+
"where id = :p1 " +
610+
"union " +
611+
"select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
612+
"from Person " +
613+
"where id = :p2 " +
614+
"union all " +
615+
"select distinct p.id as A_ID, p.first_name, p.last_name, p.birth_date, p.employed, p.occupation, p.address_id " +
616+
"from Person p " +
617+
"where p.id = :p3"
618+
619+
assertThat(selectStatement.selectStatement).isEqualTo(expected)
620+
621+
val records = template.selectList(selectStatement) { rs, _ ->
622+
val record = PersonRecord()
623+
record.id = rs.getInt(1)
624+
record.firstName = rs.getString(2)
625+
record.lastName = rs.getString(3)
626+
record.birthDate = rs.getTimestamp(4)
627+
record.employed = rs.getString(5)
628+
record.occupation = rs.getString(6)
629+
record.addressId = rs.getInt(7)
630+
record
631+
}
632+
633+
assertThat(records).hasSize(3)
634+
with(records[0]) {
635+
assertThat(id).isEqualTo(1)
636+
assertThat(firstName).isEqualTo("Fred")
637+
assertThat(lastName).isEqualTo("Flintstone")
638+
assertThat(birthDate).isNotNull()
639+
assertThat(employed).isEqualTo("Yes")
640+
assertThat(occupation).isEqualTo("Brontosaurus Operator")
641+
assertThat(addressId).isEqualTo(1)
642+
}
643+
644+
with(records[2]) {
572645
assertThat(id).isEqualTo(3)
573646
assertThat(firstName).isEqualTo("Pebbles")
574647
assertThat(lastName).isEqualTo("Flintstone")

0 commit comments

Comments
 (0)