From 06ae4b308ccb9d42105bdc82900a5bb0a1c161fd Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 26 Jan 2025 03:43:51 +0300 Subject: [PATCH] Embedding queries versions with returning as default, driver will optimize if there are no return calls; refactored to remove 'SelectedTable' and 'SelectedColumn' --- .../serdha/api/v0/misc/SelectedColumn.kt | 3 - .../serdha/api/v0/misc/SelectedTable.kt | 9 --- .../serdha/api/v0/queries/DeleteQuery.kt | 27 +++------ .../serdha/api/v0/queries/InsertQuery.kt | 60 +++++-------------- .../serdha/api/v0/queries/SelectQuery.kt | 35 +++++++---- .../serdha/api/v0/queries/UpdateQuery.kt | 38 +++++------- .../serdha/api/v0/runtime/ParametersSetter.kt | 5 ++ 7 files changed, 67 insertions(+), 110 deletions(-) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedTable.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt deleted file mode 100644 index 12c7069..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt +++ /dev/null @@ -1,3 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.misc - -public interface SelectedColumn, @Suppress("unused") OwnerTableUserExtension : Any, OwnerBuilderUserExtension : Any> : IntermediateColumn \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedTable.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedTable.kt deleted file mode 100644 index 4a4808b..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedTable.kt +++ /dev/null @@ -1,9 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.misc - -public interface SelectedTable { - public fun > selectColumn(column: Column): SelectedColumn - - public interface WithParamsRedirect : SelectedTable { - public fun > setParam(subqueryParam: QueryParam, parentParam: QueryParam) - } -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt index c3f9efe..bffe9e8 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt @@ -4,37 +4,26 @@ import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedColumn -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable +import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter import ru.landgrafhomyak.serdha.api.v0.table.Table @Suppress("RemoveRedundantQualifierName") -public interface DeleteQuery { +public interface DeleteQuery : _Selectable { public val userExtension: QueryUserExtension public interface Creator { - public fun createDelete(table: Table, creator: DeleteQuery.Creator.Scope): QueryUserExtension + public fun createDeleteWithReturning(table: Table, creator: DeleteQuery.Creator.Scope): QueryUserExtension public interface Scope { - public val selector: SelectedTable.WithParamsRedirect - - public var selectorColumn: SelectedColumn<*, DatabaseType.ROW_ID, SelectorTableUserExtension, QueryUserExtension> - public val types: DatabaseTypesProvider - public fun > param(name: String, type: DT): QueryParam - } - } - public interface WithReturning : DeleteQuery, _Selectable { - public interface Creator { - public fun createDelete(table: Table, creator: DeleteQuery.WithReturning.Creator.Scope): QueryUserExtension + public val selectorParams: ParametersSetter.WithRedirect + public var selectorColumn: Column<*, DatabaseType.ROW_ID, SelectorTableUserExtension> - public interface Scope : DeleteQuery.Creator.Scope { - public val removedValues: SelectedTable - - public fun > returnColumn(c: SelectedColumn): Column - } + public fun > returnFromSubquery(c: Column): Column + public fun > returnRemovedValue(c: Column): Column + public fun > returnParam(c: QueryParam): Column } } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt index c1f5c18..b014e98 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt @@ -5,8 +5,7 @@ import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedColumn -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable +import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex public interface InsertQuery { @@ -24,41 +23,25 @@ public interface InsertQuery { public val types: DatabaseTypesProvider public fun onConflictUpdate(u: UniqueIndex, c: (_UpsertClauseScope) -> Unit) - public fun onConflictThrow(u: UniqueIndex) - public fun onConflictSkip(u: UniqueIndex) } public interface SingleRow : InsertQuery { public interface Creator { - public fun createInsertSingleRow(table: Table, creator: Scope): QueryUserExtension + public fun createInsertSingleRowWithReturning(table: Table, creator: Scope): QueryUserExtension public interface Scope : _CommonInsertCreatorScope { public fun > queryParam(name: String, type: DT): QueryParam - public fun > insertConstant( - column: Column, - paramName: String = column.name, - ): QueryParam - - public fun > insertConstant( - column: Column, - param: QueryParam - ) - } - } - - public interface WithReturning : SingleRow, _Selectable { - public fun createInsertSingleRowWithReturning(table: Table, creator: Scope): QueryUserExtension - - public interface Scope : _CommonInsertCreatorScope { - public val valuesAfterInsert: SelectedTable + public fun > insertConstant(column: Column, paramName: String = column.name): QueryParam + public fun > insertConstant(column: Column, param: QueryParam) public fun onConflictReturnOnly(u: UniqueIndex) - public fun > returnColumn(c: SelectedColumn): Column + public fun > returnInsertedValue(c: Column): Column + public fun > returnParam(c: QueryParam): Column } } } @@ -66,36 +49,22 @@ public interface InsertQuery { public interface FromSubquery : InsertQuery { public interface Creator { - public fun createInsertFromQuery(table: Table, creator: Scope): QueryUserExtension + public fun createInsertSingleRowWithReturning(table: Table, creator: Scope): QueryUserExtension public interface Scope : _CommonInsertCreatorScope { public fun > queryParam(name: String, type: DT): QueryParam - public fun > insertConstant( - column: Column, - paramName: String = column.name, - ): QueryParam + public val sourceQueryParams: ParametersSetter.WithRedirect - public fun > insertConstant( - column: Column, - param: QueryParam - ) - - public val sourceValues: SelectedTable - - public fun > insertColumn(dst: Column, src: SelectedColumn) - } - } - - public interface WithReturning : FromSubquery, _Selectable { - public fun createInsertSingleRowWithReturning(table: Table, creator: Scope): QueryUserExtension - - public interface Scope : _CommonInsertCreatorScope { - public val valuesAfterInsert: SelectedTable + public fun > insertConstant(column: Column, paramName: String = column.name): QueryParam + public fun > insertConstant(column: Column, param: QueryParam) + public fun > insertFromSubquery(column: Column, subquery: QueryParam) public fun onConflictReturnOnly(u: UniqueIndex) - public fun > returnColumn(c: SelectedColumn): Column + public fun > returnFromSubquery(c: Column): Column + public fun > returnNewValue(c: Column): Column + public fun > returnParam(c: QueryParam): Column } } } @@ -107,6 +76,7 @@ public interface InsertQuery { public interface Scope : _CommonInsertCreatorScope { public fun > inputColumn(name: String, type: DT): QueryParam + public fun > insertColumn(dst: Column, name: String = dst.name) public fun > insertColumn(dst: Column, src: QueryParam) } } diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt index 5ed1417..4f679a7 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt @@ -3,8 +3,10 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType +import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.Expression -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable +import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam +import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter public interface SelectQuery : _Selectable { public val userExtension: QueryUserExtension @@ -15,28 +17,35 @@ public interface SelectQuery : _Selectable { - public fun where(expression: IntermediateColumn) - public fun orderBy(order: Order, vararg expression: IntermediateColumn<*, *, QueryUserExtension>) - - public var limit: UInt - - public var offset: ULong - - public fun > returnColumn(expr: IntermediateColumn): Column + public val types: DatabaseTypesProvider + public fun > queryParam(name: String, type: DT): QueryParam + public fun > paramAsColumn(param: QueryParam): IntermediateColumn public fun mapColumns( expression: Expression, input: Expression.InputLinker, output: Expression.OutputLinker ) + + public fun where(expression: IntermediateColumn) + public fun orderBy(order: Order, vararg expression: IntermediateColumn<*, *, QueryUserExtension>) + + public var limit: UInt + public var offset: ULong + + public fun > returnParam(expr: QueryParam): Column + public fun > returnColumn(expr: IntermediateColumn): Column } public interface JoinCreator : _CommonSelectCreatorScope { public fun createSelectWithJoin(creator: Scope): QueryUserExtension public interface Scope { - public val leftTable: SelectedTable - public val rightTable: SelectedTable + public val leftSubqueryParams: ParametersSetter.WithRedirect + public val rightSubqueryParams: ParametersSetter.WithRedirect + + public fun > selectColumnFromLeft(param: Column): IntermediateColumn + public fun > selectColumnFromRight(param: Column): IntermediateColumn } } @@ -44,7 +53,9 @@ public interface SelectQuery : _Selectable): QueryUserExtension public interface Scope : _CommonSelectCreatorScope { - public val selectedTable: TableUserExtension + public val subqueryParams: ParametersSetter.WithRedirect + + public fun > selectColumnFromSubquery(param: Column): IntermediateColumn } } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt index a67835a..e137a49 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt @@ -3,37 +3,31 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType +import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedColumn -import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable +import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter -@Suppress("RemoveRedundantQualifierName") -public interface UpdateQuery { +public interface UpdateQuery : _Selectable { public val userExtension: QueryUserExtension - public interface Creator { - public fun createUpdate(table: Table, creator: Scope): QueryUserWrapper + public interface Creator { + public fun createUpdateWithReturning(table: Table, creator: Scope): QueryUserExtension public interface Scope { - public val oldValues: SelectedTable - - public val selector: SelectedTable.WithParamsRedirect - - public var selectorColumn: SelectedColumn<*, DatabaseType.ROW_ID, SelectorTableUserExtension, QueryUserExtension> - - public fun > updateColumn(c: Column, e: SelectedColumn) - + public val types: DatabaseTypesProvider public fun > param(name: String, type: DT): QueryParam - } - } - public interface WithReturning : UpdateQuery, _Selectable { - public interface Creator { - public fun createDelete(table: Table, creator: UpdateQuery.WithReturning.Creator.Scope): QueryUserExtension + public val selectorParams: ParametersSetter.WithRedirect + public var selectorColumn: Column<*, DatabaseType.ROW_ID, SelectorTableUserExtension> - public interface Scope : UpdateQuery.Creator.Scope { - public fun > returnColumn(c: SelectedColumn): Column - } + public fun > updateColumnWithSubquery(c: Column, e: Column) + public fun > updateColumnWithOldValue(c: Column, e: Column) + public fun > updateColumnWithParam(c: Column, e: QueryParam) + + public fun > returnFromSubquery(c: Column): Column + public fun > returnOldValue(c: Column): Column + public fun > returnNewValue(c: Column): Column + public fun > returnParam(c: QueryParam): Column } } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt index 1c3184b..be0a9a1 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt @@ -1,5 +1,6 @@ package ru.landgrafhomyak.serdha.api.v0.runtime +import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam public interface ParametersSetter { @@ -15,4 +16,8 @@ public interface ParametersSetter { public operator fun set(c: QueryParam, value: ULong): Unit = this.set(c, value) public operator fun set(c: QueryParam, value: Char): Unit = this.set(c, value) public operator fun set(c: QueryParam, value: Boolean): Unit = this.set(c, value) + + public interface WithRedirect : ParametersSetter { + public fun > redirect(c: QueryParam, value: QueryParam) + } } \ No newline at end of file