First try to make 'ForeignRowReference' typesafe

This commit is contained in:
Andrew Golovashevich 2025-01-31 18:42:21 +03:00
parent 0e2abb5a33
commit 13e9da6aba
4 changed files with 62 additions and 34 deletions

View File

@ -8,10 +8,10 @@ import ru.landgrafhomyak.db.serdha0.api.table.Table
/** /**
* Descriptor of a database type. * Descriptor of a database type.
* *
* @param RuntimeType Type in programming language to which database type is converted. * @param RT Type in programming language to which database type is converted.
*/ */
@Suppress("ClassName", "RemoveRedundantQualifierName") @Suppress("ClassName", "RemoveRedundantQualifierName")
public interface DatabaseType<@Suppress("unused") RuntimeType> { public interface DatabaseType<@Suppress("unused") RT> {
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name") @get:JvmName("name")
public val name: String public val name: String
@ -35,7 +35,7 @@ public interface DatabaseType<@Suppress("unused") RuntimeType> {
public interface Nullable<RT : Any, @Suppress("unused") DT : DatabaseType<RT>> : DatabaseType<RT?> public interface Nullable<RT : Any, @Suppress("unused") DT : DatabaseType<RT>> : DatabaseType<RT?>
public interface ROW_ID<TargetTableUserWrapper : Any> : DatabaseType<RowId<TargetTableUserWrapper>> public interface ROW_ID<ttUE : Any> : DatabaseType<RowId<ttUE>>
public interface BOOLEAN : DatabaseType<Boolean> public interface BOOLEAN : DatabaseType<Boolean>

View File

@ -20,13 +20,23 @@ public interface CreateTableScope<tUE : Any> {
@Suppress("PropertyName") @Suppress("PropertyName")
public val rowId_uniqueConstraint: UniqueIndex<tUE> public val rowId_uniqueConstraint: UniqueIndex<tUE>
public fun <TargetTableUserWrapper : Any> selfRowReference( public fun <ttUE : Any> selfRowReference(
onDelete: ForeignRowReference.OnDeleteAction, onDelete: ForeignRowReference.OnDelete,
): ForeignRowReference<tUE, tUE> ): ForeignRowReference<tUE, tUE, RowId<tUE>, DatabaseType.ROW_ID<tUE>>
public fun <TargetTableUserWrapper : Any> foreignRowReference( public fun <ttUE : Any> nullableSelfRowReference(
onDelete: ForeignRowReference.OnDelete,
): ForeignRowReference<tUE, tUE, RowId<tUE>?, DatabaseType.Nullable<RowId<tUE>, DatabaseType.ROW_ID<tUE>>>
public fun <ttUE : Any> foreignRowReference(
columnName: String, columnName: String,
toTable: Table<TargetTableUserWrapper, *>, toTable: Table<ttUE, *>,
onDelete: ForeignRowReference.OnDeleteAction, onDelete: ForeignRowReference.OnDelete,
): ForeignRowReference<tUE, TargetTableUserWrapper> ): ForeignRowReference<tUE, ttUE, RowId<ttUE>, DatabaseType.ROW_ID<ttUE>>
public fun <ttUE : Any> nullableForeignRowReference(
columnName: String,
toTable: Table<ttUE, *>,
onDelete: ForeignRowReference.OnDelete,
): ForeignRowReference<tUE, ttUE, RowId<ttUE>?, DatabaseType.Nullable<RowId<ttUE>, DatabaseType.ROW_ID<ttUE>>>
} }

View File

@ -10,7 +10,7 @@ import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
* @param ctUE Type of [owner table's][ForeignRowReference.fromTable] user expression for static reporting errors when this descriptor passed to wrong table. * @param ctUE Type of [owner table's][ForeignRowReference.fromTable] user expression for static reporting errors when this descriptor passed to wrong table.
* @param ttUE Type of [target table's][ForeignRowReference.toTable] user expression for static reporting errors when this descriptor passed to wrong table. * @param ttUE Type of [target table's][ForeignRowReference.toTable] user expression for static reporting errors when this descriptor passed to wrong table.
*/ */
public interface ForeignRowReference<ctUE : Any, ttUE : Any> : Column<RowId<ttUE>, DatabaseType.ROW_ID<ttUE>, ctUE> { public interface ForeignRowReference<ctUE : Any, ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> : Column<RowId<ttUE>, DatabaseType.ROW_ID<ttUE>, ctUE> {
/** /**
* Table that contains references. For debugging. * Table that contains references. For debugging.
*/ */
@ -29,7 +29,7 @@ public interface ForeignRowReference<ctUE : Any, ttUE : Any> : Column<RowId<ttUE
/** /**
* Enum of actions to do when referenced row in [ForeignRowReference.toTable] deleted. * Enum of actions to do when referenced row in [ForeignRowReference.toTable] deleted.
*/ */
public enum class OnDeleteAction { public enum class OnDelete {
/** /**
* Forbids deleting row in [ForeignRowReference.toTable] if there is at least one reference from [ForeignRowReference.fromTable]. * Forbids deleting row in [ForeignRowReference.toTable] if there is at least one reference from [ForeignRowReference.fromTable].
*/ */

View File

@ -26,38 +26,56 @@ public interface UpdateTableScope<tnUE : Any, toUE : Any> : CreateTableScope<tnU
public fun <RT, DT : DatabaseType<RT>> changeDefaultValue(c: Column<RT, DT, tnUE>, d: DefaultConstraint<toUE>): DefaultConstraint<tnUE> public fun <RT, DT : DatabaseType<RT>> changeDefaultValue(c: Column<RT, DT, tnUE>, d: DefaultConstraint<toUE>): DefaultConstraint<tnUE>
public fun deleteDefaultValue(i: DefaultConstraint<toUE>) public fun deleteDefaultValue(i: DefaultConstraint<toUE>)
public fun <ttUE : Any> keepForeignRowReference( public fun <ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> keepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE>, frr: ForeignRowReference<toUE, ttUE, RT, DT>,
onDelete: ForeignRowReference.OnDeleteAction? = null onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttUE> ): ForeignRowReference<toUE, ttUE, RT, DT>
public fun <ttoUE : Any, ttnUE : Any> keepForeignRowReferenceToUpdatedTable( public fun <ttoUE : Any, ttnUE : Any> keepForeignRowReferenceToUpdatedTable(
frr: ForeignRowReference<toUE, ttoUE>, frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>,
updatedTable: Table<ttnUE, ttoUE>, updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE> ): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>
public fun <ttUE : Any> renameAndKeepForeignRowReference( public fun <ttoUE : Any, ttnUE : Any> keepNullableForeignRowReferenceToUpdatedTable(
frr: ForeignRowReference<toUE, ttUE>, frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>?, DatabaseType.Nullable<RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>>,
onDelete: ForeignRowReference.OnDeleteAction? = null updatedTable: Table<ttnUE, ttoUE>,
): ForeignRowReference<tnUE, ttUE> onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>
public fun <ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> renameAndKeepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE, RT, DT>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttUE, RT, DT>
public fun <ttoUE : Any, ttnUE : Any> renameAndKeepForeignRowReferenceToUpdatedTable( public fun <ttoUE : Any, ttnUE : Any> renameAndKeepForeignRowReferenceToUpdatedTable(
frr: ForeignRowReference<toUE, ttoUE>, frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>,
updatedTable: Table<ttnUE, ttoUE>, updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE> ): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>
public fun deleteForeignRowReference(frr: ForeignRowReference<toUE, *>) public fun <ttoUE : Any, ttnUE : Any> renameAndKeepNullableForeignRowReferenceToUpdatedTable(
frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>?, DatabaseType.Nullable<RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>>,
updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>?, DatabaseType.Nullable<RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>>
public fun <ttUE : Any> keepForeignRowReferenceUntilUpgraded( public fun deleteForeignRowReference(frr: ForeignRowReference<toUE, *, *, *>)
frr: ForeignRowReference<toUE, ttUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null public fun <ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> keepForeignRowReferenceUntilUpgraded(
): ForeignRowReference<tnUE, ttUE> frr: ForeignRowReference<toUE, ttUE, RT, DT>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttUE, RT, DT>
public fun <ttoUE : Any, ttnUE : Any> keepForeignRowReferenceToUpdatedTableUntilUpgraded( public fun <ttoUE : Any, ttnUE : Any> keepForeignRowReferenceToUpdatedTableUntilUpgraded(
frr: ForeignRowReference<toUE, ttoUE>, frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>,
updatedTable: Table<ttnUE, ttoUE>, updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE> ): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>
public fun <ttoUE : Any, ttnUE : Any> keepNullableForeignRowReferenceToUpdatedTableUntilUpgraded(
frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>?, DatabaseType.Nullable<RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>>,
updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>?, DatabaseType.Nullable<RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>>
} }