From 797ab51c58f8e9f028f8ffbb5c38ec4e80c4fbe5 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Fri, 3 Jan 2025 14:25:23 +0300 Subject: [PATCH] Temporary tables and queries for module creating/upgrading scope --- .../api/v0/ddl/module/CreateModuleScope.kt | 81 +++++++++++++++++++ .../api/v0/ddl/module/UpdateModuleScope.kt | 30 +++++++ 2 files changed, 111 insertions(+) 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 2653b2f..8198f46 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 @@ -112,9 +112,25 @@ public interface CreateModuleScope { * @param QueryUserWrapper User's type for containing query-related descriptors. * @param initializer Query-related descriptors initializer. * @return Query descriptor. + * + * @see CreateModuleScope.createTemporarySelectQuery */ public fun createSelectQuery(initializer: SelectQueryCreator): Select + /** + * Creates 'SELECT' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpdater]. + * Using this function instead of [CreateModuleScope.createSelectQuery] may help the driver to optimize caches and runtime indexes. + * + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] must be recreated if needed. + * + * @param QueryUserWrapper User's type for containing query-related descriptors. + * @param initializer Query-related descriptors initializer. + * @return Query descriptor. + * + * @see CreateModuleScope.createSelectQuery + */ + public fun createTemporarySelectQuery(initializer: SelectQueryCreator): Select + /** * Functional interface for creating 'INSERT ... VALUES' query. * @@ -147,9 +163,26 @@ public interface CreateModuleScope { * @param QueryUserWrapper User's type for containing query-related descriptors. * @param initializer Query-related descriptors initializer. * @return Query descriptor. + * + * @see CreateModuleScope.createTemporaryInsertParamsQuery */ public fun createInsertParamsQuery(table: Table, initializer: InsertParamsQueryCreator): Insert.InsertParams + /** + * Creates 'INSERT ... VALUES' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpdater]. + * Using this function instead of [CreateModuleScope.createInsertParamsQuery] may help the driver to optimize caches and runtime indexes. + * + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] must be recreated if needed. + * + * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. + * @param QueryUserWrapper User's type for containing query-related descriptors. + * @param initializer Query-related descriptors initializer. + * @return Query descriptor. + * + * @see CreateModuleScope.createInsertParamsQuery + */ + public fun createTemporaryInsertParamsQuery(table: Table, initializer: InsertParamsQueryCreator): Insert.InsertParams + /** * Functional interface for creating 'INSERT ... FROM' query. * @@ -181,9 +214,25 @@ public interface CreateModuleScope { * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. * @param initializer Query-related descriptors initializer. * @return Query descriptor. + * + * @see CreateModuleScope.createTemporaryInsertFromQueryQuery */ public fun createInsertFromQueryQuery(table: Table, initializer: InsertFromQueryQueryCreator): Insert.InsertFromQuery + /** + * Creates 'INSERT ... FROM' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpdater]. + * Using this function instead of [CreateModuleScope.createInsertFromQueryQuery] may help the driver to optimize caches and runtime indexes. + * + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] must be recreated if needed. + * + * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. + * @param initializer Query-related descriptors initializer. + * @return Query descriptor. + * + * @see CreateModuleScope.createInsertFromQueryQuery + */ + public fun createTemporaryInsertFromQueryQuery(table: Table, initializer: InsertFromQueryQueryCreator): Insert.InsertFromQuery + /** * Functional interface for creating 'UPDATE' query. * @@ -215,9 +264,25 @@ public interface CreateModuleScope { * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. * @param initializer Query-related descriptors initializer. * @return Query descriptor. + * + * @see CreateModuleScope.createTemporaryUpdateQuery */ public fun createUpdateQuery(table: Table, initializer: UpdateQueryCreator): Update + /** + * Creates 'UPDATE' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpdater]. + * Using this function instead of [CreateModuleScope.createUpdateQuery] may help the driver to optimize caches and runtime indexes. + * + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] must be recreated if needed. + * + * @param TableUserExtension User's type with descriptors related to table to which values will be inserted. + * @param initializer Query-related descriptors initializer. + * @return Query descriptor. + * + * @see CreateModuleScope.createUpdateQuery + */ + public fun createTemporaryUpdateQuery(table: Table, initializer: UpdateQueryCreator): Update + /** * Functional interface for creating 'DELETE' query. * @@ -249,9 +314,25 @@ public interface CreateModuleScope { * @param TableUserExtension User's type with descriptors related to table from which data will be deleted. * @param initializer Query-related descriptors initializer. * @return Query descriptor. + * + * @see CreateModuleScope.createTemporaryDeleteQuery */ public fun createDeleteQuery(table: Table, initializer: DeleteQueryCreator): Delete + /** + * Creates 'DELETE' query accessible only while the module is [creating][ModuleTemplate.ModuleCreator] or [updating][ModuleTemplate.ModuleUpdater]. + * Using this function instead of [CreateModuleScope.createUpdateQuery] may help the driver to optimize caches and runtime indexes. + * + * On [module upgrading][ModuleTemplate.CreateModuleTemplatesScope.upgradeTemplate] must be recreated if needed. + * + * @param TableUserExtension User's type with descriptors related to table from which data will be deleted. + * @param initializer Query-related descriptors initializer. + * @return Query descriptor. + * + * @see CreateModuleScope.createDeleteQuery + */ + public fun createTemporaryDeleteQuery(table: Table, initializer: DeleteQueryCreator): Delete + /** * Replaces [specified namespace][rootNs] with schema provided by [template]. * [This namespace][rootNs] will be root namespace for module and shouldn't contain any other definitions. diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/UpdateModuleScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/UpdateModuleScope.kt index 8278190..4e1ae41 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/UpdateModuleScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/module/UpdateModuleScope.kt @@ -116,9 +116,39 @@ public interface UpdateModuleScope : CreateModuleScope { * Deletes table and all data in it. * * @param table Descriptor of table which should be deleted. + * + * @see UpdateModuleScope.deleteTableAfterModuleUpgraded */ public fun deleteTable(table: Table<*, *>) + /** + * Keeps table while module upgrading and deletes it after [ModuleTemplate.ModuleUpdater.upgradeData]. + * [Table's][table] name become free and can be used for another table. + * + * @param table Descriptor of table which should be deleted. + * + * @see UpdateModuleScope.deleteTable + */ + public fun deleteTableAfterModuleUpgraded(table: Table<*, *>) + + + /** + * Creates a temporary table that exits only while module upgrading and auto-deleted after [ModuleTemplate.ModuleUpdater.upgradeData]. + * + * @param TableUserExtension User's type for containing table-related descriptors. + * @param namespace Way to group tables if there is a lot. + * @param name Name of table for debugging. + * @param initializer Table-related descriptors initializer. + * @return Table descriptor. + * + * @see UpdateModuleScope.deleteTableAfterModuleUpgraded + * @see CreateModuleScope.createTable + * @see CreateModuleScope.createSessionScopeTemporaryTable + * @see CreateModuleScope.createTransactionScopeTemporaryTable + */ + public fun createModuleUpgradeScopeTemporaryTable(namespace: Namespace, name: String, initializer: CreateModuleScope.TableCreator): Table + + /** * Upgrades [module][oldModule] located at [rootNs] with new schema template. *