Allowed subqueries in 'CheckConstraint' and 'ColumnDefaultValue'

This commit is contained in:
Andrew Golovashevich 2025-02-01 04:32:31 +03:00
parent af338b5dc1
commit f1368a2feb
6 changed files with 55 additions and 79 deletions

View File

@ -0,0 +1,40 @@
package ru.landgrafhomyak.db.serdha0.api.misc
import ru.landgrafhomyak.db.serdha0.api.queries._Query
import ru.landgrafhomyak.db.serdha0.api.runtime.OutputRow
import ru.landgrafhomyak.db.serdha0.api.table.RowId
import ru.landgrafhomyak.db.serdha0.api.table.Table
public interface RowExpression<ttUE : Any, @Suppress("unused") R> {
public val targetTable: Table<ttUE, *>
public interface RowExportsConstructor<rUE : Any, ttUE : Any> {
public fun createRowExports(context: Scope<rUE, ttUE>): rUE
public interface Scope<rUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *>
public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, ttUE>): Column<RT, DT, rUE>
public fun <rtUE : Any, RT, DT : DatabaseType<RT>> followReference(
ref: Column<*, *, rUE>,
column: Column<RT, DT, rtUE>
): Column<RT, DT, rUE>
public fun <rtUE : Any, RT : Any, DT : DatabaseType<RT>> followReferenceNullable(
ref: Column<RowId<rtUE>, DatabaseType.ROW_ID<rtUE>, rUE>,
column: Column<RT, DT, rtUE>
): Column<RT?, DatabaseType.Nullable<RT, DT>, rUE>
}
}
public interface Constructor<ttUE : Any, rUE : Any, R> {
public val rowExports: RowExportsConstructor<rUE, ttUE>
public fun createRowExpression(internalQueries: _Query.Constructor.Scope, runtimeQueries: _Query.Constructor.Scope): Action<rUE, R>
}
public interface Action<rUE : Any, R> {
public suspend fun calculateRow(rowUE: rUE, row: OutputRow<rUE>): R
}
}

View File

@ -1,39 +1,7 @@
package ru.landgrafhomyak.db.serdha0.api.table
import kotlin.jvm.JvmName
import ru.landgrafhomyak.db.serdha0.api.misc.Column
import ru.landgrafhomyak.db.serdha0.api.misc.IntermediateColumn
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.Mapper
import ru.landgrafhomyak.db.serdha0.api.misc.RowExpression
public interface CheckConstraint<tUE : Any> {
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name")
public interface CheckConstraint<ttUE : Any> : RowExpression<ttUE, Boolean> {
public val name: String
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table")
public val table: Table<tUE, *>
public interface Creator<cUE : Any, ttUE : Any> {
public fun createCheckConstraint(scope: Scope<cUE, ttUE>)
public interface Scope<cUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *>
public var result: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, cUE>
public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, ttUE>): IntermediateColumn<RT, DT, cUE>
public fun <rtUE : Any, RT, DT : DatabaseType<RT>> followReference(
ref: IntermediateColumn<*, DatabaseType.ROW_ID<rtUE>, cUE>,
column: Column<RT, DT, rtUE>
): IntermediateColumn<RT, DT, rtUE>
public fun <eUE : Any> mapColumns(
expression: Mapper<eUE>,
input: ru.landgrafhomyak.db.serdha0.api.misc.Expression.Map.InputLinker<eUE, cUE>,
output: ru.landgrafhomyak.db.serdha0.api.misc.Expression.Map.OutputLinker<eUE, cUE>
)
}
}
}

View File

@ -0,0 +1,6 @@
package ru.landgrafhomyak.db.serdha0.api.table
import ru.landgrafhomyak.db.serdha0.api.misc.RowExpression
public interface ColumnDefaultValue<ttUE : Any, R> : RowExpression<ttUE, R> {
}

View File

