From 838c674fe034b0329e39967562881f9d78ea5b04 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Fri, 24 Jan 2025 22:15:02 +0300 Subject: [PATCH] Renaming 'Expression' to 'IntermediateColumn' and then 'RuntimeExpression' to 'Expression', added support for expressions and other improvements in 'SELECT' --- .../api/v0/misc/BuiltinExpressionsProvider.kt | 4 ++ .../serdha/api/v0/misc/Expression.kt | 38 ++++++++++++++++- .../serdha/api/v0/misc/Input.kt | 6 +-- .../serdha/api/v0/misc/IntermediateColumn.kt | 5 +++ .../serdha/api/v0/misc/RuntimeExpression.kt | 41 ------------------- .../serdha/api/v0/misc/SelectedColumn.kt | 2 +- .../serdha/api/v0/queries/SelectQuery.kt | 15 ++++++- .../api/v0/queries/_CommonCreateQueryScope.kt | 9 ++-- .../queries/_CreateInsertOrCopyQueryScope.kt | 8 ++-- .../serdha/api/v0/table/CreateTableScope.kt | 4 +- .../serdha/api/v0/table/UpdateTableScope.kt | 5 ++- 11 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/BuiltinExpressionsProvider.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/IntermediateColumn.kt delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/BuiltinExpressionsProvider.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/BuiltinExpressionsProvider.kt new file mode 100644 index 0000000..991c7ab --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/BuiltinExpressionsProvider.kt @@ -0,0 +1,4 @@ +package ru.landgrafhomyak.serdha.api.v0.misc + +public interface BuiltinExpressionsProvider { +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Expression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Expression.kt index 1358cd7..bb95488 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Expression.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Expression.kt @@ -1,7 +1,41 @@ package ru.landgrafhomyak.serdha.api.v0.misc -public interface Expression, OwnerBuilderUserExtension : Any> { - public interface Builder { +import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter +import ru.landgrafhomyak.serdha.api.v0.runtime.Row +public interface Expression { + public val userExtension: ExpressionUserExtension + + public interface RuntimeExpressionInput, ExpressionUserExtension : Any> : Column + public interface RuntimeExpressionOutput, ExpressionUserExtension : Any> : Input.Column + + public fun interface InputLinker { + public fun link(linker: Scope) + + public interface Scope { + public operator fun > set(p: RuntimeExpressionInput, e: IntermediateColumn) + } + } + + public fun interface OutputLinker { + public fun link(linker: Scope) + + public interface Scope { + public operator fun > get(p: RuntimeExpressionOutput): IntermediateColumn + } + } + + public interface Creator { + public fun createExpression(creator: Scope): ExpressionUserExtension + + public interface Scope { + public fun > input(name: String, type: DT): RuntimeExpressionInput + public fun > output(name: String, type: DT): RuntimeExpressionOutput + public var action: Action + } + } + + public interface Action { + public fun calculate(input: Row, output: ParametersSetter) } } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Input.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Input.kt index 13c50a4..de032ca 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Input.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/Input.kt @@ -1,9 +1,9 @@ package ru.landgrafhomyak.serdha.api.v0.misc -public interface Input, OwnerQueryUserExtension : Any> : Expression { +public interface Input, OwnerQueryUserExtension : Any> : IntermediateColumn { public val name: String public val userWrapper: OwnerQueryUserExtension - public interface QueryParam, OwnerQueryUserExtension : Any> : Expression - public interface Column, OwnerQueryUserExtension : Any> : Expression + public interface QueryParam, OwnerQueryUserExtension : Any> : IntermediateColumn + public interface Column, OwnerQueryUserExtension : Any> : IntermediateColumn } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/IntermediateColumn.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/IntermediateColumn.kt new file mode 100644 index 0000000..522ea83 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/IntermediateColumn.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0.misc + +public interface IntermediateColumn, OwnerBuilderUserExtension : Any> { + +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt deleted file mode 100644 index 6818466..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt +++ /dev/null @@ -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 { - public val userExtension: ExpressionUserExtension - - public interface RuntimeExpressionInput, ExpressionUserExtension : Any> : Column - public interface RuntimeExpressionOutput, ExpressionUserExtension : Any> : Input.QueryParam - - public fun interface InputLinker { - public fun link(linker: Scope) - - public interface Scope { - public operator fun > set(p: RuntimeExpressionInput, e: Expression) - } - } - - public fun interface OutputLinker { - public fun link(linker: Scope) - - public interface Scope { - public operator fun > get(p: RuntimeExpressionOutput): Expression - } - } - - public interface Creator { - public fun createExpression(creator: Scope): ExpressionUserExtension - - public interface Scope { - public fun > input(name: String, type: DT): RuntimeExpressionInput - public fun > output(name: String, type: DT): RuntimeExpressionOutput - public var action: Action - } - } - - public interface Action { - public fun calculate(input: Row, output: ParametersSetter) - } -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt index d69d581..12c7069 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/SelectedColumn.kt @@ -1,3 +1,3 @@ package ru.landgrafhomyak.serdha.api.v0.misc -public interface SelectedColumn, @Suppress("unused") OwnerTableUserExtension : Any, OwnerBuilderUserExtension : Any> : Expression \ No newline at end of file +public interface SelectedColumn, @Suppress("unused") OwnerTableUserExtension : Any, OwnerBuilderUserExtension : Any> : IntermediateColumn \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt index 117b25a..5ed1417 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/SelectQuery.kt @@ -1,7 +1,9 @@ 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.Expression import ru.landgrafhomyak.serdha.api.v0.misc.SelectedTable public interface SelectQuery : _Selectable { @@ -13,11 +15,20 @@ public interface SelectQuery : _Selectable { - public fun where(expression: Expression) + public fun where(expression: IntermediateColumn) + public fun orderBy(order: Order, vararg expression: IntermediateColumn<*, *, QueryUserExtension>) public var limit: UInt public var offset: ULong + + public fun > returnColumn(expr: IntermediateColumn): Column + + public fun mapColumns( + expression: Expression, + input: Expression.InputLinker, + output: Expression.OutputLinker + ) } public interface JoinCreator : _CommonSelectCreatorScope { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CommonCreateQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CommonCreateQueryScope.kt index 6b56665..4089eec 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CommonCreateQueryScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CommonCreateQueryScope.kt @@ -1,6 +1,7 @@ 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.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider @@ -11,14 +12,14 @@ import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter public interface _CommonCreateQueryScope { public val types: DatabaseTypesProvider - public val expressionBuilder: Expression.Builder + public val expressionBuilder: BuiltinExpressionsProvider public interface SubqueryParametersSetter : ParametersSetter { - public operator fun > set(c: Input.QueryParam, value: Expression) + public operator fun > set(c: Input.QueryParam, value: IntermediateColumn) } public interface _ReturningClauseScope { - public fun > returnExpression(expression: Expression): Column + public fun > returnExpression(expression: IntermediateColumn): Column public var isDistinct: Boolean diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CreateInsertOrCopyQueryScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CreateInsertOrCopyQueryScope.kt index deabfea..9559d42 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CreateInsertOrCopyQueryScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_CreateInsertOrCopyQueryScope.kt @@ -1,6 +1,6 @@ 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.table.UniqueIndex import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType @@ -12,9 +12,9 @@ public interface _CreateInsertOrCopyQueryScope { - public fun > oldColumnValue(c: Column): Expression + public fun > oldColumnValue(c: Column): IntermediateColumn - public fun > updateColumn(c: Column, e: Expression) + public fun > updateColumn(c: Column, e: IntermediateColumn) } public fun onConflictUpdate(u: UniqueIndex, c: (_UpsertClauseScope) -> Unit) @@ -27,7 +27,7 @@ public interface _CreateInsertOrCopyQueryScope : _CommonCreateQueryScope._ReturningClauseScope { - public fun > oldColumnValue(c: Column): Expression + public fun > oldColumnValue(c: Column): IntermediateColumn } public val returningUpdated: _ReturningUpdatedClauseScope diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/CreateTableScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/CreateTableScope.kt index 8b5d432..dd472a4 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/CreateTableScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/CreateTableScope.kt @@ -1,12 +1,12 @@ 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.Expression import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider public interface CreateTableScope { - public val expressionBuilder: Expression.Builder + public val expressionBuilder: BuiltinExpressionsProvider public val types: DatabaseTypesProvider diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/UpdateTableScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/UpdateTableScope.kt index ba70b2b..e686aa6 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/UpdateTableScope.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/table/UpdateTableScope.kt @@ -1,12 +1,13 @@ 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.Expression +import ru.landgrafhomyak.serdha.api.v0.misc.IntermediateColumn import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType public interface UpdateTableScope : CreateTableScope { - public val oldExpressionBuilder: Expression.Builder + public val oldExpressionBuilder: BuiltinExpressionsProvider public fun > keepColumn(c: Column): Column public fun > keepColumnUntilUpgrading(c: Column): Column