QueryAlias.get(original: Expression<T>) lose query's alias #633

This commit is contained in:
Tapac
2020-02-27 01:14:18 +03:00
parent f24107ae7e
commit 50848d672b
2 changed files with 41 additions and 6 deletions

View File

@@ -67,15 +67,17 @@ class QueryAlias(val query: Query, val alias: String): ColumnSet() {
override val columns: List<Column<*>>
get() = query.set.source.columns.filter { it in query.set.fields }.map { it.clone() }
private fun <T:Any?> Column<T>.clone() = Column<T>(table.alias(alias), name, columnType)
@Suppress("UNCHECKED_CAST")
operator fun <T : Any?> get(original: Column<T>): Column<T> =
query.set.source.columns.find { it == original }?.clone() as? Column<T>
?: error("Column not found in original table")
@Suppress("UNCHECKED_CAST")
operator fun <T: Any?> get(original: Column<T>): Column<T> = query.set.source.columns.find { it == original }?.
let { it.clone() as? Column<T> } ?: error("Column not found in original table")
@Suppress("UNCHECKED_CAST")
operator fun <T: Any?> get(original: Expression<T>): Expression<T> = (query.set.fields.find { it == original } as? ExpressionAlias<T>)?.aliasOnlyExpression()
operator fun <T : Any?> get(original: Expression<T>): Expression<T> {
val expressionAlias = query.set.fields.find { it == original } as? ExpressionAlias<T>
?: error("Field not found in original table fields")
return expressionAlias.delegate.alias("$alias.${expressionAlias.alias}").aliasOnlyExpression()
}
override fun join(otherTable: ColumnSet, joinType: JoinType, onColumn: Expression<*>?, otherColumn: Expression<*>?, additionalConstraint: (SqlExpressionBuilder.()->Op<Boolean>)? ) : Join =
Join (this, otherTable, joinType, onColumn, otherColumn, additionalConstraint)
@@ -89,6 +91,8 @@ class QueryAlias(val query: Query, val alias: String): ColumnSet() {
override infix fun fullJoin(otherTable: ColumnSet): Join = Join (this, otherTable, JoinType.FULL)
override infix fun crossJoin(otherTable: ColumnSet) : Join = Join (this, otherTable, JoinType.CROSS)
private fun <T:Any?> Column<T>.clone() = Column<T>(table.alias(alias), name, columnType)
}
fun <T:Table> T.alias(alias: String) = Alias(this, alias)

View File

@@ -110,4 +110,35 @@ class AliasesTests : DatabaseTestsBase() {
assertEquals(false, entityFromAlias.b1)
}
}
@Test
fun `test aliased expression with aliased query`() {
withTables(EntityTestsData.XTable) {
val dataToInsert = listOf(true, true, false, true)
EntityTestsData.XTable.batchInsert(dataToInsert) {
this[EntityTestsData.XTable.b1] = it
}
val aliasedExpression = EntityTestsData.XTable.id.max().alias("maxId")
val aliasedQuery = EntityTestsData.XTable.
slice(EntityTestsData.XTable.b1, aliasedExpression).
selectAll().
groupBy(EntityTestsData.XTable.b1).
alias("maxBoolean")
val aliasedBool = aliasedQuery[EntityTestsData.XTable.b1]
val expressionToCheck = aliasedQuery[aliasedExpression]
assertEquals("maxBoolean.maxId", expressionToCheck.toString())
val resultQuery = aliasedQuery.
leftJoin(EntityTestsData.XTable, { this[aliasedExpression]}, { id }).
slice(aliasedBool, expressionToCheck).
selectAll()
val result = resultQuery.map {
it[aliasedBool] to it[expressionToCheck]!!.value
}
assertEqualCollections(listOf(true to 4, false to 3), result)
}
}
}