@ -1,39 +0,0 @@
package ru.landgrafhomyak.db.serdha0.api.table
import kotlin.jvm.JvmName
import ru.landgrafhomyak.db.serdha0.api.misc.Column
import ru.landgrafhomyak.db.serdha0.api.misc.IntermediateColumn
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.Mapper
public interface DefaultConstraint<tUE : Any> {
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name")
public val name: String
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table")
public val table: Table<tUE, *>
public interface Creator<cUE : Any, RT, DT : DatabaseType<RT>, ttUE : Any> {
public fun createCheckConstraint(scope: Scope<cUE, RT, DT, ttUE>)
public interface Scope<cUE : Any, rRT, rDT : DatabaseType<rRT>, ttUE : Any> {
public val tt: Table<ttUE, *>
public var result: IntermediateColumn<rRT, rDT, cUE>
public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, ttUE>): IntermediateColumn<RT, DT, cUE>
public fun <rtUE : Any, RT, DT : DatabaseType<RT>> followReference(
ref: IntermediateColumn<*, DatabaseType.ROW_ID<rtUE>, cUE>,
column: Column<RT, DT, rtUE>
): IntermediateColumn<RT, DT, rtUE>
public fun <eUE : Any> mapColumns(
expression: Mapper<eUE>,
input: ru.landgrafhomyak.db.serdha0.api.misc.Expression.Map.InputLinker<eUE, cUE>,
output: ru.landgrafhomyak.db.serdha0.api.misc.Expression.Map.OutputLinker<eUE, cUE>
)
}
}
}

View File

@ -2,6 +2,7 @@ package ru.landgrafhomyak.db.serdha0.api.table
import ru.landgrafhomyak.db.serdha0.api.misc.Column
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.RowExpression
public interface TableConstructor<TableUserExtension : Any> {
@ -16,8 +17,8 @@ public interface TableConstructor<TableUserExtension : Any> {
public fun index(name: String, vararg columns: Column<*, *, tUE>): Index<tUE>
public fun uniqueIndex(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, tUE>): UniqueIndex<tUE>
public fun <cUE : Any> checkConstraint(name: String, creator: CheckConstraint.Creator<cUE, tUE>, recheckExistingRows: Boolean = false): CheckConstraint<tUE>
public fun <cUE : Any, RT : Any, DT : DatabaseType<RT>> defaultValue(c: Column<RT, DT, tUE>, creator: DefaultConstraint.Creator<cUE, RT, DT, tUE>): DefaultConstraint<tUE>
public fun checkConstraint(name: String, constructor: RowExpression.Constructor<tUE, *, Boolean>, recheckExistingRows: Boolean = false): CheckConstraint<tUE>
public fun <RT : Any> defaultValue(c: Column<RT, *, tUE>, creator: RowExpression.Constructor<tUE, *, RT>): ColumnDefaultValue<tUE, RT>
@Suppress("PropertyName")
public val rowId_column: Column<RowId<tUE>, DatabaseType<RowId<tUE>>, tUE>

View File

@ -4,7 +4,7 @@ import ru.landgrafhomyak.db.serdha0.api.misc.Column
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
public interface UpdateTableScope<tnUE : Any, toUE : Any> : CreateTableScope<tnUE> {
public interface UpdateTableScope<tnUE : Any, toUE : Any> : TableConstructor.Scope<tnUE> {
public fun <RT, DT : DatabaseType<RT>> keepColumn(c: Column<RT, DT, toUE>): Column<RT, DT, tnUE>
public fun <RT, DT : DatabaseType<RT>> keepColumnUntilUpgraded(c: Column<RT, DT, toUE>): Column<RT, DT, tnUE>
public fun <RT, DT : DatabaseType<RT>> renameAndKeepColumn(c: Column<RT, DT, toUE>, newName: String): Column<RT, DT, tnUE>
@ -22,9 +22,9 @@ public interface UpdateTableScope<tnUE : Any, toUE : Any> : CreateTableScope<tnU
public fun renameAndKeepUniqueIndex(i: UniqueIndex<toUE>, newName: String): UniqueIndex<tnUE>
public fun deleteUniqueIndex(i: UniqueIndex<toUE>)
public fun <RT, DT : DatabaseType<RT>> keepDefaultValue(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 <RT, DT : DatabaseType<RT>> keepDefaultValue(c: Column<RT, DT, tnUE>, d: ColumnDefaultValue<toUE, RT>): ColumnDefaultValue<tnUE, RT>
public fun <RT, DT : DatabaseType<RT>> changeDefaultValue(c: Column<RT, DT, tnUE>, d: ColumnDefaultValue<toUE, RT>): ColumnDefaultValue<tnUE, RT>
public fun deleteDefaultValue(i: ColumnDefaultValue<toUE, *>)
public fun <ttUE : Any, RT, DT : DatabaseType<RT>> keepForeignRowReference(
frr: ForeignRowReference<toUE, ttUE, RT, DT>,