Improved table updating

This commit is contained in:
Andrew Golovashevich 2024-12-21 17:26:34 +03:00
parent fd0ef34d55
commit d03bca3b1c
7 changed files with 77 additions and 31 deletions

View File

@ -0,0 +1,10 @@
package ru.landgrafhomyak.serdha.api.v0.ddl
import ru.landgrafhomyak.serdha.api.v0.Expression
public interface DefaultConstraint<RuntimeType, DatabaseType : ColumnType<RuntimeType>, TableUserExtension : Any> {
public val name: String
public val table: Table<TableUserExtension, *>
public val attachedToColumn: Column<RuntimeType, DatabaseType, TableUserExtension>
public val expression: Expression<RuntimeType, DatabaseType, TableUserExtension>
}

View File

@ -8,8 +8,9 @@ import ru.landgrafhomyak.serdha.api.v0.dml.Select
import ru.landgrafhomyak.serdha.api.v0.dml.SelectCreator import ru.landgrafhomyak.serdha.api.v0.dml.SelectCreator
import ru.landgrafhomyak.serdha.api.v0.dml.Update import ru.landgrafhomyak.serdha.api.v0.dml.Update
import ru.landgrafhomyak.serdha.api.v0.dml.UpdateCreator import ru.landgrafhomyak.serdha.api.v0.dml.UpdateCreator
import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction
public interface ModuleCreator { public interface ModuleCreator : Transaction {
public interface CreateTable<TableUserExtension : Any> { public interface CreateTable<TableUserExtension : Any> {
public fun createTable(creator: TableCreator<TableUserExtension>): TableUserExtension public fun createTable(creator: TableCreator<TableUserExtension>): TableUserExtension
} }

View File

@ -14,11 +14,11 @@ public interface ModuleTemplate<ModuleUserExtension : Any> {
} }
public interface CreateModule<ModuleUserExtension : Any> { public interface CreateModule<ModuleUserExtension : Any> {
public fun createModule(rootNs: Namespace, creator: ModuleCreator): ModuleUserExtension public suspend fun createModule(rootNs: Namespace, creator: ModuleCreator): ModuleUserExtension
} }
public interface UpgradeModule<OldModuleUserExtension : Any, NewModuleUserExtension : Any> { public interface UpgradeModule<OldModuleUserExtension : Any, NewModuleUserExtension : Any> {
public fun upgradeModule(oldModule: Module<OldModuleUserExtension>, rootNs: Namespace, updater: ModuleCreator): NewModuleUserExtension public suspend fun upgradeModule(oldModule: Module<OldModuleUserExtension>, rootNs: Namespace, updater: ModuleCreator): NewModuleUserExtension
} }
public val versionKey: String public val versionKey: String

View File

@ -1,39 +1,53 @@
package ru.landgrafhomyak.serdha.api.v0.ddl package ru.landgrafhomyak.serdha.api.v0.ddl
import kotlin.jvm.JvmName
import ru.landgrafhomyak.serdha.api.v0.Expression import ru.landgrafhomyak.serdha.api.v0.Expression
import ru.landgrafhomyak.serdha.api.v0.LowLevelApi
public interface TableCreator<TableUserExtension : Any> { public interface TableCreator<TableUserExtension : Any> {
public val expressionBuilder: Expression.Builder<TableUserExtension> public val expressionBuilder: Expression.Builder<TableUserExtension>
public val types: ColumnType.Builder public val types: ColumnType.Builder
/** public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> column(name: String, type: DatabaseType): Column<RuntimeType, DatabaseType, TableUserExtension>
* Offers column of type [D][type] with `NOT NULL` constraint named [name] and runtime type [RuntimeType].
*
* @return Descriptor of offered column for future operations.
*/
public fun <RuntimeType : Any, DatabaseType : ColumnType<RuntimeType>> column(name: String, type: DatabaseType): Column<RuntimeType, DatabaseType, TableUserExtension>
public fun index(name: String, vararg columns: Column<*, *, TableUserExtension>): Index<TableUserExtension> public fun index(name: String, vararg columns: Column<*, *, TableUserExtension>): Index<TableUserExtension>
public fun unique(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserExtension>): UniqueConstraint<TableUserExtension> public fun uniqueIndex(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserExtension>): UniqueIndex<TableUserExtension>
public fun check(name: String, constraint: Expression<Boolean, ColumnType.BOOLEAN, TableUserExtension>): CheckConstraint<TableUserExtension> public fun checkConstraint(name: String, constraint: Expression<Boolean, ColumnType.BOOLEAN, TableUserExtension>): CheckConstraint<TableUserExtension>
public fun <RuntimeType : Any, DatabaseType : ColumnType<RuntimeType>> defaultValue(c: Column<RuntimeType, DatabaseType, TableUserExtension>, expr: Expression<RuntimeType, DatabaseType, TableUserExtension>): DefaultConstraint<RuntimeType, DatabaseType, TableUserExtension>
@Suppress("PropertyName") @Suppress("PropertyName")
public val rowId_column: Column<RowId<TableUserExtension>, ColumnType<RowId<TableUserExtension>>, TableUserExtension> public val rowId_column: Column<RowId<TableUserExtension>, ColumnType<RowId<TableUserExtension>>, TableUserExtension>
@Suppress("PropertyName") @Suppress("PropertyName")
public val rowId_uniqueConstraint: UniqueConstraint<TableUserExtension> public val rowId_uniqueConstraint: UniqueIndex<TableUserExtension>
@Suppress("FunctionName")
@LowLevelApi
public fun <TargetTableUserWrapper : Any> _foreignKey(
fromColumns: Array<Column<*, *, TableUserExtension>>,
toTable: Table<TargetTableUserWrapper, *>,
toColumns: Array<Column<*, *, TargetTableUserWrapper>>,
onUpdate: ForeignKey.OnUpdateAction,
onDelete: ForeignKey.OnDeleteAction,
): ForeignKey<TableUserExtension, TargetTableUserWrapper>
@OptIn(LowLevelApi::class)
public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>> foreignKey( public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>> foreignKey(
fromColumn: Column<*, ColumnType1, TableUserExtension>, fromColumn: Column<*, ColumnType1, TableUserExtension>,
toTable: Table<TargetTableUserWrapper, *>, toTable: Table<TargetTableUserWrapper, *>,
toColumn: Column<*, ColumnType1, TargetTableUserWrapper>, toColumn: Column<*, ColumnType1, TargetTableUserWrapper>,
onUpdate: ForeignKey.OnUpdateAction, onUpdate: ForeignKey.OnUpdateAction,
onDelete: ForeignKey.OnDeleteAction, onDelete: ForeignKey.OnDeleteAction,
): ForeignKey<TableUserExtension, TargetTableUserWrapper> ): ForeignKey<TableUserExtension, TargetTableUserWrapper> = this._foreignKey(
fromColumns = arrayOf(fromColumn),
toTable = toTable,
toColumns = arrayOf(toColumn),
onUpdate = onUpdate,
onDelete = onDelete
)
@OptIn(LowLevelApi::class)
public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>, ColumnType2 : ColumnType<*>> foreignKey( public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>, ColumnType2 : ColumnType<*>> foreignKey(
fromColumn1: Column<*, ColumnType1, TableUserExtension>, fromColumn1: Column<*, ColumnType1, TableUserExtension>,
fromColumn2: Column<*, ColumnType2, TableUserExtension>, fromColumn2: Column<*, ColumnType2, TableUserExtension>,
@ -42,8 +56,15 @@ public interface TableCreator<TableUserExtension : Any> {
toColumn2: Column<*, ColumnType2, TargetTableUserWrapper>, toColumn2: Column<*, ColumnType2, TargetTableUserWrapper>,
onUpdate: ForeignKey.OnUpdateAction, onUpdate: ForeignKey.OnUpdateAction,
onDelete: ForeignKey.OnDeleteAction, onDelete: ForeignKey.OnDeleteAction,
): ForeignKey<TableUserExtension, TargetTableUserWrapper> ): ForeignKey<TableUserExtension, TargetTableUserWrapper> = this._foreignKey(
fromColumns = arrayOf(fromColumn1, fromColumn2),
toTable = toTable,
toColumns = arrayOf(toColumn1, toColumn2),
onUpdate = onUpdate,
onDelete = onDelete
)
@OptIn(LowLevelApi::class)
public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>, ColumnType2 : ColumnType<*>, ColumnType3 : ColumnType<*>> foreignKey( public fun <TargetTableUserWrapper : Any, ColumnType1 : ColumnType<*>, ColumnType2 : ColumnType<*>, ColumnType3 : ColumnType<*>> foreignKey(
fromColumn1: Column<*, ColumnType1, TableUserExtension>, fromColumn1: Column<*, ColumnType1, TableUserExtension>,
fromColumn2: Column<*, ColumnType2, TableUserExtension>, fromColumn2: Column<*, ColumnType2, TableUserExtension>,
@ -54,5 +75,11 @@ public interface TableCreator<TableUserExtension : Any> {
toColumn3: Column<*, ColumnType3, TargetTableUserWrapper>, toColumn3: Column<*, ColumnType3, TargetTableUserWrapper>,
onUpdate: ForeignKey.OnUpdateAction, onUpdate: ForeignKey.OnUpdateAction,
onDelete: ForeignKey.OnDeleteAction, onDelete: ForeignKey.OnDeleteAction,
): ForeignKey<TableUserExtension, TargetTableUserWrapper> ): ForeignKey<TableUserExtension, TargetTableUserWrapper> = this._foreignKey(
fromColumns = arrayOf(fromColumn1, fromColumn2, fromColumn3),
toTable = toTable,
toColumns = arrayOf(toColumn1, toColumn2, toColumn3),
onUpdate = onUpdate,
onDelete = onDelete
)
} }

View File

@ -4,27 +4,35 @@ import ru.landgrafhomyak.serdha.api.v0.Expression
public interface TableUpdater<TableNewUserExtension : Any, TableOldUserExtension : Any> : TableCreator<TableNewUserExtension> { public interface TableUpdater<TableNewUserExtension : Any, TableOldUserExtension : Any> : TableCreator<TableNewUserExtension> {
public val oldExpressionBuilder: Expression.Builder<TableOldUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> keepColumn(c: Column<RuntimeType, DatabaseType, TableOldUserExtension>): Column<RuntimeType, DatabaseType, TableNewUserExtension> public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> keepColumn(c: Column<RuntimeType, DatabaseType, TableOldUserExtension>): Column<RuntimeType, DatabaseType, TableNewUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> renameColumn(c: Column<RuntimeType, DatabaseType, TableOldUserExtension>, newName: String): Column<RuntimeType, DatabaseType, TableNewUserExtension> public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> renameAndKeepColumn(c: Column<RuntimeType, DatabaseType, TableOldUserExtension>, newName: String): Column<RuntimeType, DatabaseType, TableNewUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapColumn(c: Column<RuntimeType, DatabaseType, TableNewUserExtension>, newValue: Expression<RuntimeType, DatabaseType, TableNewUserExtension>, where: Expression<Boolean, ColumnType.BOOLEAN, TableNewUserExtension>?) public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapAndKeepColumn(c: Column<*, *, TableOldUserExtension>, newValue: Expression<RuntimeType, DatabaseType, TableOldUserExtension>, where: Expression<Boolean, ColumnType.BOOLEAN, TableNewUserExtension>?): Column<RuntimeType, DatabaseType, TableNewUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapColumn(c: Column<RuntimeType, DatabaseType, TableNewUserExtension>, newValue: Expression<RuntimeType, DatabaseType, TableNewUserExtension>): Unit = this.mapColumn(c, newValue, null) public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapAndKeepColumn(c: Column<*, *, TableOldUserExtension>, newValue: Expression<RuntimeType, DatabaseType, TableOldUserExtension>): Column<RuntimeType, DatabaseType, TableNewUserExtension> = this.mapAndKeepColumn(c, newValue, null)
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapAndRenameAndKeepColumn(c: Column<*, *, TableOldUserExtension>, newName: String, newValue: Expression<RuntimeType, DatabaseType, TableOldUserExtension>, where: Expression<Boolean, ColumnType.BOOLEAN, TableNewUserExtension>?): Column<RuntimeType, DatabaseType, TableNewUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> mapAndRenameAndKeepColumn(c: Column<*, *, TableOldUserExtension>, newName: String, newValue: Expression<RuntimeType, DatabaseType, TableOldUserExtension>): Column<RuntimeType, DatabaseType, TableNewUserExtension> = this.mapAndRenameAndKeepColumn(c, newName, newValue, null)
public fun deleteColumn(c: Column<*, *, TableOldUserExtension>) public fun deleteColumn(c: Column<*, *, TableOldUserExtension>)
public fun keepIndex(i: Index<TableOldUserExtension>): Index<TableNewUserExtension> public fun keepIndex(i: Index<TableOldUserExtension>): Index<TableNewUserExtension>
public fun renameIndex(i: Index<TableOldUserExtension>, newName: String): Index<TableNewUserExtension> public fun renameAndKeepIndex(i: Index<TableOldUserExtension>, newName: String): Index<TableNewUserExtension>
public fun deleteIndex(i: Index<TableOldUserExtension>) public fun deleteIndex(i: Index<TableOldUserExtension>)
public fun keepCheck(i: CheckConstraint<TableOldUserExtension>): CheckConstraint<TableNewUserExtension> public fun keepCheck(i: CheckConstraint<TableOldUserExtension>): CheckConstraint<TableNewUserExtension>
public fun renameCheck(i: CheckConstraint<TableOldUserExtension>, newName: String): CheckConstraint<TableNewUserExtension> public fun renameAndKeepCheck(i: CheckConstraint<TableOldUserExtension>, newName: String): CheckConstraint<TableNewUserExtension>
public fun deleteCheck(i: CheckConstraint<TableOldUserExtension>) public fun deleteCheck(i: CheckConstraint<TableOldUserExtension>)
public fun keepUnique(i: UniqueConstraint<TableOldUserExtension>): UniqueConstraint<TableNewUserExtension> public fun keepUniqueIndex(i: UniqueIndex<TableOldUserExtension>): UniqueIndex<TableNewUserExtension>
public fun renameUnique(i: UniqueConstraint<TableOldUserExtension>, newName: String): UniqueConstraint<TableNewUserExtension> public fun renameAndKeepUniqueIndex(i: UniqueIndex<TableOldUserExtension>, newName: String): UniqueIndex<TableNewUserExtension>
public fun deleteUnique(i: UniqueConstraint<TableOldUserExtension>) public fun deleteUniqueIndex(i: UniqueIndex<TableOldUserExtension>)
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> keepDefaultValue(c: Column<RuntimeType, DatabaseType, TableNewUserExtension>, d: DefaultConstraint<RuntimeType, DatabaseType, TableOldUserExtension>): DefaultConstraint<RuntimeType, DatabaseType, TableNewUserExtension>
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> changeDefaultValue(c: Column<RuntimeType, DatabaseType, TableNewUserExtension>, d: DefaultConstraint<*, *, TableOldUserExtension>): DefaultConstraint<RuntimeType, DatabaseType, TableNewUserExtension>
public fun deleteDefaultValue(i: DefaultConstraint<*, *, TableOldUserExtension>)
public fun <TargetTableOldUserWrapper : Any, TargetTableNewUserWrapper : Any> keepForeignKeyToUpdatedTable(i: ForeignKey<TableOldUserExtension, TargetTableOldUserWrapper>, updatedTable: Table<TargetTableNewUserWrapper, TargetTableOldUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableNewUserWrapper> public fun <TargetTableOldUserWrapper : Any, TargetTableNewUserWrapper : Any> keepForeignKeyToUpdatedTable(i: ForeignKey<TableOldUserExtension, TargetTableOldUserWrapper>, updatedTable: Table<TargetTableNewUserWrapper, TargetTableOldUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableNewUserWrapper>
public fun <TargetTableUserWrapper : Any> keepForeignKey(i: ForeignKey<TableOldUserExtension, TargetTableUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableUserWrapper> public fun <TargetTableUserWrapper : Any> keepForeignKey(i: ForeignKey<TableOldUserExtension, TargetTableUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableUserWrapper>
public fun <TargetTableOldUserWrapper : Any, TargetTableNewUserWrapper : Any> renameForeignKeyToUpdatedTable(i: ForeignKey<TableOldUserExtension, TargetTableOldUserWrapper>, updatedTable: Table<TargetTableNewUserWrapper, TargetTableOldUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableNewUserWrapper> public fun <TargetTableOldUserWrapper : Any, TargetTableNewUserWrapper : Any> renameAndKeepForeignKeyToUpdatedTable(i: ForeignKey<TableOldUserExtension, TargetTableOldUserWrapper>, updatedTable: Table<TargetTableNewUserWrapper, TargetTableOldUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableNewUserWrapper>
public fun <TargetTableUserWrapper : Any> renameForeignKey(i: ForeignKey<TableOldUserExtension, TargetTableUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableUserWrapper> public fun <TargetTableUserWrapper : Any> renameAndKeepForeignKey(i: ForeignKey<TableOldUserExtension, TargetTableUserWrapper>): ForeignKey<TableNewUserExtension, TargetTableUserWrapper>
public fun deleteForeignKey(i: ForeignKey<TableOldUserExtension, *>) public fun deleteForeignKey(i: ForeignKey<TableOldUserExtension, *>)
} }

View File

@ -1,6 +1,6 @@
package ru.landgrafhomyak.serdha.api.v0.ddl package ru.landgrafhomyak.serdha.api.v0.ddl
public interface UniqueConstraint<OwnerTableUserExtension : Any> { public interface UniqueIndex<OwnerTableUserExtension : Any> {
public val name: String public val name: String
public val table: Table<OwnerTableUserExtension, *> public val table: Table<OwnerTableUserExtension, *>
public val columns: List<Column<*, *, OwnerTableUserExtension>> public val columns: List<Column<*, *, OwnerTableUserExtension>>

View File

@ -3,7 +3,7 @@ package ru.landgrafhomyak.serdha.api.v0.dml
import ru.landgrafhomyak.serdha.api.v0.Expression import ru.landgrafhomyak.serdha.api.v0.Expression
import ru.landgrafhomyak.serdha.api.v0.ddl.Column import ru.landgrafhomyak.serdha.api.v0.ddl.Column
import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType
import ru.landgrafhomyak.serdha.api.v0.ddl.UniqueConstraint import ru.landgrafhomyak.serdha.api.v0.ddl.UniqueIndex
public interface InsertCreator<TargetTableUserExtension : Any, QueryUserExtension : Any> : _CommonQueryMethods<QueryUserExtension> { public interface InsertCreator<TargetTableUserExtension : Any, QueryUserExtension : Any> : _CommonQueryMethods<QueryUserExtension> {
public val insertedValues: SelectedTable<TargetTableUserExtension, QueryUserExtension> public val insertedValues: SelectedTable<TargetTableUserExtension, QueryUserExtension>
@ -15,11 +15,11 @@ public interface InsertCreator<TargetTableUserExtension : Any, QueryUserExtensio
public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> updateColumn(c: Column<RuntimeType, DatabaseType, TargetTableUserExtension>, e: Expression<RuntimeType, DatabaseType, QueryUserExtension>) public fun <RuntimeType, DatabaseType : ColumnType<RuntimeType>> updateColumn(c: Column<RuntimeType, DatabaseType, TargetTableUserExtension>, e: Expression<RuntimeType, DatabaseType, QueryUserExtension>)
} }
public fun onConflictUpdate(u: UniqueConstraint<TargetTableUserExtension>, c: (_UpsertCreator<TargetTableUserExtension, QueryUserExtension>) -> Unit) public fun onConflictUpdate(u: UniqueIndex<TargetTableUserExtension>, c: (_UpsertCreator<TargetTableUserExtension, QueryUserExtension>) -> Unit)
public fun onConflictThrow(u: UniqueConstraint<TargetTableUserExtension>) public fun onConflictThrow(u: UniqueIndex<TargetTableUserExtension>)
public fun onConflictIgnore(u: UniqueConstraint<TargetTableUserExtension>) public fun onConflictIgnore(u: UniqueIndex<TargetTableUserExtension>)
public val returningInserted: _CommonQueryMethods._Returning<QueryUserExtension> public val returningInserted: _CommonQueryMethods._Returning<QueryUserExtension>