From ac7df3393f5694ca51a53fc95932e0dbe9614f82 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Wed, 4 Dec 2024 06:07:53 +0300 Subject: [PATCH] Nullable types --- .../landgrafhomyak/serdha/api/v0/Expression.kt | 4 ++-- .../landgrafhomyak/serdha/api/v0/ddl/Column.kt | 2 +- .../serdha/api/v0/ddl/ColumnType.kt | 17 +++++++++++++---- .../landgrafhomyak/serdha/api/v0/ddl/RowId.kt | 3 ++- .../serdha/api/v0/ddl/TableCreator.kt | 14 -------------- .../serdha/api/v0/ddl/TableUpdater.kt | 8 ++++---- .../serdha/api/v0/dml/InputParam.kt | 2 +- .../serdha/api/v0/dml/InsertCreator.kt | 15 +++++++-------- .../serdha/api/v0/dml/SelectedTable.kt | 2 +- .../serdha/api/v0/dml/UpdateCreator.kt | 4 ++-- .../serdha/api/v0/dml/_CommonQueryMethods.kt | 7 +++---- 11 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt index 697612d..c36f3d2 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt @@ -2,9 +2,9 @@ package ru.landgrafhomyak.serdha.api.v0 import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType -public interface Expression, OwnerBuilderUserExtension : Any> { +public interface Expression, OwnerBuilderUserExtension : Any> { public interface Builder { - public fun > equals( + public fun > equals( left: Expression, right: Expression ): Expression diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt index a6fa7d1..c2689e3 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt @@ -1,6 +1,6 @@ package ru.landgrafhomyak.serdha.api.v0.ddl -public interface Column, TableUserExtension : Any> { +public interface Column, TableUserExtension : Any> { public val name: String public val type: DatabaseType diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt index 4767027..7caadad 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt @@ -7,17 +7,26 @@ import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalTime @Suppress("ClassName") -public abstract class ColumnType { +public abstract class ColumnType { public abstract val typeName: String abstract override fun toString(): String - public sealed class _StandardType : ColumnType() { + public sealed class _StandardType : ColumnType() { override fun toString(): String = "" } - public abstract class _VirtualType(public val wraps: ColumnType) { - override fun toString(): String = "" + public abstract class _VirtualType(@Suppress("MemberVisibilityCanBePrivate") public val wraps: ColumnType) { + override fun toString(): String = "" + } + + public class NULLABLE(@Suppress("MemberVisibilityCanBePrivate") public val notNullType: ColumnType) : _StandardType() { + init { + if (this.notNullType is NULLABLE<*>) + throw IllegalArgumentException("Type can't be nullable twice") + } + + override val typeName: String = this.notNullType.typeName + "?" } public object ROW_ID : _StandardType>() { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt index 45c4670..6bb95d3 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt @@ -1,3 +1,4 @@ package ru.landgrafhomyak.serdha.api.v0.ddl -public interface RowId \ No newline at end of file + +public interface RowId<@Suppress("unused") OwnerTableUserExtension: Any> \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt index 7885df2..46f5a63 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt @@ -13,22 +13,8 @@ public interface TableCreator { */ public fun > column(name: String, type: DatabaseType): Column - @Suppress("INAPPLICABLE_JVM_NAME") - @JvmName("nullableColumn\$notNull") - @Deprecated("This column can be not-null", replaceWith = ReplaceWith("this.column")) - public fun > nullableColumn(name: String, type: DatabaseType): Column = - this.nullableColumn(name, type) - - /** - * Offers column of type [D][type] named [name] and runtime type [R?][RuntimeType]. - * - * @return Descriptor of offered column for future operations. - */ - public fun > nullableColumn(name: String, type: DatabaseType): Column - public fun index(name: String, vararg columns: Column<*, *, TableUserExtension>): Index - // todo not-null column uniqueness public fun unique(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserExtension>): UniqueConstraint public fun check(name: String, constraint: Expression): CheckConstraint diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt index 641a453..30f53eb 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt @@ -4,10 +4,10 @@ import ru.landgrafhomyak.serdha.api.v0.Expression public interface TableUpdater : TableCreator { - public fun > keepColumn(c: Column): Column - public fun > renameColumn(c: Column, newName: String): Column - public fun > mapColumn(c: Column, newValue: Expression, where: Expression?) - public fun > mapColumn(c: Column, newValue: Expression): Unit = this.mapColumn(c, newValue, null) + public fun > keepColumn(c: Column): Column + public fun > renameColumn(c: Column, newName: String): Column + public fun > mapColumn(c: Column, newValue: Expression, where: Expression?) + public fun > mapColumn(c: Column, newValue: Expression): Unit = this.mapColumn(c, newValue, null) public fun deleteColumn(c: Column<*, *, TableOldUserExtension>) public fun keepIndex(i: Index): Index diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt index b65f28d..4ef1d38 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt @@ -3,7 +3,7 @@ package ru.landgrafhomyak.serdha.api.v0.dml import ru.landgrafhomyak.serdha.api.v0.Expression import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType -public interface InputParam, OwnerQueryUserExtension : Any> : Expression { +public interface InputParam, OwnerQueryUserExtension : Any> : Expression { public val name: String public val userWrapper: OwnerQueryUserExtension } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt index f2a9f45..93f3362 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt @@ -10,9 +10,9 @@ public interface InsertCreator { - public fun > oldColumnValue(c: Column): Expression + public fun > oldColumnValue(c: Column): Expression - public fun > updateColumn(c: Column, e: Expression) + public fun > updateColumn(c: Column, e: Expression) } public fun onConflictUpdate(u: UniqueConstraint, c: (_UpsertCreator) -> Unit) @@ -25,7 +25,7 @@ public interface InsertCreator { - public fun > oldColumnValue(c: Column): Expression + public fun > oldColumnValue(c: Column): Expression } public fun returningUpdated(s: (_ReturningUpdated) -> Unit) @@ -35,19 +35,18 @@ public interface InsertCreator> - public fun > dataParam(name: String, type: DatabaseType): InputParam> - public fun > nullableDataParam(name: String, type: DatabaseType): InputParam> + public fun > dataParam(name: String, type: DatabaseType): InputParam> - public fun > insertParam( + public fun > insertParam( column: Column, paramName: String = column.name ): InputParam> - public fun > insert(column: Column, expression: Expression>) + public fun > insert(column: Column, expression: Expression>) } public interface InsertFromQuery : InsertCreator { - public fun > insert(column: Column, expression: Expression) + public fun > insert(column: Column, expression: Expression) } } diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt index a3706a2..0bb0388 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt @@ -5,5 +5,5 @@ import ru.landgrafhomyak.serdha.api.v0.ddl.Column import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType public interface SelectedTable { - public fun > selectColumn(column: Column): Expression + public fun > selectColumn(column: Column): Expression } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt index 9e9c558..8379df4 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt @@ -8,9 +8,9 @@ import ru.landgrafhomyak.serdha.api.v0.ddl.Table public interface UpdateCreator : _CommonQueryMethods { public val targetTable: SelectedTable - public fun > selectOldColumnValue(c: Column): Expression + public fun > selectOldColumnValue(c: Column): Expression - public fun > updateColumn(c: Column, e: Expression) + public fun > updateColumn(c: Column, e: Expression) public fun where(expression: Expression) diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt index a067829..07a2d6d 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt @@ -13,18 +13,17 @@ public interface _CommonQueryMethods { public interface CanBeSubquery<@Suppress("unused") SelectedQueryUserExtension : Any> public interface SubqueryParametersSetter : ParametersSetter { - public operator fun > set(c: InputParam, value: Expression) + public operator fun > set(c: InputParam, value: Expression) } public fun selectingQuery(q: CanBeSubquery, p: (SubqueryParametersSetter) -> Unit): SelectedTable - public fun > param(name: String, type: DatabaseType): InputParam - public fun > nullableParam(name: String, type: DatabaseType): InputParam + public fun > param(name: String, type: DatabaseType): InputParam public val expressionBuilder: Expression.Builder public interface _Returning { - public fun > returnExpression(expression: Expression): Column + public fun > returnExpression(expression: Expression): Column public val isDistinct: Boolean