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
import ru.landgrafhomyak.serdha.api.v0.misc.BuiltinExpressionsProvider
import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
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>> paramAsColumn(param: QueryParam<RT, DT, QueryUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
public val builtinExpressions: BuiltinExpressionsProvider<QueryUserExtension>
public fun <ExpressionUserExtension : Any> mapColumns(
expression: Expression<ExpressionUserExtension>,
input: Expression.InputLinker<ExpressionUserExtension, QueryUserExtension>,

View File

@ -1,43 +1,39 @@
package ru.landgrafhomyak.serdha.api.v0.table
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.Expression
import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
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> {
/**
* Name of constraint for debugging, errors and raw schema access.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name")
public val name: String
/**
* Table that contains this constraint. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table")
public val table: Table<TableUserExtension, *>
public interface Creator<ConstraintUserExtension : Any, TargetTableUserExtension : Any> {
public fun createCheckConstraint(scope: Scope<ConstraintUserExtension, TargetTableUserExtension>)
/**
* Expression used to check data.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("expression")
public val expression: Expression<Boolean, DatabaseType.BOOLEAN, TableUserExtension>
public interface Scope<ConstraintUserExtension : Any, TargetTableUserExtension : Any> {
public var result: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, ConstraintUserExtension>
public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, ConstraintUserExtension>
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>
/**
* Set of columns, checked by this constraint. Calculated from [CheckConstraint.expression]. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("affectedColumns")
public val affectedColumns: List<Column<*, *, TableUserExtension>>
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

@ -6,8 +6,6 @@ import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider
public interface CreateTableScope<TableUserExtension : Any> {
public val expressionBuilder: BuiltinExpressionsProvider<TableUserExtension>
public val types: DatabaseTypesProvider
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 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 <RT : Any, DT : DatabaseType<RT>> defaultValue(c: Column<RT, DT, TableUserExtension>, expr: Expression<RT, DT, TableUserExtension>): DefaultConstraint<RT, DT, TableUserExtension>
public fun <ConstraintUserExtension : Any> checkConstraint(name: String, creator: CheckConstraint.Creator<ConstraintUserExtension, TableUserExtension>, recheckExistingRows: Boolean = false): CheckConstraint<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")
public val rowId_column: Column<RowId<TableUserExtension>, DatabaseType<RowId<TableUserExtension>>, TableUserExtension>

View File

@ -1,43 +1,39 @@
package ru.landgrafhomyak.serdha.api.v0.table
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.Expression
import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.Expression
/**
* 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.
*/
public interface DefaultConstraint<TableUserExtension : Any> {
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("name")
public val name: String
/**
* Table, that contains this constraint. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table")
public val table: Table<TableUserExtension, *>
/**
* Column which will get value from this constraint if not initialized manually. For debugging.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("attachedToColumn")
public val attachedToColumn: Column<RT, DT, TableUserExtension>
public interface Creator<ConstraintUserExtension : Any, RT, DT : DatabaseType<RT>, TargetTableUserExtension : Any> {
public fun createCheckConstraint(scope: Scope<ConstraintUserExtension, RT, DT, TargetTableUserExtension>)
/**
* Expression used to initialize cell.
*/
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("expression")
public val expression: Expression<RT, DT, TableUserExtension>
public interface Scope<ConstraintUserExtension : Any, rRT, rDT : DatabaseType<rRT>, TargetTableUserExtension : Any> {
public var result: IntermediateColumn<rRT, rDT, ConstraintUserExtension>
public fun <RT, DT : DatabaseType<RT>> selectFromTargetTable(column: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, ConstraintUserExtension>
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>
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 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>> 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>
@ -26,9 +24,9 @@ public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExten
public fun renameAndKeepUniqueIndex(i: UniqueIndex<TableOldUserExtension>, newName: String): UniqueIndex<TableNewUserExtension>
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>> changeDefaultValue(c: Column<RT, DT, TableNewUserExtension>, d: DefaultConstraint<*, *, TableOldUserExtension>): DefaultConstraint<RT, DT, TableNewUserExtension>
public fun deleteDefaultValue(i: DefaultConstraint<*, *, TableOldUserExtension>)
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<TableNewUserExtension>
public fun deleteDefaultValue(i: DefaultConstraint<TableOldUserExtension>)
public fun <TargetTableUserWrapper : Any> keepForeignRowReference(
frr: ForeignRowReference<TableOldUserExtension, TargetTableUserWrapper>,