All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ufoss.kotysa.WhereClause.kt Maven / Gradle / Ivy

/*
 * This is free and unencumbered software released into the public domain, following 
 */

package org.ufoss.kotysa

import org.ufoss.kotysa.postgresql.Tsquery

public enum class Operation {
    EQ, NOT_EQ, CONTAINS, STARTS_WITH, ENDS_WITH, SUP, INF, SUP_OR_EQ, INF_OR_EQ, IN, EXISTS,
    // Postgresql specific tsquery
    TO_TSQUERY, PLAINTO_TSQUERY, PHRASETO_TSQUERY, WEBSEARCH_TO_TSQUERY, APPLY_ON
}

internal sealed interface WhereClause {
    val operation: Operation
}

internal sealed interface WhereClauseWithColumn : WhereClause {
    val column: Column
}

internal sealed interface WhereClauseWithAlias : WhereClause {
    val alias: QueryAlias
}

internal sealed interface WhereClauseValue {
    val value: Any?
}

internal sealed interface WhereClauseColumn {
    val otherColumn: Column<*, *>
}

internal sealed interface WhereClauseSubQuery {
    val dsl: SqlClientSubQuery.SingleScope.() -> SqlClientSubQuery.Return
}

internal class WhereClauseValueWithColumn internal constructor(
    override val column: Column,
    override val operation: Operation,
    override val value: Any?,
) : WhereClauseWithColumn, WhereClauseValue

internal class WhereClauseValueWithAlias internal constructor(
    override val alias: QueryAlias,
    override val operation: Operation,
    override val value: Any?,
) : WhereClauseWithAlias, WhereClauseValue

internal class WhereClauseColumnWithColumn internal constructor(
    override val column: Column,
    override val operation: Operation,
    override val otherColumn: Column<*, *>,
) : WhereClauseWithColumn, WhereClauseColumn

internal class WhereClauseColumnWithAlias internal constructor(
    override val alias: QueryAlias,
    override val operation: Operation,
    override val otherColumn: Column<*, *>,
) : WhereClauseWithAlias, WhereClauseColumn

internal class WhereClauseExists internal constructor(
    internal val dsl: SqlClientSubQuery.SingleScope.() -> SqlClientSubQuery.Return,
) : WhereClause {
    override val operation: Operation = Operation.EXISTS
}

internal class WhereClauseSubQueryWithColumn internal constructor(
    override val column: Column,
    override val operation: Operation,
    override val dsl: SqlClientSubQuery.SingleScope.() -> SqlClientSubQuery.Return,
) : WhereClauseWithColumn, WhereClauseSubQuery

internal class WhereClauseSubQueryWithAlias internal constructor(
    override val alias: QueryAlias,
    override val operation: Operation,
    override val dsl: SqlClientSubQuery.SingleScope.() -> SqlClientSubQuery.Return,
) : WhereClauseWithAlias, WhereClauseSubQuery

internal class WhereClauseTsqueryWithColumn internal constructor(
    override val column: Column,
    internal val tsquery: Tsquery,
) : WhereClauseWithColumn {
    override val operation = Operation.APPLY_ON
}

public class WhereClauseWithType internal constructor(
    internal val whereClause: WhereClause,
    internal val type: WhereClauseType
)

public enum class WhereClauseType {
    WHERE, AND, OR
}