Join types & improvements in creating queries

This commit is contained in:
Andrew Golovashevich 2025-01-31 05:55:24 +03:00
parent 5bc1f1dfca
commit beea261325
7 changed files with 82 additions and 32 deletions

View File

@ -1,7 +1,7 @@
package ru.landgrafhomyak.serdha.api.v0.module package ru.landgrafhomyak.serdha.api.v0.module
import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.table.Table
import ru.landgrafhomyak.serdha.api.v0.queries.CreateQueryScope import ru.landgrafhomyak.serdha.api.v0.queries.QueryCreator
import ru.landgrafhomyak.serdha.api.v0.runtime.SynchronizedDatabase import ru.landgrafhomyak.serdha.api.v0.runtime.SynchronizedDatabase
import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction
import ru.landgrafhomyak.serdha.api.v0.table.CreateTableScope import ru.landgrafhomyak.serdha.api.v0.table.CreateTableScope
@ -80,11 +80,15 @@ public interface CreateModuleScope {
*/ */
public fun <TableUserExtension : Any> createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableCreator<TableUserExtension>): Table<TableUserExtension, Nothing> public fun <TableUserExtension : Any> createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableCreator<TableUserExtension>): Table<TableUserExtension, Nothing>
public val queries: CreateQueryScope public val queries: QueryCreator.Scope
public val temporarySubqueries: CreateQueryScope public val temporarySubqueries: QueryCreator.Scope
public val moduleConfiguringTemporaryQueries: CreateQueryScope public val moduleConfiguringTemporaryQueries: QueryCreator.Scope
public fun <qUE : Any> createQuery(creator: QueryCreator<qUE>): qUE
public fun <qUE : Any> createModuleConfiguringTemporaryQuery(creator: QueryCreator<qUE>): qUE
/** /**
* Replaces [specified namespace][rootNs] with schema provided by [template]. * Replaces [specified namespace][rootNs] with schema provided by [template].

View File

@ -1,22 +0,0 @@
package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.table.Table
public interface CreateQueryScope {
public fun <qUE : Any, tUE : Any> deleteSingleRow(table: Table<tUE, *>, creator: DeleteQuery.SingleRow.Creator<qUE, tUE>): DeleteQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> deleteFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: DeleteQuery.FromSubquery.Creator<qUE, tUE, sUE>): DeleteQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> deleteMultipleRows(table: Table<tUE, *>, creator: DeleteQuery.MultipleRows.Creator<qUE, tUE>): DeleteQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> insertSingleRow(table: Table<tUE, *>, creator: InsertQuery.SingleRow.Creator<qUE, tUE>): InsertQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> insertFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: InsertQuery.FromSubquery.Creator<qUE, tUE, sUE>): InsertQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> insertMultipleRows(table: Table<tUE, *>, creator: InsertQuery.MultipleRows.Creator<qUE, tUE>): InsertQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> select(table: _Selectable<tUE>, creator: SelectQuery.FromSubquery.Creator<qUE, tUE>): SelectQuery.FromSubquery<qUE>
public fun <qUE : Any, lUE : Any, rUE : Any> selectWithJoin(left: _Selectable<lUE>, right: _Selectable<rUE>, creator: SelectQuery.WithJoin.Creator<qUE, lUE, rUE>): SelectQuery.WithJoin<qUE>
public fun <qUE : Any, tUE : Any> updateSingleRow(table: Table<tUE, *>, creator: UpdateQuery.SingleRow.Creator<qUE, tUE>): UpdateQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> updateFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: UpdateQuery.FromSubquery.Creator<qUE, tUE, sUE>): UpdateQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> updateMultipleRows(table: Table<tUE, *>, creator: UpdateQuery.MultipleRows.Creator<qUE, tUE>): UpdateQuery.MultipleRows<qUE>
}

View File

@ -3,6 +3,7 @@ package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc.Column import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow
import ru.landgrafhomyak.serdha.api.v0.table.RowId import ru.landgrafhomyak.serdha.api.v0.table.RowId
import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.table.Table
@ -10,6 +11,8 @@ import ru.landgrafhomyak.serdha.api.v0.table.Table
public interface DeleteQuery<qUE : Any> : _Query<qUE> { public interface DeleteQuery<qUE : Any> : _Query<qUE> {
public interface SingleRow<qUE : Any> : DeleteQuery<qUE>, _Query.Params2Table<qUE> { public interface SingleRow<qUE : Any> : DeleteQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttUE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public val targetTable: Table<ttUE, *>
public fun createDeleteSingleRowWithReturning(creator: Scope<qUE, ttUE>): qUE public fun createDeleteSingleRowWithReturning(creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> { public interface Scope<qUE : Any, ttUE : Any> {
@ -32,6 +35,9 @@ public interface DeleteQuery<qUE : Any> : _Query<qUE> {
public interface FromSubquery<qUE : Any> : DeleteQuery<qUE>, _Query.Params2Table<qUE> { public interface FromSubquery<qUE : Any> : DeleteQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttUE : Any, sUE : Any> { public interface Creator<qUE : Any, ttUE : Any, sUE : Any> {
public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE>
public fun createDeleteFromSubqueryWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE public fun createDeleteFromSubqueryWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE
public interface Scope<qUE : Any, ttUE : Any, sUE : Any> { public interface Scope<qUE : Any, ttUE : Any, sUE : Any> {
@ -56,8 +62,10 @@ public interface DeleteQuery<qUE : Any> : _Query<qUE> {
} }
public interface MultipleRows<qUE : Any> : DeleteQuery<qUE>, _Query.Table2Void<qUE> { public interface MultipleRows<qUE : Any> : DeleteQuery<qUE>, _Query.Table2Void<qUE> {
public interface Creator<qUE : Any, tUE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public fun createMultipleRows(creator: Scope<qUE, tUE>): qUE public val targetTable: Table<ttUE, *>
public fun createMultipleRows(creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> { public interface Scope<qUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *> public val tt: Table<ttUE, *>

View File

@ -4,6 +4,7 @@ import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.table.Table
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow
import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex
@ -28,6 +29,8 @@ public interface InsertQuery<qUE : Any> : _Query<qUE> {
public interface SingleRow<qUE : Any> : InsertQuery<qUE>, _Query.Params2Table<qUE> { public interface SingleRow<qUE : Any> : InsertQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttUE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public val targetTable: Table<ttUE, *>
public fun createInsertSingleRowWithReturning(creator: Scope<qUE, ttUE>): qUE public fun createInsertSingleRowWithReturning(creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> { public interface Scope<qUE : Any, ttUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> {
@ -48,6 +51,9 @@ public interface InsertQuery<qUE : Any> : _Query<qUE> {
public interface FromSubquery<qUE : Any> : InsertQuery<qUE>, _Query.Params2Table<qUE> { public interface FromSubquery<qUE : Any> : InsertQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttUE : Any, sUE : Any> { public interface Creator<qUE : Any, ttUE : Any, sUE : Any> {
public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE>
public fun createInsertSingleRowWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE public fun createInsertSingleRowWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE
public interface Scope<qUE : Any, ttUE : Any, sUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> { public interface Scope<qUE : Any, ttUE : Any, sUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> {
@ -72,6 +78,7 @@ public interface InsertQuery<qUE : Any> : _Query<qUE> {
public interface MultipleRows<qUE : Any> : InsertQuery<qUE>, _Query.Table2Void<qUE> { public interface MultipleRows<qUE : Any> : InsertQuery<qUE>, _Query.Table2Void<qUE> {
public interface Creator<qUE : Any, ttUE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public val targetTable: Table<ttUE, *>
public fun createInsertMultipleRows(creator: Scope<qUE, ttUE>): qUE public fun createInsertMultipleRows(creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> { public interface Scope<qUE : Any, ttUE : Any> : _CommonInsertCreatorScope<qUE, ttUE> {

View File

@ -0,0 +1,25 @@
package ru.landgrafhomyak.serdha.api.v0.queries
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.table.Table
public interface QueryCreator<qUE : Any> {
public fun createQuery(internalQueries: Scope, outQueries: Scope): qUE
public interface Scope {
public fun <qUE : Any, tUE : Any> deleteSingleRow(table: Table<tUE, *>, creator: DeleteQuery.SingleRow.Creator<qUE, tUE>): DeleteQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> deleteFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: DeleteQuery.FromSubquery.Creator<qUE, tUE, sUE>): DeleteQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> deleteMultipleRows(table: Table<tUE, *>, creator: DeleteQuery.MultipleRows.Creator<qUE, tUE>): DeleteQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> insertSingleRow(table: Table<tUE, *>, creator: InsertQuery.SingleRow.Creator<qUE, tUE>): InsertQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> insertFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: InsertQuery.FromSubquery.Creator<qUE, tUE, sUE>): InsertQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> insertMultipleRows(table: Table<tUE, *>, creator: InsertQuery.MultipleRows.Creator<qUE, tUE>): InsertQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> select(table: _Selectable<tUE>, creator: SelectQuery.FromTable.Creator<qUE, tUE>): SelectQuery.FromTable<qUE>
public fun <qUE : Any, lUE : Any, rUE : Any> selectWithJoin(left: _Selectable<lUE>, right: _Selectable<rUE>, creator: SelectQuery.WithJoin.Creator<qUE, lUE, rUE>): SelectQuery.WithJoin<qUE>
public fun <qUE : Any, tUE : Any> updateSingleRow(table: Table<tUE, *>, creator: UpdateQuery.SingleRow.Creator<qUE, tUE>): UpdateQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> updateFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: UpdateQuery.FromSubquery.Creator<qUE, tUE, sUE>): UpdateQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> updateMultipleRows(table: Table<tUE, *>, creator: UpdateQuery.MultipleRows.Creator<qUE, tUE>): UpdateQuery.MultipleRows<qUE>
}
}

View File

@ -7,6 +7,7 @@ import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.Expression import ru.landgrafhomyak.serdha.api.v0.misc.Expression
import ru.landgrafhomyak.serdha.api.v0.misc.FiltersScope import ru.landgrafhomyak.serdha.api.v0.misc.FiltersScope
import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow
public interface SelectQuery<qUE : Any> : _Query<qUE> { public interface SelectQuery<qUE : Any> : _Query<qUE> {
@ -14,6 +15,19 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
ASC, DESC ASC, DESC
} }
public class JoinType(
public val leftNull: LeftNull,
public val join: Join
) {
public enum class LeftNull {
AS_ID, SKIP, JOIN_TO_NULL
}
public enum class Join {
LEFT_TO_FIRST_RIGHT, LEFT_FOR_EACH_RIGHT, LEFT_FOR_EACH_RIGHT_OR_NULL,
}
}
@Suppress("ClassName") @Suppress("ClassName")
public interface _CommonSelectCreatorScope<qUE : Any> { public interface _CommonSelectCreatorScope<qUE : Any> {
public val types: DatabaseType.Provider public val types: DatabaseType.Provider
@ -39,6 +53,12 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
public interface WithJoin<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> { public interface WithJoin<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, lsqUE : Any, rsqUE : Any> : _CommonSelectCreatorScope<qUE> { public interface Creator<qUE : Any, lsqUE : Any, rsqUE : Any> : _CommonSelectCreatorScope<qUE> {
public val left: _Selectable<lsqUE>
public val right: _Selectable<rsqUE>
public val joinType: JoinType
public val referenceColumn: Column<*, *, lsqUE>
public val targetColumn: Column<*, *, rsqUE>
public fun createSelectWithJoin(creator: Scope<qUE, lsqUE, rsqUE>): qUE public fun createSelectWithJoin(creator: Scope<qUE, lsqUE, rsqUE>): qUE
public interface Scope<qUE : Any, lsqUE : Any, rsqUE : Any> { public interface Scope<qUE : Any, lsqUE : Any, rsqUE : Any> {
@ -50,17 +70,19 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
public fun <RT, DT : DatabaseType<RT>> selectColumnFromLeft(column: Column<RT, DT, lsqUE>): IntermediateColumn<RT, DT, qUE> public fun <RT, DT : DatabaseType<RT>> selectColumnFromLeft(column: Column<RT, DT, lsqUE>): IntermediateColumn<RT, DT, qUE>
public fun <RT, DT : DatabaseType<RT>> selectColumnFromRight(column: Column<RT, DT, rsqUE>): IntermediateColumn<RT, DT, qUE> public fun <RT, DT : DatabaseType<RT>> selectColumnFromRight(column: Column<RT, DT, rsqUE>): IntermediateColumn<RT, DT, qUE>
public fun <RT : Any, DT : DatabaseType<RT>> selectColumnFromRightAsNullable(column: Column<RT, DT, rsqUE>): IntermediateColumn<RT?, DatabaseType.Nullable<RT, DT>, qUE>
} }
} }
} }
public interface FromSubquery<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> { public interface FromTable<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, tUE : Any> { public interface Creator<qUE : Any, tUE : Any> {
public val tUExt: tUE public val table: _Selectable<tUE>
public fun createSelect(creator: Scope<qUE, tUE>): qUE public fun createSelect(creator: Scope<qUE, tUE>): qUE
public interface Scope<qUE : Any, tUE : Any> : _CommonSelectCreatorScope<qUE> { public interface Scope<qUE : Any, tUE : Any> : _CommonSelectCreatorScope<qUE> {
public val tUExt: tUE
public val subqueryParams: InputRow.WithRedirect<tUE, qUE> public val subqueryParams: InputRow.WithRedirect<tUE, qUE>
public fun <RT, DT : DatabaseType<RT>> selectColumnFromSubquery(param: Column<RT, DT, tUE>): IntermediateColumn<RT, DT, qUE> public fun <RT, DT : DatabaseType<RT>> selectColumnFromSubquery(param: Column<RT, DT, tUE>): IntermediateColumn<RT, DT, qUE>

View File

@ -4,12 +4,14 @@ import ru.landgrafhomyak.serdha.api.v0.misc.Column
import ru.landgrafhomyak.serdha.api.v0.table.Table import ru.landgrafhomyak.serdha.api.v0.table.Table
import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType import ru.landgrafhomyak.serdha.api.v0.misc.DatabaseType
import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam import ru.landgrafhomyak.serdha.api.v0.misc.QueryParam
import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow import ru.landgrafhomyak.serdha.api.v0.runtime.InputRow
public interface UpdateQuery<qUE : Any> : _Query<qUE> { public interface UpdateQuery<qUE : Any> : _Query<qUE> {
public interface SingleRow<qUE : Any> : UpdateQuery<qUE>, _Query.Params2Table<qUE> { public interface SingleRow<qUE : Any> : UpdateQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttIE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public fun createUpdateSingleWithReturning(table: Table<ttIE, *>, creator: Scope<qUE, ttIE>): qUE public val targetTable: Table<ttUE, *>
public fun createUpdateSingleWithReturning(table: Table<ttUE, *>, creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> { public interface Scope<qUE : Any, ttUE : Any> {
public val tt: Table<ttUE, *> public val tt: Table<ttUE, *>
@ -35,6 +37,9 @@ public interface UpdateQuery<qUE : Any> : _Query<qUE> {
public interface FromSubquery<qUE : Any> : UpdateQuery<qUE>, _Query.Params2Table<qUE> { public interface FromSubquery<qUE : Any> : UpdateQuery<qUE>, _Query.Params2Table<qUE> {
public interface Creator<qUE : Any, ttUE : Any, sUE : Any> { public interface Creator<qUE : Any, ttUE : Any, sUE : Any> {
public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE>
public fun createUpdateFromSubqueryWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE public fun createUpdateFromSubqueryWithReturning(creator: Scope<qUE, ttUE, sUE>): qUE
public interface Scope<qUE : Any, ttUE : Any, sUE : Any> { public interface Scope<qUE : Any, ttUE : Any, sUE : Any> {
@ -65,6 +70,7 @@ public interface UpdateQuery<qUE : Any> : _Query<qUE> {
public interface MultipleRows<qUE : Any> : UpdateQuery<qUE>, _Query.Table2Void<qUE> { public interface MultipleRows<qUE : Any> : UpdateQuery<qUE>, _Query.Table2Void<qUE> {
public interface Creator<qUE : Any, ttUE : Any> { public interface Creator<qUE : Any, ttUE : Any> {
public val targetTable: Table<ttUE, *>
public fun createUpdateMultipleRows(creator: Scope<qUE, ttUE>): qUE public fun createUpdateMultipleRows(creator: Scope<qUE, ttUE>): qUE
public interface Scope<qUE : Any, ttUE : Any> { public interface Scope<qUE : Any, ttUE : Any> {