Updated 'CHECK' and 'DEFAULT' constraints to use runtime expressions

This commit is contained in:
Andrew Golovashevich 2025-01-27 02:14:07 +03:00
parent 8695fca966
commit 472fbc895f
5 changed files with 50 additions and 60 deletions

View File

@ -1,5 +1,6 @@
package ru.landgrafhomyak.serdha.api.v0.queries package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc.BuiltinExpressionsProvider
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
@ -19,6 +20,7 @@ public interface SelectQuery<QueryUserExtension : Any> : _Query<QueryUserExtensi
public fun <RT, DT : DatabaseType<RT>> queryParam(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension> public fun <RT, DT : DatabaseType<RT>> queryParam(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension>
public fun <RT, DT : DatabaseType<RT>> paramAsColumn(param: QueryParam<RT, DT, QueryUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension> public fun <RT, DT : DatabaseType<RT>> paramAsColumn(param: QueryParam<RT, DT, QueryUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
public val builtinExpressions: BuiltinExpressionsProvider<QueryUserExtension>
public fun <ExpressionUserExtension : Any> mapColumns( public fun <ExpressionUserExtension : Any> mapColumns(
expression: Expression<ExpressionUserExtension>, expression: Expression<ExpressionUserExtension>,
input: Expression.InputLinker<ExpressionUserExtension, QueryUserExtension>, input: Expression.InputLinker<ExpressionUserExtension, QueryUserExtension>,

View File

@ -1,43 +1,39 @@
package ru.landgrafhomyak.serdha.api.v0.table package ru.landgrafhomyak.serdha.api.v0.table
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import ru.landgrafhomyak.serdha.api.v0.misc.BuiltinExpressionsProvider
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.Expression
/**
* Descriptor of 'check' constraint on columns. Used for schema manipulations.
*
* @param TableUserExtension Type of [owner table's][CheckConstraint.table] user expression for static reporting errors when this descriptor passed to wrong table.
*/
public interface CheckConstraint<TableUserExtension : Any> { public interface CheckConstraint<TableUserExtension : Any> {
/**
* Name of constraint for debugging, errors and raw schema access.
*/
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name") @get:JvmName("name")
public val name: String public val name: String
/**
* Table that contains this constraint. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table") @get:JvmName("table")
public val table: Table<TableUserExtension, *> public val table: Table<TableUserExtension, *>
public interface Creator<ConstraintUserExtension : Any, TargetTableUserExtension : Any> {
public fun createCheckConstraint(scope: Scope<ConstraintUserExtension, TargetTableUserExtension>)
/** public interface Scope<ConstraintUserExtension : Any, TargetTableUserExtension : Any> {
* Expression used to check data. public var result: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, ConstraintUserExtension>
*/ public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, ConstraintUserExtension>
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("expression")
public val expression: Expression<Boolean, DatabaseType.BOOLEAN, TableUserExtension>
public fun <ReferencedTableUserExtension : Any, RT, DT : DatabaseType<RT>> followReference(
ref: IntermediateColumn<*, DatabaseType.ROW_ID<ReferencedTableUserExtension>, ConstraintUserExtension>,
column: Column<RT, DT, ReferencedTableUserExtension>
): IntermediateColumn<RT, DT, ReferencedTableUserExtension>
/** public val builtinExpressions: BuiltinExpressionsProvider<ConstraintUserExtension>
* Set of columns, checked by this constraint. Calculated from [CheckConstraint.expression]. For debugging. public fun <ExpressionUserExtension : Any> mapColumns(
*/ expression: Expression<ExpressionUserExtension>,
@Suppress("INAPPLICABLE_JVM_NAME") input: Expression.InputLinker<ExpressionUserExtension, ConstraintUserExtension>,
@get:JvmName("affectedColumns") output: Expression.OutputLinker<ExpressionUserExtension, ConstraintUserExtension>
public val affectedColumns: List<Column<*, *, TableUserExtension>> )
}
}
} }

View File

@ -6,8 +6,6 @@ import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider
public interface CreateTableScope<TableUserExtension : Any> { public interface CreateTableScope<TableUserExtension : Any> {
public val expressionBuilder: BuiltinExpressionsProvider<TableUserExtension>
public val types: DatabaseTypesProvider public val types: DatabaseTypesProvider
public fun <RT, DT : DatabaseType<RT>> column(name: String, type: DT): Column<RT, DT, TableUserExtension> public fun <RT, DT : DatabaseType<RT>> column(name: String, type: DT): Column<RT, DT, TableUserExtension>
@ -15,8 +13,8 @@ public interface CreateTableScope<TableUserExtension : Any> {
public fun index(name: String, vararg columns: Column<*, *, TableUserExtension>): Index<TableUserExtension> public fun index(name: String, vararg columns: Column<*, *, TableUserExtension>): Index<TableUserExtension>
public fun uniqueIndex(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserExtension>): UniqueIndex<TableUserExtension> public fun uniqueIndex(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserExtension>): UniqueIndex<TableUserExtension>
public fun checkConstraint(name: String, constraint: Expression<Boolean, DatabaseType.BOOLEAN, TableUserExtension>): CheckConstraint<TableUserExtension> public fun <ConstraintUserExtension : Any> checkConstraint(name: String, creator: CheckConstraint.Creator<ConstraintUserExtension, TableUserExtension>, recheckExistingRows: Boolean = false): CheckConstraint<TableUserExtension>
public fun <RT : Any, DT : DatabaseType<RT>> defaultValue(c: Column<RT, DT, TableUserExtension>, expr: Expression<RT, DT, TableUserExtension>): DefaultConstraint<RT, DT, TableUserExtension> public fun <ConstraintUserExtension : Any, RT : Any, DT : DatabaseType<RT>> defaultValue(c: Column<RT, DT, TableUserExtension>, creator: DefaultConstraint.Creator<ConstraintUserExtension, RT, DT, TableUserExtension>): DefaultConstraint<TableUserExtension>
@Suppress("PropertyName") @Suppress("PropertyName")
public val rowId_column: Column<RowId<TableUserExtension>, DatabaseType<RowId<TableUserExtension>>, TableUserExtension> public val rowId_column: Column<RowId<TableUserExtension>, DatabaseType<RowId<TableUserExtension>>, TableUserExtension>

View File

@ -1,43 +1,39 @@
package ru.landgrafhomyak.serdha.api.v0.table package ru.landgrafhomyak.serdha.api.v0.table
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import ru.landgrafhomyak.serdha.api.v0.misc.BuiltinExpressionsProvider
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.Expression
/** public interface DefaultConstraint<TableUserExtension : Any> {
* Descriptor of default value attached to [column][Column]. Used for schema manipulations.
*
* @param RT Type in programming language to which database type is converted.
* @param DT Descriptor of column type on database side.
* @param TableUserExtension Type of [owner's table][Column.table] user expression for static reporting errors when this descriptor passed to wrong table.
*/
public interface DefaultConstraint<RT, DT : DatabaseType<RT>, TableUserExtension : Any> {
/**
* Name of constraint for debugging, errors and raw schema access.
*/
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name") @get:JvmName("name")
public val name: String public val name: String
/**
* Table, that contains this constraint. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table") @get:JvmName("table")
public val table: Table<TableUserExtension, *> public val table: Table<TableUserExtension, *>
/** public interface Creator<ConstraintUserExtension : Any, RT, DT : DatabaseType<RT>, TargetTableUserExtension : Any> {
* Column which will get value from this constraint if not initialized manually. For debugging. public fun createCheckConstraint(scope: Scope<ConstraintUserExtension, RT, DT, TargetTableUserExtension>)
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("attachedToColumn")
public val attachedToColumn: Column<RT, DT, TableUserExtension>
/** public interface Scope<ConstraintUserExtension : Any, rRT, rDT : DatabaseType<rRT>, TargetTableUserExtension : Any> {
* Expression used to initialize cell. public var result: IntermediateColumn<rRT, rDT, ConstraintUserExtension>
*/ public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, ConstraintUserExtension>
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("expression") public fun <ReferencedTableUserExtension : Any, RT, DT : DatabaseType<RT>> followReference(
public val expression: Expression<RT, DT, TableUserExtension> ref: IntermediateColumn<*, DatabaseType.ROW_ID<ReferencedTableUserExtension>, ConstraintUserExtension>,
column: Column<RT, DT, ReferencedTableUserExtension>
): IntermediateColumn<RT, DT, ReferencedTableUserExtension>
public val builtinExpressions: BuiltinExpressionsProvider<ConstraintUserExtension>
public fun <ExpressionUserExtension : Any> mapColumns(
expression: Expression<ExpressionUserExtension>,
input: Expression.InputLinker<ExpressionUserExtension, ConstraintUserExtension>,
output: Expression.OutputLinker<ExpressionUserExtension, ConstraintUserExtension>
)
}
}
} }

View File

@ -7,8 +7,6 @@ import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExtension : Any> : CreateTableScope<TableNewUserExtension> { public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExtension : Any> : CreateTableScope<TableNewUserExtension> {
public val oldExpressionBuilder: BuiltinExpressionsProvider<TableOldUserExtension>
public fun <RT, DT : DatabaseType<RT>> keepColumn(c: Column<RT, DT, TableOldUserExtension>): Column<RT, DT, TableNewUserExtension> public fun <RT, DT : DatabaseType<RT>> keepColumn(c: Column<RT, DT, TableOldUserExtension>): Column<RT, DT, TableNewUserExtension>
public fun <RT, DT : DatabaseType<RT>> keepColumnUntilUpgrading(c: Column<RT, DT, TableOldUserExtension>): Column<RT, DT, TableNewUserExtension> public fun <RT, DT : DatabaseType<RT>> keepColumnUntilUpgrading(c: Column<RT, DT, TableOldUserExtension>): Column<RT, DT, TableNewUserExtension>
public fun <RT, DT : DatabaseType<RT>> renameAndKeepColumn(c: Column<RT, DT, TableOldUserExtension>, newName: String): Column<RT, DT, TableNewUserExtension> public fun <RT, DT : DatabaseType<RT>> renameAndKeepColumn(c: Column<RT, DT, TableOldUserExtension>, newName: String): Column<RT, DT, TableNewUserExtension>
@ -26,9 +24,9 @@ public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExten
public fun renameAndKeepUniqueIndex(i: UniqueIndex<TableOldUserExtension>, newName: String): UniqueIndex<TableNewUserExtension> public fun renameAndKeepUniqueIndex(i: UniqueIndex<TableOldUserExtension>, newName: String): UniqueIndex<TableNewUserExtension>
public fun deleteUniqueIndex(i: UniqueIndex<TableOldUserExtension>) public fun deleteUniqueIndex(i: UniqueIndex<TableOldUserExtension>)
public fun <RT, DT : DatabaseType<RT>> keepDefaultValue(c: Column<RT, DT, TableNewUserExtension>, d: DefaultConstraint<RT, DT, TableOldUserExtension>): DefaultConstraint<RT, DT, TableNewUserExtension> public fun <RT, DT : DatabaseType<RT>> keepDefaultValue(c: Column<RT, DT, TableNewUserExtension>, d: DefaultConstraint<TableOldUserExtension>): DefaultConstraint<TableNewUserExtension>
public fun <RT, DT : DatabaseType<RT>> changeDefaultValue(c: Column<RT, DT, TableNewUserExtension>, d: DefaultConstraint<*, *, TableOldUserExtension>): DefaultConstraint<RT, DT, TableNewUserExtension> public fun <RT, DT : DatabaseType<RT>> changeDefaultValue(c: Column<RT, DT, TableNewUserExtension>, d: DefaultConstraint<TableOldUserExtension>): DefaultConstraint<TableNewUserExtension>
public fun deleteDefaultValue(i: DefaultConstraint<*, *, TableOldUserExtension>) public fun deleteDefaultValue(i: DefaultConstraint<TableOldUserExtension>)
public fun <TargetTableUserWrapper : Any> keepForeignRowReference( public fun <TargetTableUserWrapper : Any> keepForeignRowReference(
frr: ForeignRowReference<TableOldUserExtension, TargetTableUserWrapper>, frr: ForeignRowReference<TableOldUserExtension, TargetTableUserWrapper>,