From 50848d672b60581242003ff65ef9c078aa72f058 Mon Sep 17 00:00:00 2001 From: Tapac Date: Thu, 27 Feb 2020 01:14:18 +0300 Subject: [PATCH] QueryAlias.get(original: Expression) lose query's alias #633 --- .../kotlin/org/jetbrains/exposed/sql/Alias.kt | 16 ++++++---- .../exposed/sql/tests/shared/AliasesTests.kt | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Alias.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Alias.kt index e75849d7..75451eb2 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Alias.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Alias.kt @@ -67,15 +67,17 @@ class QueryAlias(val query: Query, val alias: String): ColumnSet() { override val columns: List> get() = query.set.source.columns.filter { it in query.set.fields }.map { it.clone() } - private fun Column.clone() = Column(table.alias(alias), name, columnType) + @Suppress("UNCHECKED_CAST") + operator fun get(original: Column): Column = + query.set.source.columns.find { it == original }?.clone() as? Column + ?: error("Column not found in original table") @Suppress("UNCHECKED_CAST") - operator fun get(original: Column): Column = query.set.source.columns.find { it == original }?. - let { it.clone() as? Column } ?: error("Column not found in original table") - - @Suppress("UNCHECKED_CAST") - operator fun get(original: Expression): Expression = (query.set.fields.find { it == original } as? ExpressionAlias)?.aliasOnlyExpression() + operator fun get(original: Expression): Expression { + val expressionAlias = query.set.fields.find { it == original } as? ExpressionAlias ?: 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)? ) : 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 Column.clone() = Column(table.alias(alias), name, columnType) } fun T.alias(alias: String) = Alias(this, alias) diff --git a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/AliasesTests.kt b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/AliasesTests.kt index cb0431fe..b4670490 100644 --- a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/AliasesTests.kt +++ b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/AliasesTests.kt @@ -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) + } + } } \ No newline at end of file