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.
*
* @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")
public interface DatabaseType<@Suppress("unused") RuntimeType> {
public interface DatabaseType<@Suppress("unused") RT> {
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name")
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 ROW_ID<TargetTableUserWrapper : Any> : DatabaseType<RowId<TargetTableUserWrapper>>
public interface ROW_ID<ttUE : Any> : DatabaseType<RowId<ttUE>>
public interface BOOLEAN : DatabaseType<Boolean>

View File

@ -20,13 +20,23 @@ public interface CreateTableScope<tUE : Any> {
@Suppress("PropertyName")
public val rowId_uniqueConstraint: UniqueIndex<tUE>
public fun <TargetTableUserWrapper : Any> selfRowReference(
onDelete: ForeignRowReference.OnDeleteAction,
): ForeignRowReference<tUE, tUE>
public fun <ttUE : Any> selfRowReference(
onDelete: ForeignRowReference.OnDelete,
): 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,
toTable: Table<TargetTableUserWrapper, *>,
onDelete: ForeignRowReference.OnDeleteAction,
): ForeignRowReference<tUE, TargetTableUserWrapper>
toTable: Table<ttUE, *>,
onDelete: ForeignRowReference.OnDelete,
): 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 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.
*/
@ -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.
*/
public enum class OnDeleteAction {
public enum class OnDelete {
/**
* 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 deleteDefaultValue(i: DefaultConstraint<toUE>)
public fun <ttUE : Any> keepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttUE>
public fun <ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> keepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE, RT, DT>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<toUE, ttUE, RT, DT>
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>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttnUE>
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttnUE, RowId<ttnUE>, DatabaseType.ROW_ID<ttnUE>>
public fun <ttUE : Any> renameAndKeepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttUE>
public fun <ttoUE : Any, ttnUE : Any> keepNullableForeignRowReferenceToUpdatedTable(
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.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(
frr: ForeignRowReference<toUE, ttoUE>,
frr: ForeignRowReference<toUE, ttoUE, RowId<ttoUE>, DatabaseType.ROW_ID<ttoUE>>,
updatedTable: Table<ttnUE, ttoUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttnUE>
onDelete: ForeignRowReference.OnDelete? = null
): 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(
frr: ForeignRowReference<toUE, ttUE>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttUE>
public fun deleteForeignRowReference(frr: ForeignRowReference<toUE, *, *, *>)
public fun <ttUE : Any, RT : RowId<ttUE>?, DT : DatabaseType<RT>> keepForeignRowReferenceUntilUpgraded(
frr: ForeignRowReference<toUE, ttUE, RT, DT>,
onDelete: ForeignRowReference.OnDelete? = null
): ForeignRowReference<tnUE, ttUE, RT, DT>
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>,
onDelete: ForeignRowReference.OnDeleteAction? = null
): ForeignRowReference<tnUE, ttnUE>
onDelete: ForeignRowReference.OnDelete? = null
): 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>>>
}