Skip to content

Commit f07e504

Browse files
committed
Add support for table aliases in union queries
1 parent 70b2833 commit f07e504

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ class KotlinUnionFromGatherer(
4040
enhance(unionBuilder)
4141
return dsl
4242
}
43+
44+
fun from(
45+
table: SqlTable,
46+
alias: String,
47+
enhance: KotlinUnionQueryBuilder.() -> KotlinUnionQueryBuilder
48+
): QueryExpressionDSL<SelectModel> {
49+
val unionBuilder = KotlinUnionQueryBuilder(dsl.union().select(selectList).from(table, alias))
50+
enhance(unionBuilder)
51+
return dsl
52+
}
4353
}
4454

4555
class KotlinUnionQueryBuilder(private val dsl: QueryExpressionDSL<SelectModel>) :

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,89 @@ class CanonicalSpringKotlinTest {
421421
assertThat(occupation).isEqualTo("Brontosaurus Operator")
422422
assertThat(addressId).isEqualTo(1)
423423
}
424+
425+
with(records[2]!!) {
426+
assertThat(id).isEqualTo(3)
427+
assertThat(firstName).isEqualTo("Pebbles")
428+
assertThat(lastName).isEqualTo("Flintstone")
429+
assertThat(birthDate).isNotNull()
430+
assertThat(employed).isEqualTo("No")
431+
assertThat(occupation).isNull()
432+
assertThat(addressId).isEqualTo(1)
433+
}
434+
}
435+
436+
@Test
437+
fun testRawSelectWithUnionAndAlias() {
438+
val selectStatement = select(
439+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
440+
addressId
441+
).from(Person) {
442+
where(id, isEqualTo(1))
443+
union {
444+
select(
445+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
446+
addressId
447+
).from(Person) {
448+
where(id, isEqualTo(2))
449+
}
450+
}
451+
union {
452+
select(
453+
id.`as`("A_ID"), firstName, lastName, birthDate, employed, occupation,
454+
addressId
455+
).from(Person, "p") {
456+
where(id, isEqualTo(3))
457+
}
458+
}
459+
}
460+
461+
val expected = "select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
462+
"from Person " +
463+
"where id = :p1 " +
464+
"union " +
465+
"select id as A_ID, first_name, last_name, birth_date, employed, occupation, address_id " +
466+
"from Person " +
467+
"where id = :p2 " +
468+
"union " +
469+
"select p.id as A_ID, p.first_name, p.last_name, p.birth_date, p.employed, p.occupation, p.address_id " +
470+
"from Person p " +
471+
"where p.id = :p3"
472+
473+
assertThat(selectStatement.selectStatement).isEqualTo(expected)
474+
475+
val records = template.selectList(selectStatement) { rs, _ ->
476+
val record = PersonRecord()
477+
record.id = rs.getInt(1)
478+
record.firstName = rs.getString(2)
479+
record.lastName = rs.getString(3)
480+
record.birthDate = rs.getTimestamp(4)
481+
record.employed = rs.getString(5)
482+
record.occupation = rs.getString(6)
483+
record.addressId = rs.getInt(7)
484+
record
485+
}
486+
487+
assertThat(records).hasSize(3)
488+
with(records[0]!!) {
489+
assertThat(id).isEqualTo(1)
490+
assertThat(firstName).isEqualTo("Fred")
491+
assertThat(lastName).isEqualTo("Flintstone")
492+
assertThat(birthDate).isNotNull()
493+
assertThat(employed).isEqualTo("Yes")
494+
assertThat(occupation).isEqualTo("Brontosaurus Operator")
495+
assertThat(addressId).isEqualTo(1)
496+
}
497+
498+
with(records[2]!!) {
499+
assertThat(id).isEqualTo(3)
500+
assertThat(firstName).isEqualTo("Pebbles")
501+
assertThat(lastName).isEqualTo("Flintstone")
502+
assertThat(birthDate).isNotNull()
503+
assertThat(employed).isEqualTo("No")
504+
assertThat(occupation).isNull()
505+
assertThat(addressId).isEqualTo(1)
506+
}
424507
}
425508

426509
@Test

0 commit comments

Comments
 (0)