From 5bc1f1dfca0cbb1ccff24c70be59a05de814fffa Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Thu, 30 Jan 2025 22:29:38 +0300 Subject: [PATCH] Conditions clause was replaced with filters --- .../serdha/api/v0/misc/DatabaseType.kt | 49 +++++++++++++------ .../api/v0/misc/DatabaseTypesProvider.kt | 49 ------------------- .../serdha/api/v0/misc/FiltersScope.kt | 20 ++++++++ .../serdha/api/v0/queries/DeleteQuery.kt | 5 +- .../serdha/api/v0/queries/InsertQuery.kt | 3 +- .../serdha/api/v0/queries/SelectQuery.kt | 6 +-- .../serdha/api/v0/queries/UpdateQuery.kt | 7 ++- .../serdha/api/v0/table/CreateTableScope.kt | 4 +- 8 files changed, 63 insertions(+), 80 deletions(-) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseTypesProvider.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/FiltersScope.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseType.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseType.kt index f4abc53..b746d7f 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseType.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseType.kt @@ -2,11 +2,8 @@ package ru.landgrafhomyak.serdha.api.v0.misc import kotlin.jvm.JvmField import kotlin.jvm.JvmName -import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDate -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.LocalTime import ru.landgrafhomyak.serdha.api.v0.table.RowId +import ru.landgrafhomyak.serdha.api.v0.table.Table /** * Descriptor of a database type. @@ -19,33 +16,32 @@ public interface DatabaseType<@Suppress("unused") RuntimeType> { @get:JvmName("name") public val name: String - public abstract class _VirtualType( + public abstract class _VirtualType>( @Suppress("MemberVisibilityCanBePrivate") @JvmField - public val wraps: DatabaseType - ) : DatabaseType { + public val wraps: wDT + ) : DatabaseType { @Suppress("FunctionName") - public abstract fun _unwrap(w: WRT): SRT + public abstract fun _unwrap(w: wRT): RT @Suppress("FunctionName") - public abstract fun _wrap(w: SRT): WRT + public abstract fun _wrap(w: RT): wRT @Suppress("FunctionName") - public abstract fun _equals(l: SRT, r: SRT): Boolean + public abstract fun _equals(l: RT, r: RT): Boolean @Suppress("FunctionName") - public abstract fun _compare(l: SRT, r: SRT): Int + public abstract fun _compare(l: RT, r: RT): Int } - public interface _ROW_ID?, TargetTableUserWrapper : Any> : DatabaseType - public interface ROW_ID : _ROW_ID, TargetTableUserWrapper> - public interface NULLABLE_ROW_ID : _ROW_ID?, TargetTableUserWrapper> + public interface Nullable> : DatabaseType + + public interface ROW_ID : DatabaseType> public interface BOOLEAN : DatabaseType - public interface NULLABLE_BOOLEAN : DatabaseType /** * Descriptor of a raw binary data type for static type-checking. - * @see DatabaseTypesProvider.BINARY_DATA + * @see DatabaseType.Provider.BINARY_DATA */ @OptIn(ExperimentalUnsignedTypes::class) public interface BINARY_DATA : DatabaseType { @@ -59,4 +55,25 @@ public interface DatabaseType<@Suppress("unused") RuntimeType> { */ public val isFixedSize: Boolean } + + public interface Provider { + @Suppress("INAPPLICABLE_JVM_NAME", "FunctionName") + @JvmName("ROW_ID") + public fun ROW_ID(table: Table): DatabaseType> + + @Suppress("INAPPLICABLE_JVM_NAME", "PropertyName") + @get:JvmName("BOOLEAN") + public val BOOLEAN: DatabaseType.BOOLEAN + + @Suppress("INAPPLICABLE_JVM_NAME", "PropertyName") + @get:JvmName("BINARY_DATA") + public val BINARY_DATA: DatabaseType.BINARY_DATA + + @Suppress("INAPPLICABLE_JVM_NAME") + @JvmName("BINARY_DATA") + public fun BINARY_DATA(size: UInt, isFixedSize: Boolean): DatabaseType.BINARY_DATA + + public fun > nullableOf(notNull: DT): DatabaseType.Nullable + + } } diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseTypesProvider.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseTypesProvider.kt deleted file mode 100644 index 117bcd2..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/DatabaseTypesProvider.kt +++ /dev/null @@ -1,49 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.misc - -import kotlin.jvm.JvmName -import ru.landgrafhomyak.serdha.api.v0.table.RowId -import ru.landgrafhomyak.serdha.api.v0.table.Table - -/** - * Provider of database types descriptors. - */ -@Suppress("FunctionName", "PropertyName") -public interface DatabaseTypesProvider { - /** - * Type of internal row id. Can't be casted to types like integers or pointers. - * @param TableUserExtension User's extension type for target table. For static type checking. - * @param table Descriptor of table whose row_id type will be obtained. - */ - @Suppress("INAPPLICABLE_JVM_NAME") - @JvmName("ROW_ID") - public fun ROW_ID(table: Table): DatabaseType> - - @Suppress("INAPPLICABLE_JVM_NAME") - @JvmName("NULLABLE_ROW_ID") - public fun NULLABLE_ROW_ID(table: Table): DatabaseType> - - @Suppress("INAPPLICABLE_JVM_NAME") - @get:JvmName("BOOLEAN") - public val BOOLEAN: DatabaseType.BOOLEAN - - @Suppress("INAPPLICABLE_JVM_NAME") - @get:JvmName("NULLABLE_BOOLEAN") - public val NULLABLE_BOOLEAN: DatabaseType.NULLABLE_BOOLEAN - - /** - * Descriptor of a raw binary data type without size restrictions (must be controlled by user). - */ - @Suppress("INAPPLICABLE_JVM_NAME") - @get:JvmName("BINARY_DATA") - public val BINARY_DATA: DatabaseType.BINARY_DATA - - /** - * Descriptor of a raw binary data type that can holds maximum [size] bytes. - * - * @param size Maximum count of bytes that can be stored in the value of this type. - * @param isFixedSize If `true`, the type will restrict values with less than [size] bytes. - */ - @Suppress("INAPPLICABLE_JVM_NAME") - @JvmName("BINARY_DATA") - public fun BINARY_DATA(size: UInt, isFixedSize: Boolean): DatabaseType.BINARY_DATA -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/FiltersScope.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/FiltersScope.kt new file mode 100644 index 0000000..673e2e9 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/FiltersScope.kt @@ -0,0 +1,20 @@ +package ru.landgrafhomyak.serdha.api.v0.misc + +public interface FiltersScope { + public fun > filterNotNull(nullable: IntermediateColumn, oqUE>): IntermediateColumn + public fun > filterIsNull(nullable: IntermediateColumn, oqUE>) + + public enum class ComparisonType { + EQUALS, + NOT_EQUALS, + LESS, + LESS_OR_EQUALS, + GREATER, + GREATER_OR_EQUALS, + } + + public fun > compareWithParam(column: IntermediateColumn, operator: ComparisonType, param: QueryParam) + public fun > compareWithConstant(column: IntermediateColumn, operator: ComparisonType, constant: RT) + public fun ifTrue(column: IntermediateColumn) + public fun ifFalse(column: IntermediateColumn) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt index cb44ab5..3226aee 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/DeleteQuery.kt @@ -2,7 +2,6 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType -import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.table.RowId @@ -16,7 +15,7 @@ public interface DeleteQuery : _Query { public interface Scope { public val tt: Table - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > param(name: String, type: DT): QueryParam public var rowToRemove: QueryParam<*, DatabaseType.ROW_ID, qUE> @@ -39,7 +38,7 @@ public interface DeleteQuery : _Query { public val tt: Table public val sUExt: sUE - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > param(name: String, type: DT): QueryParam public val selectorParams: InputRow.WithRedirect diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt index dccc1ae..2323828 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/InsertQuery.kt @@ -3,7 +3,6 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType -import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex @@ -19,7 +18,7 @@ public interface InsertQuery : _Query { @Suppress("ClassName") public interface _CommonInsertCreatorScope { - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun onConflictUpdate(u: UniqueIndex, c: (_UpsertClauseScope) -> Unit) public fun onConflictThrow(u: UniqueIndex) 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 f36304e..e74d30f 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 @@ -4,8 +4,8 @@ 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 -import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.Expression +import ru.landgrafhomyak.serdha.api.v0.misc.FiltersScope import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow @@ -16,7 +16,7 @@ public interface SelectQuery : _Query { @Suppress("ClassName") public interface _CommonSelectCreatorScope { - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > queryParam(name: String, type: DT): QueryParam public fun > paramAsColumn(param: QueryParam): IntermediateColumn @@ -27,7 +27,7 @@ public interface SelectQuery : _Query { output: Expression.OutputLinker ) - public fun where(column: IntermediateColumn) + public val filters: FiltersScope public fun orderBy(order: Order, vararg column: IntermediateColumn<*, *, qUE>) public var limit: UInt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt index 4f0a3dd..591619c 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/UpdateQuery.kt @@ -3,7 +3,6 @@ package ru.landgrafhomyak.serdha.api.v0.queries import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType -import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow @@ -15,7 +14,7 @@ public interface UpdateQuery : _Query { public interface Scope { public val tt: Table - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > param(name: String, type: DT): QueryParam public var rowToUpdate: QueryParam<*, DatabaseType.ROW_ID, qUE> @@ -42,7 +41,7 @@ public interface UpdateQuery : _Query { public val tt: Table public val sUExt: sUE - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > param(name: String, type: DT): QueryParam public val selectorParams: InputRow.WithRedirect @@ -71,7 +70,7 @@ public interface UpdateQuery : _Query { public interface Scope { public val tt: Table - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > inputColumn(name: String, type: DT): QueryParam public var rowToUpdate: QueryParam<*, DatabaseType.ROW_ID, qUE> 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 3c6aadc..0186cd8 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,10 @@ 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.DatabaseType -import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseTypesProvider public interface CreateTableScope { - public val types: DatabaseTypesProvider + public val types: DatabaseType.Provider public fun > column(name: String, type: DT): Column