From a2c89cc91d0300fa4f354bd8873a3047d1f8afa9 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 5 Jan 2025 19:54:30 +0300 Subject: [PATCH] Reorganizing DML creators interfaces --- .../api/v0/ddl/module/CreateModuleScope.kt | 134 ++---------------- .../serdha/api/v0/dml/CopyQuery.kt | 35 +++++ .../serdha/api/v0/dml/CreateCopyQueryScope.kt | 9 -- .../api/v0/dml/CreateDeleteQueryScope.kt | 14 -- .../api/v0/dml/CreateInsertQueryScope.kt | 20 --- .../api/v0/dml/CreateSelectQueryScope.kt | 13 -- .../api/v0/dml/CreateUpdateQueryScope.kt | 22 --- .../serdha/api/v0/dml/DeleteQuery.kt | 40 ++++++ .../serdha/api/v0/dml/InsertQuery.kt | 46 ++++++ .../serdha/api/v0/dml/SelectQuery.kt | 38 ++++- .../serdha/api/v0/dml/UpdateQuery.kt | 48 +++++++ .../api/v0/dml/_CommonCreateQueryScope.kt | 6 +- .../api/v0/runtime/SynchronizedDatabase.kt | 4 +- .../serdha/api/v0/runtime/Transaction.kt | 4 +- .../api/v0/runtime/transaction_methods.kt | 21 ++- 15 files changed, 232 insertions(+), 222 deletions(-) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateCopyQueryScope.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateDeleteQueryScope.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateInsertQueryScope.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateSelectQueryScope.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateUpdateQueryScope.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/CreateModuleScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/CreateModuleScope.kt index c3b578c..efa1592 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/CreateModuleScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/CreateModuleScope.kt @@ -2,8 +2,6 @@ package ru.landgrafhomyak.serdha.api.v0.ddl.module import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table import ru.landgrafhomyak.serdha.api.v0.dml.CopyQuery -import ru.landgrafhomyak.serdha.api.v0.dml.CreateCopyQueryScope -import ru.landgrafhomyak.serdha.api.v0.dml.CreateInsertQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.DeleteQuery import ru.landgrafhomyak.serdha.api.v0.dml.InsertQuery import ru.landgrafhomyak.serdha.api.v0.dml.SelectQuery @@ -49,7 +47,7 @@ public interface CreateModuleScope { * Creates table in [specified namespace][namespace] with [specified name][name] and stores it in the database. * If table was created by previous synchronizations, asserts that table at the specified path in the database is same as table provided by [initializer]. * - * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] this table must be [kept][UpgradeModuleScope.upgradeTable] (or [renamed][CreateModuleScope.renameTable]) or [deleted][CreateModuleScope.deleteTable]. + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] this table must be [kept][UpgradeModuleScope.upgradeTable] (or [renamed][UpgradeModuleScope.renameTable]) or [deleted][UpgradeModuleScope.deleteTable]. * * @param TableUserExtension User's type for containing table-related descriptors. * @param namespace Way to group tables if there is a lot. @@ -85,26 +83,6 @@ public interface CreateModuleScope { */ public fun createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableCreator): Table - /** - * Functional interface for creating 'SELECT' query. - * - * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. - * - * @param QueryUserWrapper User's type with descriptors related to query. - * - * @see CreateModuleScope.createSelectQuery - */ - public interface SelectQueryCreator { - /** - * Scope method that uses [creator] to create a query. - * - * @param creator Object with descriptor providers and factories. - * @return User's object with query-related descriptors for future access. - * - * @see CreateModuleScope.createSelectQuery - */ - public fun createSelect(creator: ru.landgrafhomyak.serdha.api.v0.dml.CreateSelectQueryScope): QueryUserWrapper - } /** * Creates 'SELECT' query. @@ -117,7 +95,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createTemporarySelectQuery */ - public fun createSelectQuery(initializer: SelectQueryCreator): SelectQuery + public fun createSelectQuery(initializer: SelectQuery.Creator): SelectQuery /** * Creates 'SELECT' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpgrade]. @@ -131,30 +109,8 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createSelectQuery */ - public fun createTemporarySelectQuery(initializer: SelectQueryCreator): SelectQuery + public fun createTemporarySelectQuery(initializer: SelectQuery.Creator): SelectQuery - /** - * Functional interface for creating 'INSERT ... VALUES' query. - * - * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. - * - * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. - * @param QueryUserWrapper User's type with descriptors related to query. - * - * @see CreateModuleScope.createInsertQuery - */ - public interface InsertQueryCreator { - /** - * Scope method that uses [creator] to create a query. - * - * @param table Descriptor of table to which values will be inserted. - * @param creator Object with descriptor providers and factories. - * @return User's object with query-related descriptors for future access. - * - * @see CreateModuleScope.createInsertQuery - */ - public fun createInsert(table: Table, creator: CreateInsertQueryScope): QueryUserWrapper - } /** * Creates 'INSERT ... VALUES' query. @@ -168,7 +124,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createTemporaryInsertQuery */ - public fun createInsertQuery(table: Table, initializer: InsertQueryCreator): InsertQuery + public fun createInsertQuery(table: Table, initializer: InsertQuery.Creator): InsertQuery /** * Creates 'INSERT ... VALUES' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpgrade]. @@ -183,30 +139,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createInsertQuery */ - public fun createTemporaryInsertQuery(table: Table, initializer: InsertQueryCreator): InsertQuery - - /** - * Functional interface for creating 'INSERT ... FROM' query. - * - * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. - * - * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. - * @param QueryUserWrapper User's type with descriptors related to query. - * - * @see CreateModuleScope.createCopyQuery - */ - public interface CopyQueryCreator { - /** - * Scope method that uses [creator] to create a query. - * - * @param table Descriptor of table to which values will be inserted. - * @param creator Object with descriptor providers and factories. - * @return User's object with query-related descriptors for future access. - * - * @see CreateModuleScope.createCopyQuery - */ - public fun createCopy(table: Table, creator: CreateCopyQueryScope): QueryUserWrapper - } + public fun createTemporaryInsertQuery(table: Table, initializer: InsertQuery.Creator): InsertQuery /** * Creates 'INSERT ... FROM' query. @@ -219,7 +152,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createTemporaryCopyQuery */ - public fun createCopyQuery(table: Table, initializer: CopyQueryCreator): CopyQuery + public fun createCopyQuery(table: Table, initializer: CopyQuery.Creator): CopyQuery /** * Creates 'INSERT ... FROM' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpgrade]. @@ -233,30 +166,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createCopyQuery */ - public fun createTemporaryCopyQuery(table: Table, initializer: CopyQueryCreator): CopyQuery - - /** - * Functional interface for creating 'UPDATE' query. - * - * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. - * - * @param TableUserExtension User's type with descriptors related to table, whose rows will be updated. - * @param QueryUserWrapper User's type with descriptors related to query. - * - * @see CreateModuleScope.createUpdateQuery - */ - public interface UpdateQueryCreator { - /** - * Scope method that uses [creator] to create a query. - * - * @param table Descriptor of table which rows will be updated. - * @param creator Object with descriptor providers and factories. - * @return User's object with query-related descriptors for future access. - * - * @see CreateModuleScope.createUpdateQuery - */ - public fun createUpdate(table: Table, creator: ru.landgrafhomyak.serdha.api.v0.dml.CreateUpdateQueryScope): QueryUserWrapper - } + public fun createTemporaryCopyQuery(table: Table, initializer: CopyQuery.Creator): CopyQuery /** * Creates 'UPDATE' query. @@ -269,7 +179,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createTemporaryUpdateQuery */ - public fun createUpdateQuery(table: Table, initializer: UpdateQueryCreator): UpdateQuery + public fun createUpdateQuery(table: Table, initializer: UpdateQuery.Creator): UpdateQuery /** * Creates 'UPDATE' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpgrade]. @@ -283,30 +193,8 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createUpdateQuery */ - public fun createTemporaryUpdateQuery(table: Table, initializer: UpdateQueryCreator): UpdateQuery + public fun createTemporaryUpdateQuery(table: Table, initializer: UpdateQuery.Creator): UpdateQuery - /** - * Functional interface for creating 'DELETE' query. - * - * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. - * - * @param TableUserExtension User's type with descriptors related to table from which data will be deleted. - * @param QueryUserWrapper User's type with descriptors related to query. - * - * @see CreateModuleScope.createDeleteQuery - */ - public interface DeleteQueryCreator { - /** - * Scope method that uses [creator] to create a query. - * - * @param table Descriptor of table from which data will be deleted. - * @param creator Object with descriptor providers and factories. - * @return User's object with query-related descriptors for future access. - * - * @see CreateModuleScope.createDeleteQuery - */ - public fun createDelete(table: Table, creator: ru.landgrafhomyak.serdha.api.v0.dml.CreateDeleteQueryScope): QueryUserWrapper - } /** * Creates 'DELETE' query. @@ -319,7 +207,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createTemporaryDeleteQuery */ - public fun createDeleteQuery(table: Table, initializer: DeleteQueryCreator): DeleteQuery + public fun createDeleteQuery(table: Table, initializer: DeleteQuery.Creator): DeleteQuery /** * Creates 'DELETE' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpgrade]. @@ -333,7 +221,7 @@ public interface CreateModuleScope { * * @see CreateModuleScope.createDeleteQuery */ - public fun createTemporaryDeleteQuery(table: Table, initializer: DeleteQueryCreator): DeleteQuery + public fun createTemporaryDeleteQuery(table: Table, initializer: DeleteQuery.Creator): DeleteQuery /** * Replaces [specified namespace][rootNs] with schema provided by [template]. diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CopyQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CopyQuery.kt index 94e49b2..9329125 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CopyQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CopyQuery.kt @@ -1,5 +1,40 @@ package ru.landgrafhomyak.serdha.api.v0.dml +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.module.CreateModuleScope +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table +import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType + public interface CopyQuery { public val userExtension: QueryUserExtension + + /** + * Functional interface for creating 'INSERT ... FROM' query. + * + * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. + * + * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. + * @param QueryUserWrapper User's type with descriptors related to query. + * + * @see CreateModuleScope.createCopyQuery + * @see CreateModuleScope.createTemporaryCopyQuery + */ + public interface Creator { + /** + * Scope method that uses [creator] to create a query. + * + * @param table Descriptor of table to which values will be inserted. + * @param creator Object with descriptor providers and factories. + * @return User's object with query-related descriptors for future access. + * + * @see CreateModuleScope.createCopyQuery + * @see CreateModuleScope.createTemporaryCopyQuery + */ + public fun createCopy(table: Table, creator: Scope): QueryUserWrapper + + public interface Scope :_CreateInsertOrCopyQueryScope { + public fun > insert(column: Column, expression: Expression) + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateCopyQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateCopyQueryScope.kt deleted file mode 100644 index 7ea3bf6..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateCopyQueryScope.kt +++ /dev/null @@ -1,9 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.dml - -import ru.landgrafhomyak.serdha.api.v0.Expression -import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column -import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType - -public interface CreateCopyQueryScope :_CreateInsertOrCopyQueryScope { - public fun > insert(column: Column, expression: Expression) -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateDeleteQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateDeleteQueryScope.kt deleted file mode 100644 index 9143081..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateDeleteQueryScope.kt +++ /dev/null @@ -1,14 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.dml - -import ru.landgrafhomyak.serdha.api.v0.Expression -import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType - -public interface CreateDeleteQueryScope : _CommonCreateQueryScope { - public val targetTable: SelectedTable - - public fun where(expression: Expression) - - public fun limit(size: UInt) - - public val returning: _CommonCreateQueryScope._ReturningClauseScope -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateInsertQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateInsertQueryScope.kt deleted file mode 100644 index 12e718c..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateInsertQueryScope.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.dml - -import ru.landgrafhomyak.serdha.api.v0.Expression -import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column -import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType - -public interface CreateInsertQueryScope : _CreateInsertOrCopyQueryScope { - public class DataParam<@Suppress("unused") QueryUserExtension : Any> private constructor() - - public val dataExpressionBuilder: Expression.Builder> - - public fun > dataParam(name: String, type: DT): InputParam> - - public fun > insertParam( - column: Column, - paramName: String = column.name, - ): InputParam> - - public fun > insert(column: Column, expression: Expression>) -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateSelectQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateSelectQueryScope.kt deleted file mode 100644 index b1d6c1f..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateSelectQueryScope.kt +++ /dev/null @@ -1,13 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.dml - -import ru.landgrafhomyak.serdha.api.v0.Expression -import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType - -public interface CreateSelectQueryScope : _CommonCreateQueryScope, _CommonCreateQueryScope._ReturningClauseScope{ - public fun where(expression: Expression) - - public fun limit(size: UInt) - - @Suppress("SpellCheckingInspection") - public fun offsetedLimit(offset: ULong, size: UInt) -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateUpdateQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateUpdateQueryScope.kt deleted file mode 100644 index aa046f2..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/CreateUpdateQueryScope.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.dml - -import ru.landgrafhomyak.serdha.api.v0.Expression -import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column -import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType - -public interface CreateUpdateQueryScope : _CommonCreateQueryScope { - public val targetTable: SelectedTable - - public fun > selectOldColumnValue(c: Column): Expression - - public fun > updateColumn(c: Column, e: Expression) - - public fun where(expression: Expression) - - public fun limit(size: UInt) - - @Suppress("SpellCheckingInspection") - public fun offsetedLimit(offset: ULong, size: UInt) - - public val returning: _CommonCreateQueryScope._ReturningClauseScope -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteQuery.kt index 983c0e0..8c87bcc 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteQuery.kt @@ -1,5 +1,45 @@ package ru.landgrafhomyak.serdha.api.v0.dml +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.module.CreateModuleScope +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table +import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType + public interface DeleteQuery : _CommonCreateQueryScope.CanBeSubquery { public val userExtension: QueryUserExtension + + /** + * Functional interface for creating 'DELETE' query. + * + * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. + * + * @param TableUserExtension User's type with descriptors related to table from which data will be deleted. + * @param QueryUserWrapper User's type with descriptors related to query. + * + * @see CreateModuleScope.createDeleteQuery + * @see CreateModuleScope.createTemporaryDeleteQuery + */ + public interface Creator { + /** + * Scope method that uses [creator] to create a query. + * + * @param table Descriptor of table from which data will be deleted. + * @param creator Object with descriptor providers and factories. + * @return User's object with query-related descriptors for future access. + * + * @see CreateModuleScope.createDeleteQuery + * @see CreateModuleScope.createTemporaryDeleteQuery + */ + public fun createDelete(table: Table, creator: Scope): QueryUserWrapper + + public interface Scope : _CommonCreateQueryScope { + public val targetTable: SelectedTable + + public fun where(expression: Expression) + + public fun limit(size: UInt) + + public val returning: _CommonCreateQueryScope._ReturningClauseScope + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertQuery.kt index 2ee4a27..cbc2ffa 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertQuery.kt @@ -1,5 +1,51 @@ package ru.landgrafhomyak.serdha.api.v0.dml +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.module.CreateModuleScope +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table +import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType + public interface InsertQuery { public val userExtension: QueryUserExtension + + /** + * Functional interface for creating 'INSERT ... VALUES' query. + * + * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. + * + * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. + * @param QueryUserWrapper User's type with descriptors related to query. + * + * @see CreateModuleScope.createInsertQuery + * @see CreateModuleScope.createTemporaryInsertQuery + */ + public interface Creator { + /** + * Scope method that uses [creator] to create a query. + * + * @param table Descriptor of table to which values will be inserted. + * @param creator Object with descriptor providers and factories. + * @return User's object with query-related descriptors for future access. + * + * @see CreateModuleScope.createInsertQuery + * @see CreateModuleScope.createTemporaryInsertQuery + */ + public fun createInsert(table: Table, creator: Scope): QueryUserWrapper + + public interface Scope : _CreateInsertOrCopyQueryScope { + public class DataParam<@Suppress("unused") QueryUserExtension : Any> private constructor() + + public val dataExpressionBuilder: Expression.Builder> + + public fun > dataParam(name: String, type: DT): InputParam> + + public fun > insertParam( + column: Column, + paramName: String = column.name, + ): InputParam> + + public fun > insert(column: Column, expression: Expression>) + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectQuery.kt index e23072f..4f5672b 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectQuery.kt @@ -1,9 +1,45 @@ package ru.landgrafhomyak.serdha.api.v0.dml -public interface SelectQuery: _CommonCreateQueryScope.CanBeSubquery { +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType +import ru.landgrafhomyak.serdha.api.v0.ddl.module.CreateModuleScope + +public interface SelectQuery : _CommonCreateQueryScope.CanBeSubquery { public val userExtension: QueryUserExtension public enum class Order { ASC, DESC } + + /** + * Functional interface for creating 'SELECT' query. + * + * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. + * + * @param QueryUserWrapper User's type with descriptors related to query. + * + * @see CreateModuleScope.createSelectQuery + * @see CreateModuleScope.createTemporarySelectQuery + */ + public interface Creator { + /** + * Scope method that uses [creator] to create a query. + * + * @param creator Object with descriptor providers and factories. + * @return User's object with query-related descriptors for future access. + * + * @see CreateModuleScope.createSelectQuery + * @see CreateModuleScope.createTemporarySelectQuery + */ + public fun createSelect(creator: Scope): QueryUserWrapper + + public interface Scope : _CommonCreateQueryScope, _CommonCreateQueryScope._ReturningClauseScope { + public fun where(expression: Expression) + + public fun limit(size: UInt) + + @Suppress("SpellCheckingInspection") + public fun offsetedLimit(offset: ULong, size: UInt) + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateQuery.kt index f8c9b49..44d69a1 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateQuery.kt @@ -1,5 +1,53 @@ package ru.landgrafhomyak.serdha.api.v0.dml +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.module.CreateModuleScope +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table +import ru.landgrafhomyak.serdha.api.v0.ddl.types.DatabaseType + public interface UpdateQuery : _CommonCreateQueryScope.CanBeSubquery { public val userExtension: QueryUserExtension + + /** + * Functional interface for creating 'UPDATE' query. + * + * Can be implemented like a companion object that just calls [QueryUserWrapper]'s constructor with the same or similar signature. + * + * @param TableUserExtension User's type with descriptors related to table, whose rows will be updated. + * @param QueryUserWrapper User's type with descriptors related to query. + * + * @see CreateModuleScope.createUpdateQuery + * @see CreateModuleScope.createTemporaryUpdateQuery + */ + public interface Creator { + /** + * Scope method that uses [creator] to create a query. + * + * @param table Descriptor of table which rows will be updated. + * @param creator Object with descriptor providers and factories. + * @return User's object with query-related descriptors for future access. + * + * @see CreateModuleScope.createUpdateQuery + * @see CreateModuleScope.createTemporaryUpdateQuery + */ + public fun createUpdate(table: Table, creator: Scope): QueryUserWrapper + + public interface Scope : _CommonCreateQueryScope { + public val targetTable: SelectedTable + + public fun > selectOldColumnValue(c: Column): Expression + + public fun > updateColumn(c: Column, e: Expression) + + public fun where(expression: Expression) + + public fun limit(size: UInt) + + @Suppress("SpellCheckingInspection") + public fun offsetedLimit(offset: ULong, size: UInt) + + public val returning: _CommonCreateQueryScope._ReturningClauseScope + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonCreateQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonCreateQueryScope.kt index 20679fd..0507846 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonCreateQueryScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonCreateQueryScope.kt @@ -35,14 +35,14 @@ public interface _CommonCreateQueryScope { public fun _selectCopy( q: CopyQuery, p: (SubqueryParametersSetter) -> Unit, - r: (_ParametersSetter._Multi, Nothing>) -> Unit + r: (_ParametersSetter._Multi, Nothing>) -> Unit ): SelectedDiff @OptIn(LowLevelApi::class) public fun selectCopyOne( q: CopyQuery, p: (SubqueryParametersSetter) -> Unit, - r: (ParametersSetter>) -> Unit + r: (ParametersSetter>) -> Unit ): SelectedDiff = this._selectCopy(q, p, r) @@ -51,7 +51,7 @@ public interface _CommonCreateQueryScope { q: CopyQuery, p: (SubqueryParametersSetter) -> Unit, data: Iterable, - r: (T, ParametersSetter>) -> Unit + r: (T, ParametersSetter>) -> Unit ): SelectedDiff = this._selectCopy(q, p) { rr -> for (e in data) r(e, rr) } diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt index 69ec18b..f24de2e 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt @@ -5,10 +5,8 @@ import ru.landgrafhomyak.serdha.api.v0.ddl.module.Module import ru.landgrafhomyak.serdha.api.v0.ddl.types.RowId import ru.landgrafhomyak.serdha.api.v0.ddl.table.Table import ru.landgrafhomyak.serdha.api.v0.dml.CopyQuery -import ru.landgrafhomyak.serdha.api.v0.dml.CreateInsertQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.DeleteQuery import ru.landgrafhomyak.serdha.api.v0.dml.InsertQuery -import ru.landgrafhomyak.serdha.api.v0.dml._CreateInsertOrCopyQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.SelectQuery import ru.landgrafhomyak.serdha.api.v0.dml.UpdateQuery @@ -23,7 +21,7 @@ public interface SynchronizedDatabase : Module _autoTransactedInsert(query: InsertQuery): _ParametersSetter, _ResultSet>?>> + public suspend fun _autoTransactedInsert(query: InsertQuery): _ParametersSetter, _ResultSet>?>> @Suppress("FunctionName") @LowLevelApi diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt index c66444f..409ff5f 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt @@ -2,10 +2,8 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.LowLevelApi import ru.landgrafhomyak.serdha.api.v0.dml.CopyQuery -import ru.landgrafhomyak.serdha.api.v0.dml.CreateInsertQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.DeleteQuery import ru.landgrafhomyak.serdha.api.v0.dml.InsertQuery -import ru.landgrafhomyak.serdha.api.v0.dml._CreateInsertOrCopyQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.SelectQuery import ru.landgrafhomyak.serdha.api.v0.dml.UpdateQuery @@ -16,7 +14,7 @@ public interface Transaction { @Suppress("FunctionName") @LowLevelApi - public fun _insert(compiledQuery: InsertQuery): _ParametersSetter, _ResultSet>?>> + public fun _insert(compiledQuery: InsertQuery): _ParametersSetter, _ResultSet>?>> @Suppress("FunctionName") @LowLevelApi diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt index 8b8589e..37806f9 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt @@ -7,7 +7,6 @@ import kotlin.contracts.contract import kotlin.jvm.JvmName import ru.landgrafhomyak.serdha.api.v0.LowLevelApi import ru.landgrafhomyak.serdha.api.v0.dml.CopyQuery -import ru.landgrafhomyak.serdha.api.v0.dml.CreateInsertQueryScope import ru.landgrafhomyak.serdha.api.v0.dml.DeleteQuery import ru.landgrafhomyak.serdha.api.v0.dml.InsertQuery import ru.landgrafhomyak.serdha.api.v0.dml.SelectQuery @@ -296,10 +295,10 @@ public suspend inline fun SynchronizedDatabase<*>.au @OptIn(LowLevelApi::class) internal suspend inline fun _wrapInsertWithLambdas( compiledQuery: InsertQuery, - queryGetter: () -> _ParametersSetter, _ResultSet>?>>, + queryGetter: () -> _ParametersSetter, _ResultSet>?>>, parameters: (ParametersSetter) -> Unit, data: Iterable, - rowFormatter: (T, ParametersSetter>) -> Unit, + rowFormatter: (T, ParametersSetter>) -> Unit, hasReturning: Boolean, returningInserted: (_ResultSet) -> Unit, returningUpdated: (_ResultSet) -> Unit, @@ -347,7 +346,7 @@ public suspend inline fun Transaction.insert( compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, data: Iterable, - rowFormatter: (T, ParametersSetter>) -> Unit, + rowFormatter: (T, ParametersSetter>) -> Unit, ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -371,7 +370,7 @@ public suspend inline fun SynchronizedDatabase<*>.au compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, data: Iterable, - rowFormatter: (T, ParametersSetter>) -> Unit, + rowFormatter: (T, ParametersSetter>) -> Unit, ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -395,7 +394,7 @@ public suspend inline fun Transaction.insertReturnin compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, data: Iterable, - rowFormatter: (T, ParametersSetter>) -> Unit, + rowFormatter: (T, ParametersSetter>) -> Unit, insertedRows: (Row) -> Unit, updatedRows: (Row) -> Unit, ) { @@ -421,7 +420,7 @@ public suspend inline fun SynchronizedDatabase<*>.au compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, data: Iterable, - rowFormatter: (T, ParametersSetter>) -> Unit, + rowFormatter: (T, ParametersSetter>) -> Unit, insertedRows: (Row) -> Unit, updatedRows: (Row) -> Unit, ) { @@ -461,7 +460,7 @@ internal object SingleIterable : Iterable, Iterator { public suspend inline fun Transaction.insertSingle( compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, - rowData: (ParametersSetter>) -> Unit, + rowData: (ParametersSetter>) -> Unit, ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -484,7 +483,7 @@ public suspend inline fun Transaction.insertSingle( public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsertSingle( compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, - rowData: (ParametersSetter>) -> Unit, + rowData: (ParametersSetter>) -> Unit, ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -508,7 +507,7 @@ public suspend inline fun SynchronizedDatabase<*>.autoT public suspend inline fun Transaction.insertSingleReturning( compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, - rowData: (ParametersSetter>) -> Unit = {}, + rowData: (ParametersSetter>) -> Unit = {}, insertedRows: (Row) -> R, updatedRows: (Row) -> R ): R { @@ -553,7 +552,7 @@ public suspend inline fun Transaction.insertSingleRe public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsertSingleReturning( compiledQuery: InsertQuery, parameters: (ParametersSetter) -> Unit = {}, - rowData: (ParametersSetter>) -> Unit = {}, + rowData: (ParametersSetter>) -> Unit = {}, insertedRows: (Row) -> R, updatedRows: (Row) -> R ): R {