Conditions clause was replaced with filters

This commit is contained in:
Andrew Golovashevich 2025-01-30 22:29:38 +03:00
parent 461f8e0d9c
commit 5bc1f1dfca
8 changed files with 63 additions and 80 deletions

View File

@ -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<SRT, WRT : Any>(
public abstract class _VirtualType<RT, wRT, wDT : DatabaseType<wRT>>(
@Suppress("MemberVisibilityCanBePrivate") @JvmField
public val wraps: DatabaseType<WRT>
) : DatabaseType<SRT> {
public val wraps: wDT
) : DatabaseType<RT> {
@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<T : RowId<TargetTableUserWrapper>?, TargetTableUserWrapper : Any> : DatabaseType<T>
public interface ROW_ID<TargetTableUserWrapper : Any> : _ROW_ID<RowId<TargetTableUserWrapper>, TargetTableUserWrapper>
public interface NULLABLE_ROW_ID<TargetTableUserWrapper : Any> : _ROW_ID<RowId<TargetTableUserWrapper>?, TargetTableUserWrapper>
public interface Nullable<RT : Any, @Suppress("unused") DT : DatabaseType<RT>> : DatabaseType<RT?>
public interface ROW_ID<TargetTableUserWrapper : Any> : DatabaseType<RowId<TargetTableUserWrapper>>
public interface BOOLEAN : DatabaseType<Boolean>
public interface NULLABLE_BOOLEAN : DatabaseType<Boolean?>
/**
* 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<UByteArray> {
@ -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 <TableUserExtension : Any> ROW_ID(table: Table<TableUserExtension, *>): DatabaseType<RowId<TableUserExtension>>
@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 <RT : Any, DT : DatabaseType<RT>> nullableOf(notNull: DT): DatabaseType.Nullable<RT, DT>
}
}

View File

@ -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 <TableUserExtension : Any> ROW_ID(table: Table<TableUserExtension, *>): DatabaseType<RowId<TableUserExtension>>
@Suppress("INAPPLICABLE_JVM_NAME")
@JvmName("NULLABLE_ROW_ID")
public fun <TableUserExtension : Any> NULLABLE_ROW_ID(table: Table<TableUserExtension, *>): DatabaseType<RowId<TableUserExtension>>
@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
}

View File

@ -0,0 +1,20 @@
package ru.landgrafhomyak.serdha.api.v0.misc
public interface FiltersScope<oqUE : Any> {
public fun <RT : Any, DT : DatabaseType<RT>> filterNotNull(nullable: IntermediateColumn<RT?, DatabaseType.Nullable<RT, DT>, oqUE>): IntermediateColumn<RT, DT, oqUE>
public fun <RT : Any, DT : DatabaseType<RT>> filterIsNull(nullable: IntermediateColumn<RT?, DatabaseType.Nullable<RT, DT>, oqUE>)
public enum class ComparisonType {
EQUALS,
NOT_EQUALS,
LESS,
LESS_OR_EQUALS,
GREATER,
GREATER_OR_EQUALS,
}
public fun <RT : Any, DT : DatabaseType<RT>> compareWithParam(column: IntermediateColumn<RT, DT, oqUE>, operator: ComparisonType, param: QueryParam<RT, DT, oqUE>)
public fun <RT : Any, DT : DatabaseType<RT>> compareWithConstant(column: IntermediateColumn<RT, DT, oqUE>, operator: ComparisonType, constant: RT)
public fun ifTrue(column: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, oqUE>)
public fun ifFalse(column: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, oqUE>)
}

View File

@ -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<qUE : Any> : _Query<qUE> {
public interface Scope<qUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *>
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, qUE>
public var rowToRemove: QueryParam<*, DatabaseType.ROW_ID<ttUE>, qUE>
@ -39,7 +38,7 @@ public interface DeleteQuery<qUE : Any> : _Query<qUE> {
public val tt: Table<ttUE, *>
public val sUExt: sUE
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, qUE>
public val selectorParams: InputRow.WithRedirect<sUE, qUE>

View File

@ -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<qUE : Any> : _Query<qUE> {
@Suppress("ClassName")
public interface _CommonInsertCreatorScope<qUE : Any, ttUE : Any> {
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun onConflictUpdate(u: UniqueIndex<ttUE>, c: (_UpsertClauseScope<qUE, ttUE>) -> Unit)
public fun onConflictThrow(u: UniqueIndex<ttUE>)

View File

@ -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<qUE : Any> : _Query<qUE> {
@Suppress("ClassName")
public interface _CommonSelectCreatorScope<qUE : Any> {
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> queryParam(name: String, type: DT): QueryParam<RT, DT, qUE>
public fun <RT, DT : DatabaseType<RT>> paramAsColumn(param: QueryParam<RT, DT, qUE>): IntermediateColumn<RT, DT, qUE>
@ -27,7 +27,7 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
output: Expression.OutputLinker<eUE, qUE>
)
public fun where(column: IntermediateColumn<Boolean, DatabaseType.BOOLEAN, qUE>)
public val filters: FiltersScope<qUE>
public fun orderBy(order: Order, vararg column: IntermediateColumn<*, *, qUE>)
public var limit: UInt

View File

@ -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<qUE : Any> : _Query<qUE> {
public interface Scope<qUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *>
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, qUE>
public var rowToUpdate: QueryParam<*, DatabaseType.ROW_ID<ttUE>, qUE>
@ -42,7 +41,7 @@ public interface UpdateQuery<qUE : Any> : _Query<qUE> {
public val tt: Table<ttUE, *>
public val sUExt: sUE
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, qUE>
public val selectorParams: InputRow.WithRedirect<sUE, qUE>
@ -71,7 +70,7 @@ public interface UpdateQuery<qUE : Any> : _Query<qUE> {
public interface Scope<qUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *>
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> inputColumn(name: String, type: DT): QueryParam<RT, DT, qUE>
public var rowToUpdate: QueryParam<*, DatabaseType.ROW_ID<ttUE>, qUE>

View File

@ -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<TableUserExtension : Any> {
public val types: DatabaseTypesProvider
public val types: DatabaseType.Provider
public fun <RT, DT : DatabaseType<RT>> column(name: String, type: DT): Column<RT, DT, TableUserExtension>