Renaming 'Expression' to 'IntermediateColumn' and then 'RuntimeExpression' to 'Expression', added support for expressions and other improvements in 'SELECT'

This commit is contained in:
Andrew Golovashevich 2025-01-24 22:15:02 +03:00
parent a0243487f8
commit 838c674fe0
11 changed files with 76 additions and 61 deletions

View File

@ -0,0 +1,4 @@
package ru.landgrafhomyak.serdha.api.v0.misc
public interface BuiltinExpressionsProvider<OwnerQueryUserExtension: Any> {
}

View File

@ -1,7 +1,41 @@
package ru.landgrafhomyak.serdha.api.v0.misc package ru.landgrafhomyak.serdha.api.v0.misc
public interface Expression<RT, DT : DatabaseType<RT>, OwnerBuilderUserExtension : Any> { import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
public interface Builder<OwnerBuilderUserExtension : Any> { import ru.landgrafhomyak.serdha.api.v0.runtime.Row
public interface Expression<ExpressionUserExtension : Any> {
public val userExtension: ExpressionUserExtension
public interface RuntimeExpressionInput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : Column<RT, DT, ExpressionUserExtension>
public interface RuntimeExpressionOutput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : Input.Column<RT, DT, ExpressionUserExtension>
public fun interface InputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public operator fun <RT, DT : DatabaseType<RT>> set(p: RuntimeExpressionInput<RT, DT, ExpressionUserExtension>, e: IntermediateColumn<RT, DT, QueryUserExtension>)
}
}
public fun interface OutputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public operator fun <RT, DT : DatabaseType<RT>> get(p: RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
}
}
public interface Creator<ExpressionUserExtension : Any> {
public fun createExpression(creator: Scope<ExpressionUserExtension>): ExpressionUserExtension
public interface Scope<ExpressionUserExtension : Any> {
public fun <RT, DT : DatabaseType<RT>> input(name: String, type: DT): RuntimeExpressionInput<RT, DT, ExpressionUserExtension>
public fun <RT, DT : DatabaseType<RT>> output(name: String, type: DT): RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>
public var action: Action<ExpressionUserExtension>
}
}
public interface Action<ExpressionUserExtension : Any> {
public fun calculate(input: Row<ExpressionUserExtension>, output: ParametersSetter<ExpressionUserExtension>)
} }
} }

View File

@ -1,9 +1,9 @@
package ru.landgrafhomyak.serdha.api.v0.misc package ru.landgrafhomyak.serdha.api.v0.misc
public interface Input<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : Expression<RT, DT, OwnerQueryUserExtension> { public interface Input<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : IntermediateColumn<RT, DT, OwnerQueryUserExtension> {
public val name: String public val name: String
public val userWrapper: OwnerQueryUserExtension public val userWrapper: OwnerQueryUserExtension
public interface QueryParam<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : Expression<RT, DT, OwnerQueryUserExtension> public interface QueryParam<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : IntermediateColumn<RT, DT, OwnerQueryUserExtension>
public interface Column<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : Expression<RT, DT, OwnerQueryUserExtension> public interface Column<RT, DT : DatabaseType<RT>, OwnerQueryUserExtension : Any> : IntermediateColumn<RT, DT, OwnerQueryUserExtension>
} }

View File

@ -0,0 +1,5 @@
package ru.landgrafhomyak.serdha.api.v0.misc
public interface IntermediateColumn<RT, DT : DatabaseType<RT>, OwnerBuilderUserExtension : Any> {
}

View File

