Skip to content

Commit 0d89029

Browse files
committed
Add support for selectDistinct in union queries
1 parent f07e504 commit 0d89029

File tree

2 files changed

+84
-5
lines changed

2 files changed

+84
-5
lines changed

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,27 @@ import org.mybatis.dynamic.sql.select.SelectModel
2222

2323
class KotlinUnionBuilder(private val dsl: QueryExpressionDSL<SelectModel>) {
2424
fun select(vararg selectList: BasicColumn) =
25-
select(listOf(*selectList))
25+
select(selectList.toList())
2626

2727
fun select(selectList: List<BasicColumn>) =
28-
KotlinUnionFromGatherer(dsl, selectList)
28+
KotlinUnionFromGatherer(dsl, dsl.union().select(selectList))
29+
30+
fun selectDistinct(vararg selectList: BasicColumn) =
31+
selectDistinct(selectList.toList())
32+
33+
fun selectDistinct(selectList: List<BasicColumn>) =
34+
KotlinUnionFromGatherer(dsl, dsl.union().selectDistinct(selectList))
2935
}
3036

3137
class KotlinUnionFromGatherer(
3238
private val dsl: QueryExpressionDSL<SelectModel>,
33-
private val selectList: List<BasicColumn>
39+
private val fromGatherer: QueryExpressionDSL.FromGatherer<SelectModel>
3440
) {
3541
fun from(
3642
table: SqlTable,
3743
enhance: KotlinUnionQueryBuilder.() -> KotlinUnionQueryBuilder
3844
): QueryExpressionDSL<SelectModel> {
39-
val unionBuilder = KotlinUnionQueryBuilder(dsl.union().select(selectList).from(table))
45+
val unionBuilder = KotlinUnionQueryBuilder(fromGatherer.from(table))
4046
enhance(unionBuilder)
4147
return dsl
4248
}
@@ -46,7 +52,7 @@ class KotlinUnionFromGatherer(
4652
alias: String,
4753
enhance: KotlinUnionQueryBuilder.() -> KotlinUnionQueryBuilder
4854
): QueryExpressionDSL<SelectModel> {
49-
val unionBuilder = KotlinUnionQueryBuilder(dsl.union().select(selectList).from(table, alias))
55+
val unionBuilder = KotlinUnionQueryBuilder(fromGatherer.from(table, alias))
5056
enhance(unionBuilder)
5157
return dsl
5258
}

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,79 @@ class CanonicalSpringKotlinTest {
506506
}
507507
}
508508

509+
@Test
510+
fun testRawSelectWithUnionAndDistinct() {
511+
val selectStatement = select(
512+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
513+
addressId
514+
).from(Person) {
515+
where(id, isEqualTo(1))
516+
union {
517+
select(
518+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
519+
addressId
520+
).from(Person) {
521+
where(id, isEqualTo(2))
522+
}
523+
}
524+
union {
525+
selectDistinct(
526+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
527+
addressId
528+
).from(Person, "p") {
529+
where(id, isEqualTo(3))
530+
}
531+
}
532+
}
533+
534+
val expected = "select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
535+
"from Person " +
536+
"where id = :p1 " +
537+
"union " +
538+
"select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
539+
"from Person " +
540+
"where id = :p2 " +
541+
"union " +
542+
"select distinct p.id as A_ID, p.first_name, p.last_name, p.birth_date, p.employed, p.occupation, p.address_id " +
543+
"from Person p " +
544+
"where p.id = :p3"
545+
546+
assertThat(selectStatement.selectStatement).isEqualTo(expected)
547+
548+
val records = template.selectList(selectStatement) { rs, _ ->
549+
val record = PersonRecord()
550+
record.id = rs.getInt(1)
551+
record.firstName = rs.getString(2)
552+
record.lastName = rs.getString(3)
553+
record.birthDate = rs.getTimestamp(4)
554+
record.employed = rs.getString(5)
555+
record.occupation = rs.getString(6)
556+
record.addressId = rs.getInt(7)
557+
record
558+
}
559+
560+
assertThat(records).hasSize(3)
561+
with(records[0]!!) {
562+
assertThat(id).isEqualTo(1)
563+
assertThat(firstName).isEqualTo("Fred")
564+
assertThat(lastName).isEqualTo("Flintstone")
565+
assertThat(birthDate).isNotNull()
566+
assertThat(employed).isEqualTo("Yes")
567+
assertThat(occupation).isEqualTo("Brontosaurus Operator")
568+
assertThat(addressId).isEqualTo(1)
569+
}
570+
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+
509582
@Test
510583
fun testRawSelectWithJoin() {
511584
val selectStatement = select(

0 commit comments

Comments
 (0)