mirror of
https://github.com/jlengrand/Exposed.git
synced 2026-03-10 08:11:20 +00:00
QueryAlias.get(original: Expression<T>) lose query's alias #633
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user