@ -1,41 +0,0 @@
package ru.landgrafhomyak.serdha.api.v0.misc
import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
import ru.landgrafhomyak.serdha.api.v0.runtime.Row
public interface RuntimeExpression<ExpressionUserExtension : Any> {
public val userExtension: ExpressionUserExtension
public interface RuntimeExpressionInput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : Column<RT, DT, ExpressionUserExtension>
public interface RuntimeExpressionOutput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : Input.QueryParam<RT, DT, ExpressionUserExtension>
public fun interface InputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public operator fun <RT, DT : DatabaseType<RT>> set(p: RuntimeExpressionInput<RT, DT, ExpressionUserExtension>, e: Expression<RT, DT, QueryUserExtension>)
}
}
public fun interface OutputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
public operator fun <RT, DT : DatabaseType<RT>> get(p: RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>): Expression<RT, DT, QueryUserExtension>
}
}
public interface Creator<ExpressionUserExtension : Any> {
public fun createExpression(creator: Scope<ExpressionUserExtension>): ExpressionUserExtension
public interface Scope<ExpressionUserExtension : Any> {
public fun <RT, DT : DatabaseType<RT>> input(name: String, type: DT): RuntimeExpressionInput<RT, DT, ExpressionUserExtension>
public fun <RT, DT : DatabaseType<RT>> output(name: String, type: DT): RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>
public var action: Action<ExpressionUserExtension>
}
}
public interface Action<ExpressionUserExtension : Any> {
public fun calculate(input: Row<ExpressionUserExtension>, output: ParametersSetter<ExpressionUserExtension>)
}
}

View File

@ -1,3 +1,3 @@
package ru.landgrafhomyak.serdha.api.v0.misc package ru.landgrafhomyak.serdha.api.v0.misc
public interface SelectedColumn<RT, DT : DatabaseType<RT>, @Suppress("unused") OwnerTableUserExtension : Any, OwnerBuilderUserExtension : Any> : Expression<RT, DT, OwnerBuilderUserExtension> public interface SelectedColumn<RT, DT : DatabaseType<RT>, @Suppress("unused") OwnerTableUserExtension : Any, OwnerBuilderUserExtension : Any> : IntermediateColumn<RT, DT, OwnerBuilderUserExtension>

View File

