From beea2613254ad4f03c166245b1199a29d47e7120 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Fri, 31 Jan 2025 05:55:24 +0300 Subject: [PATCH] Join types & improvements in creating queries --- .../serdha/api/v0/module/CreateModuleScope.kt | 12 ++++++--- .../serdha/api/v0/queries/CreateQueryScope.kt | 22 ---------------- .../serdha/api/v0/queries/DeleteQuery.kt | 12 +++++++-- .../serdha/api/v0/queries/InsertQuery.kt | 7 +++++ .../serdha/api/v0/queries/QueryCreator.kt | 25 ++++++++++++++++++ .../serdha/api/v0/queries/SelectQuery.kt | 26 +++++++++++++++++-- .../serdha/api/v0/queries/UpdateQuery.kt | 10 +++++-- 7 files changed, 82 insertions(+), 32 deletions(-) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/CreateQueryScope.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/QueryCreator.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/module/CreateModuleScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/module/CreateModuleScope.kt index 61129a9..86e4e68 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/module/CreateModuleScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/module/CreateModuleScope.kt @@ -1,7 +1,7 @@ package ru.landgrafhomyak.serdha.api.v0.module import ru.landgrafhomyak.serdha.api.v0.table.Table -import ru.landgrafhomyak.serdha.api.v0.queries.CreateQueryScope +import ru.landgrafhomyak.serdha.api.v0.queries.QueryCreator import ru.landgrafhomyak.serdha.api.v0.runtime.SynchronizedDatabase import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction import ru.landgrafhomyak.serdha.api.v0.table.CreateTableScope @@ -80,11 +80,15 @@ public interface CreateModuleScope { */ public fun createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableCreator): Table - public val queries: CreateQueryScope + public val queries: QueryCreator.Scope - public val temporarySubqueries: CreateQueryScope + public val temporarySubqueries: QueryCreator.Scope - public val moduleConfiguringTemporaryQueries: CreateQueryScope + public val moduleConfiguringTemporaryQueries: QueryCreator.Scope + + public fun createQuery(creator: QueryCreator): qUE + + public fun createModuleConfiguringTemporaryQuery(creator: QueryCreator): qUE /** * Replaces [specified namespace][rootNs] with schema provided by [template]. diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/CreateQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/CreateQueryScope.kt deleted file mode 100644 index 8899059..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/CreateQueryScope.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.queries - -import ru.landgrafhomyak.serdha.api.v0.misc._Selectable -import ru.landgrafhomyak.serdha.api.v0.table.Table - -public interface CreateQueryScope { - public fun deleteSingleRow(table: Table, creator: DeleteQuery.SingleRow.Creator): DeleteQuery.SingleRow - public fun deleteFromSubquery(table: Table, selector: _Selectable, creator: DeleteQuery.FromSubquery.Creator): DeleteQuery.FromSubquery - public fun deleteMultipleRows(table: Table, creator: DeleteQuery.MultipleRows.Creator): DeleteQuery.MultipleRows - - public fun insertSingleRow(table: Table, creator: InsertQuery.SingleRow.Creator): InsertQuery.SingleRow - public fun insertFromSubquery(table: Table, selector: _Selectable, creator: InsertQuery.FromSubquery.Creator): InsertQuery.FromSubquery - public fun insertMultipleRows(table: Table, creator: InsertQuery.MultipleRows.Creator): InsertQuery.MultipleRows - - public fun select(table: _Selectable, creator: SelectQuery.FromSubquery.Creator): SelectQuery.FromSubquery - public fun selectWithJoin(left: _Selectable, right: _Selectable, creator: SelectQuery.WithJoin.Creator): SelectQuery.WithJoin - - public fun updateSingleRow(table: Table, creator: UpdateQuery.SingleRow.Creator): UpdateQuery.SingleRow - public fun updateFromSubquery(table: Table, selector: _Selectable, creator: UpdateQuery.FromSubquery.Creator): UpdateQuery.FromSubquery - public fun updateMultipleRows(table: Table, creator: UpdateQuery.MultipleRows.Creator): UpdateQuery.MultipleRows - -} \ 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 3226aee..ced0249 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 @@ -3,6 +3,7 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam +import ru.landgrafhomyak.serdha.api.v0.misc._Selectable import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.table.RowId import ru.landgrafhomyak.serdha.api.v0.table.Table @@ -10,6 +11,8 @@ import ru.landgrafhomyak.serdha.api.v0.table.Table public interface DeleteQuery : _Query { public interface SingleRow : DeleteQuery, _Query.Params2Table { public interface Creator { + public val targetTable: Table + public fun createDeleteSingleRowWithReturning(creator: Scope): qUE public interface Scope { @@ -32,6 +35,9 @@ public interface DeleteQuery : _Query { public interface FromSubquery : DeleteQuery, _Query.Params2Table { public interface Creator { + public val targetTable: Table + public val selector: _Selectable + public fun createDeleteFromSubqueryWithReturning(creator: Scope): qUE public interface Scope { @@ -56,8 +62,10 @@ public interface DeleteQuery : _Query { } public interface MultipleRows : DeleteQuery, _Query.Table2Void { - public interface Creator { - public fun createMultipleRows(creator: Scope): qUE + public interface Creator { + public val targetTable: Table + + public fun createMultipleRows(creator: Scope): qUE public interface Scope { public val tt: Table 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 2323828..5775dfc 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 @@ -4,6 +4,7 @@ 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.QueryParam +import ru.landgrafhomyak.serdha.api.v0.misc._Selectable import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex @@ -28,6 +29,8 @@ public interface InsertQuery : _Query { public interface SingleRow : InsertQuery, _Query.Params2Table { public interface Creator { + public val targetTable: Table + public fun createInsertSingleRowWithReturning(creator: Scope): qUE public interface Scope : _CommonInsertCreatorScope { @@ -48,6 +51,9 @@ public interface InsertQuery : _Query { public interface FromSubquery : InsertQuery, _Query.Params2Table { public interface Creator { + public val targetTable: Table + public val selector: _Selectable + public fun createInsertSingleRowWithReturning(creator: Scope): qUE public interface Scope : _CommonInsertCreatorScope { @@ -72,6 +78,7 @@ public interface InsertQuery : _Query { public interface MultipleRows : InsertQuery, _Query.Table2Void { public interface Creator { + public val targetTable: Table public fun createInsertMultipleRows(creator: Scope): qUE public interface Scope : _CommonInsertCreatorScope { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/QueryCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/QueryCreator.kt new file mode 100644 index 0000000..c3e8454 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/QueryCreator.kt @@ -0,0 +1,25 @@ +package ru.landgrafhomyak.serdha.api.v0.queries + +import ru.landgrafhomyak.serdha.api.v0.misc._Selectable +import ru.landgrafhomyak.serdha.api.v0.table.Table + +public interface QueryCreator { + public fun createQuery(internalQueries: Scope, outQueries: Scope): qUE + + public interface Scope { + public fun deleteSingleRow(table: Table, creator: DeleteQuery.SingleRow.Creator): DeleteQuery.SingleRow + public fun deleteFromSubquery(table: Table, selector: _Selectable, creator: DeleteQuery.FromSubquery.Creator): DeleteQuery.FromSubquery + public fun deleteMultipleRows(table: Table, creator: DeleteQuery.MultipleRows.Creator): DeleteQuery.MultipleRows + + public fun insertSingleRow(table: Table, creator: InsertQuery.SingleRow.Creator): InsertQuery.SingleRow + public fun insertFromSubquery(table: Table, selector: _Selectable, creator: InsertQuery.FromSubquery.Creator): InsertQuery.FromSubquery + public fun insertMultipleRows(table: Table, creator: InsertQuery.MultipleRows.Creator): InsertQuery.MultipleRows + + public fun select(table: _Selectable, creator: SelectQuery.FromTable.Creator): SelectQuery.FromTable + public fun selectWithJoin(left: _Selectable, right: _Selectable, creator: SelectQuery.WithJoin.Creator): SelectQuery.WithJoin + + public fun updateSingleRow(table: Table, creator: UpdateQuery.SingleRow.Creator): UpdateQuery.SingleRow + public fun updateFromSubquery(table: Table, selector: _Selectable, creator: UpdateQuery.FromSubquery.Creator): UpdateQuery.FromSubquery + public fun updateMultipleRows(table: Table, creator: UpdateQuery.MultipleRows.Creator): UpdateQuery.MultipleRows + } +} \ No newline at end of file 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 e74d30f..7588886 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 @@ -7,6 +7,7 @@ import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.FiltersScope import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam +import ru.landgrafhomyak.serdha.api.v0.misc._Selectable import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow public interface SelectQuery : _Query { @@ -14,6 +15,19 @@ public interface SelectQuery : _Query { ASC, DESC } + public class JoinType( + public val leftNull: LeftNull, + public val join: Join + ) { + public enum class LeftNull { + AS_ID, SKIP, JOIN_TO_NULL + } + + public enum class Join { + LEFT_TO_FIRST_RIGHT, LEFT_FOR_EACH_RIGHT, LEFT_FOR_EACH_RIGHT_OR_NULL, + } + } + @Suppress("ClassName") public interface _CommonSelectCreatorScope { public val types: DatabaseType.Provider @@ -39,6 +53,12 @@ public interface SelectQuery : _Query { public interface WithJoin : SelectQuery, _Query.Params2Table { public interface Creator : _CommonSelectCreatorScope { + public val left: _Selectable + public val right: _Selectable + public val joinType: JoinType + public val referenceColumn: Column<*, *, lsqUE> + public val targetColumn: Column<*, *, rsqUE> + public fun createSelectWithJoin(creator: Scope): qUE public interface Scope { @@ -50,17 +70,19 @@ public interface SelectQuery : _Query { public fun > selectColumnFromLeft(column: Column): IntermediateColumn public fun > selectColumnFromRight(column: Column): IntermediateColumn + public fun > selectColumnFromRightAsNullable(column: Column): IntermediateColumn, qUE> } } } - public interface FromSubquery : SelectQuery, _Query.Params2Table { + public interface FromTable : SelectQuery, _Query.Params2Table { public interface Creator { - public val tUExt: tUE + public val table: _Selectable public fun createSelect(creator: Scope): qUE public interface Scope : _CommonSelectCreatorScope { + public val tUExt: tUE public val subqueryParams: InputRow.WithRedirect public fun > selectColumnFromSubquery(param: Column): IntermediateColumn 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 591619c..0041aa2 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 @@ -4,12 +4,14 @@ 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.QueryParam +import ru.landgrafhomyak.serdha.api.v0.misc._Selectable import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow public interface UpdateQuery : _Query { public interface SingleRow : UpdateQuery, _Query.Params2Table { - public interface Creator { - public fun createUpdateSingleWithReturning(table: Table, creator: Scope): qUE + public interface Creator { + public val targetTable: Table + public fun createUpdateSingleWithReturning(table: Table, creator: Scope): qUE public interface Scope { public val tt: Table @@ -35,6 +37,9 @@ public interface UpdateQuery : _Query { public interface FromSubquery : UpdateQuery, _Query.Params2Table { public interface Creator { + public val targetTable: Table + public val selector: _Selectable + public fun createUpdateFromSubqueryWithReturning(creator: Scope): qUE public interface Scope { @@ -65,6 +70,7 @@ public interface UpdateQuery : _Query { public interface MultipleRows : UpdateQuery, _Query.Table2Void { public interface Creator { + public val targetTable: Table public fun createUpdateMultipleRows(creator: Scope): qUE public interface Scope {