From af338b5dc16b746407d1938301201266fe771301 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sat, 1 Feb 2025 01:02:55 +0300 Subject: [PATCH] Unified query construction --- .../serdha0/api/module/CreateModuleScope.kt | 12 ++++----- .../db/serdha0/api/queries/DeleteQuery.kt | 15 ++++++++--- .../db/serdha0/api/queries/InsertQuery.kt | 15 ++++++++--- .../serdha0/api/queries/QueryConstructor.kt | 25 ------------------ .../db/serdha0/api/queries/SelectQuery.kt | 26 ++++++++++++++----- .../db/serdha0/api/queries/UpdateQuery.kt | 15 ++++++++--- .../db/serdha0/api/queries/_Query.kt | 24 +++++++++++++++++ 7 files changed, 85 insertions(+), 47 deletions(-) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/QueryConstructor.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/module/CreateModuleScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/module/CreateModuleScope.kt index 91ab658..a5e81b3 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/module/CreateModuleScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/module/CreateModuleScope.kt @@ -1,7 +1,7 @@ package ru.landgrafhomyak.db.serdha0.api.module import ru.landgrafhomyak.db.serdha0.api.table.Table -import ru.landgrafhomyak.db.serdha0.api.queries.QueryConstructor +import ru.landgrafhomyak.db.serdha0.api.queries._Query import ru.landgrafhomyak.db.serdha0.api.runtime.SynchronizedDatabase import ru.landgrafhomyak.db.serdha0.api.runtime.Transaction import ru.landgrafhomyak.db.serdha0.api.table.TableConstructor @@ -55,15 +55,15 @@ public interface CreateModuleScope { */ public fun createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableConstructor): Table - public val queries: QueryConstructor.Scope + public val queries: _Query.Constructor.Scope - public val temporarySubqueries: QueryConstructor.Scope + public val temporarySubqueries: _Query.Constructor.Scope - public val moduleConfiguringTemporaryQueries: QueryConstructor.Scope + public val moduleConfiguringTemporaryQueries: _Query.Constructor.Scope - public fun createQuery(creator: QueryConstructor): qUE + public fun createQuery(creator: _Query.Constructor): qUE - public fun createModuleConfiguringTemporaryQuery(creator: QueryConstructor): qUE + public fun createModuleConfiguringTemporaryQuery(creator: _Query.Constructor): qUE /** * Replaces [specified namespace][rootNs] with schema provided by [template]. diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/DeleteQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/DeleteQuery.kt index 7b1f792..36ae791 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/DeleteQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/DeleteQuery.kt @@ -10,7 +10,10 @@ import ru.landgrafhomyak.db.serdha0.api.table.Table public interface DeleteQuery : _Query { public interface SingleRow : DeleteQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow = + outQueries.deleteSingleRow(this) + public val targetTable: Table public fun createDeleteSingleRowWithReturning(context: Scope): qUE @@ -34,7 +37,10 @@ public interface DeleteQuery : _Query { } public interface FromSubquery : DeleteQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery = + outQueries.deleteFromSubquery(this) + public val targetTable: Table public val selector: _Selectable @@ -62,7 +68,10 @@ public interface DeleteQuery : _Query { } public interface MultipleRows : DeleteQuery, _Query.Table2Void { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows = + outQueries.deleteMultipleRows(this) + public val targetTable: Table public fun createMultipleRows(context: Scope): qUE diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/InsertQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/InsertQuery.kt index f10f380..d5eecb2 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/InsertQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/InsertQuery.kt @@ -28,7 +28,10 @@ public interface InsertQuery : _Query { public interface SingleRow : InsertQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow = + outQueries.insertSingleRow(this) + public val targetTable: Table public fun createInsertSingleRowWithReturning(context: Scope): qUE @@ -50,7 +53,10 @@ public interface InsertQuery : _Query { public interface FromSubquery : InsertQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery = + outQueries.insertFromSubquery(this) + public val targetTable: Table public val selector: _Selectable @@ -77,7 +83,10 @@ public interface InsertQuery : _Query { } public interface MultipleRows : InsertQuery, _Query.Table2Void { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows = + outQueries.insertMultipleRows(this) + public val targetTable: Table public fun createInsertMultipleRows(context: Scope): qUE diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/QueryConstructor.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/QueryConstructor.kt deleted file mode 100644 index 8a5926d..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/QueryConstructor.kt +++ /dev/null @@ -1,25 +0,0 @@ -package ru.landgrafhomyak.db.serdha0.api.queries - -import ru.landgrafhomyak.db.serdha0.api.misc._Selectable -import ru.landgrafhomyak.db.serdha0.api.table.Table - -public interface QueryConstructor { - public fun createQuery(internalQueries: Scope, outQueries: Scope): qUE - - public interface Scope { - public fun deleteSingleRow(table: Table, creator: DeleteQuery.SingleRow.Constructor): DeleteQuery.SingleRow - public fun deleteFromSubquery(table: Table, selector: _Selectable, creator: DeleteQuery.FromSubquery.Constructor): DeleteQuery.FromSubquery - public fun deleteMultipleRows(table: Table, creator: DeleteQuery.MultipleRows.Constructor): DeleteQuery.MultipleRows - - public fun insertSingleRow(table: Table, creator: InsertQuery.SingleRow.Constructor): InsertQuery.SingleRow - public fun insertFromSubquery(table: Table, selector: _Selectable, creator: InsertQuery.FromSubquery.Constructor): InsertQuery.FromSubquery - public fun insertMultipleRows(table: Table, creator: InsertQuery.MultipleRows.Constructor): InsertQuery.MultipleRows - - public fun select(table: _Selectable, creator: SelectQuery.Simple.Constructor): SelectQuery.Simple - public fun selectWithJoin(left: _Selectable, right: _Selectable, creator: SelectQuery.WithJoin.Constructor): SelectQuery.WithJoin - - public fun updateSingleRow(table: Table, creator: UpdateQuery.SingleRow.Constructor): UpdateQuery.SingleRow - public fun updateFromSubquery(table: Table, selector: _Selectable, creator: UpdateQuery.FromSubquery.Constructor): UpdateQuery.FromSubquery - public fun updateMultipleRows(table: Table, creator: UpdateQuery.MultipleRows.Constructor): UpdateQuery.MultipleRows - } -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/SelectQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/SelectQuery.kt index 82fc682..0c58827 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/SelectQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/SelectQuery.kt @@ -52,7 +52,10 @@ public interface SelectQuery : _Query { } public interface Simple : SelectQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Simple = + outQueries.select(this) + public val source: _Selectable public fun createSelect(context: Scope): qUE @@ -67,7 +70,10 @@ public interface SelectQuery : _Query { } public interface WithJoin : SelectQuery, _Query.Params2Table { - public interface Constructor : _CommonSelectCreatorScope { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): WithJoin = + outQueries.selectWithJoin(this) + public val left: _Selectable public val right: _Selectable public val joinType: JoinType @@ -76,7 +82,7 @@ public interface SelectQuery : _Query { public fun createSelectWithJoin(context: Scope): qUE - public interface Scope { + public interface Scope : _CommonSelectCreatorScope { public val lsqUExt: lsqUE public val rsqUExt: rsqUE @@ -90,8 +96,11 @@ public interface SelectQuery : _Query { } } - public interface Reduce : SelectQuery, _Query.Params2Table { - public interface Constructor { + public interface Reducing : SelectQuery, _Query.Params2Table { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Reducing = + outQueries.selectReducing(this) + public val source: _Selectable public fun createSelectWithReduce(context: Scope): qUE @@ -113,8 +122,11 @@ public interface SelectQuery : _Query { } } - public interface Fold : SelectQuery, _Query.Params2Table { - public interface Constructor { + public interface Folding : SelectQuery, _Query.Params2Table { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Folding = + outQueries.selectFolding(this) + public val source: _Selectable public fun createSelectWithFold(context: Scope): qUE diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/UpdateQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/UpdateQuery.kt index d049ff5..78665ca 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/UpdateQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/UpdateQuery.kt @@ -9,7 +9,10 @@ import ru.landgrafhomyak.db.serdha0.api.runtime.InputRow public interface UpdateQuery : _Query { public interface SingleRow : UpdateQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow = + outQueries.updateSingleRow(this) + public val targetTable: Table public fun createUpdateSingleWithReturning(context: Scope): qUE @@ -36,7 +39,10 @@ public interface UpdateQuery : _Query { } public interface FromSubquery : UpdateQuery, _Query.Params2Table { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery = + outQueries.updateFromSubquery(this) + public val targetTable: Table public val selector: _Selectable @@ -69,7 +75,10 @@ public interface UpdateQuery : _Query { } public interface MultipleRows : UpdateQuery, _Query.Table2Void { - public interface Constructor { + public interface Constructor : _Query.Constructor> { + override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows = + outQueries.updateMultipleRows(this) + public val targetTable: Table public fun createUpdateMultipleRows(context: Scope): qUE diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/_Query.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/_Query.kt index bd650ab..bc57560 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/_Query.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/serdha0/api/queries/_Query.kt @@ -11,4 +11,28 @@ public interface _Query { public interface Params2Void : _Query public interface Params2Table : _Query, _Selectable public interface Void2Table : _Query, _Selectable + + public interface Constructor { + public fun createQuery(internalQueries: Scope, outQueries: Scope): qUE + + public interface Scope { + + public fun select(constructor: SelectQuery.Simple.Constructor): SelectQuery.Simple + public fun selectWithJoin(constructor: SelectQuery.WithJoin.Constructor): SelectQuery.WithJoin + public fun selectReducing(constructor: SelectQuery.Reducing.Constructor): SelectQuery.Reducing + public fun selectFolding(constructor: SelectQuery.Folding.Constructor): SelectQuery.Folding + + public fun insertSingleRow(constructor: InsertQuery.SingleRow.Constructor): InsertQuery.SingleRow + public fun insertFromSubquery(constructor: InsertQuery.FromSubquery.Constructor): InsertQuery.FromSubquery + public fun insertMultipleRows(constructor: InsertQuery.MultipleRows.Constructor): InsertQuery.MultipleRows + + public fun updateSingleRow(constructor: UpdateQuery.SingleRow.Constructor): UpdateQuery.SingleRow + public fun updateFromSubquery(constructor: UpdateQuery.FromSubquery.Constructor): UpdateQuery.FromSubquery + public fun updateMultipleRows(constructor: UpdateQuery.MultipleRows.Constructor): UpdateQuery.MultipleRows + + public fun deleteSingleRow(constructor: DeleteQuery.SingleRow.Constructor): DeleteQuery.SingleRow + public fun deleteFromSubquery(constructor: DeleteQuery.FromSubquery.Constructor): DeleteQuery.FromSubquery + public fun deleteMultipleRows(constructor: DeleteQuery.MultipleRows.Constructor): DeleteQuery.MultipleRows + } + } } \ No newline at end of file