@ -1,7 +1,9 @@
package ru.landgrafhomyak.serdha.api.v0.queries package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.Column
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
import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable
public interface SelectQuery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> { public interface SelectQuery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> {
@ -13,11 +15,20 @@ public interface SelectQuery<QueryUserExtension : Any> : _Selectable<QueryUserEx
@Suppress("ClassName") @Suppress("ClassName")
public interface _CommonSelectCreatorScope<QueryUserExtension : Any> { public interface _CommonSelectCreatorScope<QueryUserExtension : Any> {
public fun where(expression: Expression<Boolean, DatabaseType.BOOLEAN, QueryUserExtension>) public fun where(expression: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, QueryUserExtension>)
public fun orderBy(order: Order, vararg expression: IntermediateColumn<*, *, QueryUserExtension>)
public var limit: UInt public var limit: UInt
public var offset: ULong public var offset: ULong
public fun <RT, DT : DatabaseType<RT>> returnColumn(expr: IntermediateColumn<RT, DT, QueryUserExtension>): Column<RT, DT, QueryUserExtension>
public fun <ExpressionUserExtension : Any> mapColumns(
expression: Expression<ExpressionUserExtension>,
input: Expression.InputLinker<ExpressionUserExtension, QueryUserExtension>,
output: Expression.OutputLinker<ExpressionUserExtension, QueryUserExtension>
)
} }
public interface JoinCreator<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> { public interface JoinCreator<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> {

View File

@ -1,6 +1,7 @@
package ru.landgrafhomyak.serdha.api.v0.queries package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.BuiltinExpressionsProvider
import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider
@ -11,14 +12,14 @@ import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
public interface _CommonCreateQueryScope<QueryUserExtension : Any> { public interface _CommonCreateQueryScope<QueryUserExtension : Any> {
public val types: DatabaseTypesProvider public val types: DatabaseTypesProvider
public val expressionBuilder: Expression.Builder<QueryUserExtension> public val expressionBuilder: BuiltinExpressionsProvider<QueryUserExtension>
public interface SubqueryParametersSetter<SubqueryUserExtension : Any, QueryUserExtension : Any> : ParametersSetter<SubqueryUserExtension> { public interface SubqueryParametersSetter<SubqueryUserExtension : Any, QueryUserExtension : Any> : ParametersSetter<SubqueryUserExtension> {
public operator fun <RT, DT : DatabaseType<RT>> set(c: Input.QueryParam<RT, DT, QueryUserExtension>, value: Expression<RT, DT, QueryUserExtension>) public operator fun <RT, DT : DatabaseType<RT>> set(c: Input.QueryParam<RT, DT, QueryUserExtension>, value: IntermediateColumn<RT, DT, QueryUserExtension>)
} }
public interface _ReturningClauseScope<QueryUserExtension : Any> { public interface _ReturningClauseScope<QueryUserExtension : Any> {
public fun <RT, DT : DatabaseType<RT>> returnExpression(expression: Expression<RT, DT, QueryUserExtension>): Column<RT, DT, QueryUserExtension> public fun <RT, DT : DatabaseType<RT>> returnExpression(expression: IntermediateColumn<RT, DT, QueryUserExtension>): Column<RT, DT, QueryUserExtension>
public var isDistinct: Boolean public var isDistinct: Boolean

View File

@ -1,6 +1,6 @@
package ru.landgrafhomyak.serdha.api.v0.queries package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
@ -12,9 +12,9 @@ public interface _CreateInsertOrCopyQueryScope<QueryUserExtension : Any, TargetT
@Suppress("ClassName") @Suppress("ClassName")
public interface _UpsertClauseScope<QueryUserExtension : Any, TargetTableUserExtension : Any> { public interface _UpsertClauseScope<QueryUserExtension : Any, TargetTableUserExtension : Any> {
public fun <RT, DT : DatabaseType<RT>> oldColumnValue(c: Column<RT, DT, TargetTableUserExtension>): Expression<RT, DT, QueryUserExtension> public fun <RT, DT : DatabaseType<RT>> oldColumnValue(c: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
public fun <RT, DT : DatabaseType<RT>> updateColumn(c: Column<RT, DT, TargetTableUserExtension>, e: Expression<RT, DT, QueryUserExtension>) public fun <RT, DT : DatabaseType<RT>> updateColumn(c: Column<RT, DT, TargetTableUserExtension>, e: IntermediateColumn<RT, DT, QueryUserExtension>)
} }
public fun onConflictUpdate(u: UniqueIndex<TargetTableUserExtension>, c: (_UpsertClauseScope<QueryUserExtension, TargetTableUserExtension>) -> Unit) public fun onConflictUpdate(u: UniqueIndex<TargetTableUserExtension>, c: (_UpsertClauseScope<QueryUserExtension, TargetTableUserExtension>) -> Unit)
@ -27,7 +27,7 @@ public interface _CreateInsertOrCopyQueryScope<QueryUserExtension : Any, TargetT
@Suppress("ClassName") @Suppress("ClassName")
public interface _ReturningUpdatedClauseScope<QueryUserExtension : Any, TargetTableUserExtension : Any> : _CommonCreateQueryScope._ReturningClauseScope<QueryUserExtension> { public interface _ReturningUpdatedClauseScope<QueryUserExtension : Any, TargetTableUserExtension : Any> : _CommonCreateQueryScope._ReturningClauseScope<QueryUserExtension> {
public fun <RT, DT : DatabaseType<RT>> oldColumnValue(c: Column<RT, DT, TargetTableUserExtension>): Expression<RT, DT, QueryUserExtension> public fun <RT, DT : DatabaseType<RT>> oldColumnValue(c: Column<RT, DT, TargetTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
} }
public val returningUpdated: _ReturningUpdatedClauseScope<QueryUserExtension, TargetTableUserExtension> public val returningUpdated: _ReturningUpdatedClauseScope<QueryUserExtension, TargetTableUserExtension>

View File

@ -1,12 +1,12 @@
package ru.landgrafhomyak.serdha.api.v0.table package ru.landgrafhomyak.serdha.api.v0.table
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.DatabaseType 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: Expression.Builder<TableUserExtension> public val expressionBuilder: BuiltinExpressionsProvider<TableUserExtension>
public val types: DatabaseTypesProvider public val types: DatabaseTypesProvider

View File

@ -1,12 +1,13 @@
package ru.landgrafhomyak.serdha.api.v0.table package ru.landgrafhomyak.serdha.api.v0.table
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
public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExtension : Any> : CreateTableScope<TableNewUserExtension> { public interface UpdateTableScope<TableNewUserExtension : Any, TableOldUserExtension : Any> : CreateTableScope<TableNewUserExtension> {
public val oldExpressionBuilder: Expression.Builder<TableOldUserExtension> 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>