Unified query construction

This commit is contained in:
Andrew Golovashevich 2025-02-01 01:02:55 +03:00
parent 13b6fa65d2
commit af338b5dc1
7 changed files with 85 additions and 47 deletions

View File

@ -1,7 +1,7 @@
package ru.landgrafhomyak.db.serdha0.api.module package ru.landgrafhomyak.db.serdha0.api.module
import ru.landgrafhomyak.db.serdha0.api.table.Table import ru.landgrafhomyak.db.serdha0.api.table.Table
import ru.landgrafhomyak.db.serdha0.api.queries.QueryConstructor import ru.landgrafhomyak.db.serdha0.api.queries._Query
import ru.landgrafhomyak.db.serdha0.api.runtime.SynchronizedDatabase import ru.landgrafhomyak.db.serdha0.api.runtime.SynchronizedDatabase
import ru.landgrafhomyak.db.serdha0.api.runtime.Transaction import ru.landgrafhomyak.db.serdha0.api.runtime.Transaction
import ru.landgrafhomyak.db.serdha0.api.table.TableConstructor import ru.landgrafhomyak.db.serdha0.api.table.TableConstructor
@ -55,15 +55,15 @@ public interface CreateModuleScope {
*/ */
public fun <TableUserExtension : Any> createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableConstructor<TableUserExtension>): Table<TableUserExtension, Nothing> public fun <TableUserExtension : Any> createTransactionScopeTemporaryTable(namespace: Namespace, name: String, initializer: TableConstructor<TableUserExtension>): Table<TableUserExtension, Nothing>
public val queries: QueryConstructor.Scope public val queries: _Query.Constructor.Scope
public val temporarySubqueries: QueryConstructor.Scope public val temporarySubqueries: _Query.Constructor.Scope
public val moduleConfiguringTemporaryQueries: QueryConstructor.Scope public val moduleConfiguringTemporaryQueries: _Query.Constructor.Scope
public fun <qUE : Any> createQuery(creator: QueryConstructor<qUE>): qUE public fun <qUE : Any> createQuery(creator: _Query.Constructor<qUE>): qUE
public fun <qUE : Any> createModuleConfiguringTemporaryQuery(creator: QueryConstructor<qUE>): qUE public fun <qUE : Any> createModuleConfiguringTemporaryQuery(creator: _Query.Constructor<qUE>): qUE
/** /**
* Replaces [specified namespace][rootNs] with schema provided by [template]. * Replaces [specified namespace][rootNs] with schema provided by [template].

View File

@ -10,7 +10,10 @@ import ru.landgrafhomyak.db.serdha0.api.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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<SingleRow<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow<qUE> =
outQueries.deleteSingleRow(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createDeleteSingleRowWithReturning(context: Scope<qUE, ttUE>): qUE public fun createDeleteSingleRowWithReturning(context: Scope<qUE, ttUE>): qUE
@ -34,7 +37,10 @@ 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 Constructor<qUE : Any, ttUE : Any, sUE : Any> { public interface Constructor<qUE : Any, ttUE : Any, sUE : Any> : _Query.Constructor<FromSubquery<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery<qUE> =
outQueries.deleteFromSubquery(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE> public val selector: _Selectable<sUE>
@ -62,7 +68,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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<MultipleRows<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows<qUE> =
outQueries.deleteMultipleRows(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createMultipleRows(context: Scope<qUE, ttUE>): qUE public fun createMultipleRows(context: Scope<qUE, ttUE>): qUE

View File

@ -28,7 +28,10 @@ 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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<SingleRow<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow<qUE> =
outQueries.insertSingleRow(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createInsertSingleRowWithReturning(context: Scope<qUE, ttUE>): qUE public fun createInsertSingleRowWithReturning(context: Scope<qUE, ttUE>): qUE
@ -50,7 +53,10 @@ 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 Constructor<qUE : Any, ttUE : Any, sUE : Any> { public interface Constructor<qUE : Any, ttUE : Any, sUE : Any> : _Query.Constructor<FromSubquery<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery<qUE> =
outQueries.insertFromSubquery(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE> public val selector: _Selectable<sUE>
@ -77,7 +83,10 @@ 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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<MultipleRows<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows<qUE> =
outQueries.insertMultipleRows(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createInsertMultipleRows(context: Scope<qUE, ttUE>): qUE public fun createInsertMultipleRows(context: Scope<qUE, ttUE>): qUE

View File

@ -1,25 +0,0 @@
package ru.landgrafhomyak.db.serdha0.api.queries
import ru.landgrafhomyak.db.serdha0.api.misc._Selectable
import ru.landgrafhomyak.db.serdha0.api.table.Table
public interface QueryConstructor<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.Constructor<qUE, tUE>): DeleteQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> deleteFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: DeleteQuery.FromSubquery.Constructor<qUE, tUE, sUE>): DeleteQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> deleteMultipleRows(table: Table<tUE, *>, creator: DeleteQuery.MultipleRows.Constructor<qUE, tUE>): DeleteQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> insertSingleRow(table: Table<tUE, *>, creator: InsertQuery.SingleRow.Constructor<qUE, tUE>): InsertQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> insertFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: InsertQuery.FromSubquery.Constructor<qUE, tUE, sUE>): InsertQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> insertMultipleRows(table: Table<tUE, *>, creator: InsertQuery.MultipleRows.Constructor<qUE, tUE>): InsertQuery.MultipleRows<qUE>
public fun <qUE : Any, tUE : Any> select(table: _Selectable<tUE>, creator: SelectQuery.Simple.Constructor<qUE, tUE>): SelectQuery.Simple<qUE>
public fun <qUE : Any, lUE : Any, rUE : Any> selectWithJoin(left: _Selectable<lUE>, right: _Selectable<rUE>, creator: SelectQuery.WithJoin.Constructor<qUE, lUE, rUE>): SelectQuery.WithJoin<qUE>
public fun <qUE : Any, tUE : Any> updateSingleRow(table: Table<tUE, *>, creator: UpdateQuery.SingleRow.Constructor<qUE, tUE>): UpdateQuery.SingleRow<qUE>
public fun <qUE : Any, tUE : Any, sUE : Any> updateFromSubquery(table: Table<tUE, *>, selector: _Selectable<sUE>, creator: UpdateQuery.FromSubquery.Constructor<qUE, tUE, sUE>): UpdateQuery.FromSubquery<qUE>
public fun <qUE : Any, tUE : Any> updateMultipleRows(table: Table<tUE, *>, creator: UpdateQuery.MultipleRows.Constructor<qUE, tUE>): UpdateQuery.MultipleRows<qUE>
}
}

View File

@ -52,7 +52,10 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
} }
public interface Simple<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> { public interface Simple<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> {
public interface Constructor<qUE : Any, tUE : Any> { public interface Constructor<qUE : Any, tUE : Any> : _Query.Constructor<Simple<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Simple<qUE> =
outQueries.select(this)
public val source: _Selectable<tUE> public val source: _Selectable<tUE>
public fun createSelect(context: Scope<qUE, tUE>): qUE public fun createSelect(context: Scope<qUE, tUE>): qUE
@ -67,7 +70,10 @@ 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 Constructor<qUE : Any, lsqUE : Any, rsqUE : Any> : _CommonSelectCreatorScope<qUE> { public interface Constructor<qUE : Any, lsqUE : Any, rsqUE : Any> : _Query.Constructor<WithJoin<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): WithJoin<qUE> =
outQueries.selectWithJoin(this)
public val left: _Selectable<lsqUE> public val left: _Selectable<lsqUE>
public val right: _Selectable<rsqUE> public val right: _Selectable<rsqUE>
public val joinType: JoinType public val joinType: JoinType
@ -76,7 +82,7 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
public fun createSelectWithJoin(context: Scope<qUE, lsqUE, rsqUE>): qUE public fun createSelectWithJoin(context: Scope<qUE, lsqUE, rsqUE>): qUE
public interface Scope<qUE : Any, lsqUE : Any, rsqUE : Any> { public interface Scope<qUE : Any, lsqUE : Any, rsqUE : Any> : _CommonSelectCreatorScope<qUE> {
public val lsqUExt: lsqUE public val lsqUExt: lsqUE
public val rsqUExt: rsqUE public val rsqUExt: rsqUE
@ -90,8 +96,11 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
} }
} }
public interface Reduce<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> { public interface Reducing<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> {
public interface Constructor<qUE : Any, tUE : Any> { public interface Constructor<qUE : Any, tUE : Any> : _Query.Constructor<Reducing<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Reducing<qUE> =
outQueries.selectReducing(this)
public val source: _Selectable<tUE> public val source: _Selectable<tUE>
public fun createSelectWithReduce(context: Scope<qUE, tUE>): qUE public fun createSelectWithReduce(context: Scope<qUE, tUE>): qUE
@ -113,8 +122,11 @@ public interface SelectQuery<qUE : Any> : _Query<qUE> {
} }
} }
public interface Fold<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> { public interface Folding<qUE : Any> : SelectQuery<qUE>, _Query.Params2Table<qUE> {
public interface Constructor<qUE : Any, tUE : Any> { public interface Constructor<qUE : Any, tUE : Any> : _Query.Constructor<Folding<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): Folding<qUE> =
outQueries.selectFolding(this)
public val source: _Selectable<tUE> public val source: _Selectable<tUE>
public fun createSelectWithFold(context: Scope<qUE, tUE>): qUE public fun createSelectWithFold(context: Scope<qUE, tUE>): qUE

View File

@ -9,7 +9,10 @@ import ru.landgrafhomyak.db.serdha0.api.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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<SingleRow<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): SingleRow<qUE> =
outQueries.updateSingleRow(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createUpdateSingleWithReturning(context: Scope<qUE, ttUE>): qUE public fun createUpdateSingleWithReturning(context: Scope<qUE, ttUE>): qUE
@ -36,7 +39,10 @@ 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 Constructor<qUE : Any, ttUE : Any, sUE : Any> { public interface Constructor<qUE : Any, ttUE : Any, sUE : Any> : _Query.Constructor<FromSubquery<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): FromSubquery<qUE> =
outQueries.updateFromSubquery(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public val selector: _Selectable<sUE> public val selector: _Selectable<sUE>
@ -69,7 +75,10 @@ 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 Constructor<qUE : Any, ttUE : Any> { public interface Constructor<qUE : Any, ttUE : Any> : _Query.Constructor<MultipleRows<qUE>> {
override fun createQuery(internalQueries: _Query.Constructor.Scope, outQueries: _Query.Constructor.Scope): MultipleRows<qUE> =
outQueries.updateMultipleRows(this)
public val targetTable: Table<ttUE, *> public val targetTable: Table<ttUE, *>
public fun createUpdateMultipleRows(context: Scope<qUE, ttUE>): qUE public fun createUpdateMultipleRows(context: Scope<qUE, ttUE>): qUE

View File

@ -11,4 +11,28 @@ public interface _Query<QueryUserExtension : Any> {
public interface Params2Void<QueryUserExtension : Any> : _Query<QueryUserExtension> public interface Params2Void<QueryUserExtension : Any> : _Query<QueryUserExtension>
public interface Params2Table<QueryUserExtension : Any> : _Query<QueryUserExtension>, _Selectable<QueryUserExtension> public interface Params2Table<QueryUserExtension : Any> : _Query<QueryUserExtension>, _Selectable<QueryUserExtension>
public interface Void2Table<QueryUserExtension : Any> : _Query<QueryUserExtension>, _Selectable<QueryUserExtension> public interface Void2Table<QueryUserExtension : Any> : _Query<QueryUserExtension>, _Selectable<QueryUserExtension>
public interface Constructor<qUE : Any> {
public fun createQuery(internalQueries: Scope, outQueries: Scope): qUE
public interface Scope {
public fun <qUE : Any, sqUE : Any> select(constructor: SelectQuery.Simple.Constructor<qUE, sqUE>): SelectQuery.Simple<qUE>
public fun <qUE : Any, lUE : Any, rUE : Any> selectWithJoin(constructor: SelectQuery.WithJoin.Constructor<qUE, lUE, rUE>): SelectQuery.WithJoin<qUE>
public fun <qUE : Any, sqUE : Any> selectReducing(constructor: SelectQuery.Reducing.Constructor<qUE, sqUE>): SelectQuery.Reducing<qUE>
public fun <qUE : Any, sqUE : Any> selectFolding(constructor: SelectQuery.Folding.Constructor<qUE, sqUE>): SelectQuery.Folding<qUE>
public fun <qUE : Any, ttUE : Any> insertSingleRow(constructor: InsertQuery.SingleRow.Constructor<qUE, ttUE>): InsertQuery.SingleRow<qUE>
public fun <qUE : Any, ttUE : Any, sUE : Any> insertFromSubquery(constructor: InsertQuery.FromSubquery.Constructor<qUE, ttUE, sUE>): InsertQuery.FromSubquery<qUE>
public fun <qUE : Any, ttUE : Any> insertMultipleRows(constructor: InsertQuery.MultipleRows.Constructor<qUE, ttUE>): InsertQuery.MultipleRows<qUE>
public fun <qUE : Any, ttUE : Any> updateSingleRow(constructor: UpdateQuery.SingleRow.Constructor<qUE, ttUE>): UpdateQuery.SingleRow<qUE>
public fun <qUE : Any, ttUE : Any, sUE : Any> updateFromSubquery(constructor: UpdateQuery.FromSubquery.Constructor<qUE, ttUE, sUE>): UpdateQuery.FromSubquery<qUE>
public fun <qUE : Any, ttUE : Any> updateMultipleRows(constructor: UpdateQuery.MultipleRows.Constructor<qUE, ttUE>): UpdateQuery.MultipleRows<qUE>
public fun <qUE : Any, ttUE : Any> deleteSingleRow(constructor: DeleteQuery.SingleRow.Constructor<qUE, ttUE>): DeleteQuery.SingleRow<qUE>
public fun <qUE : Any, ttUE : Any, sUE : Any> deleteFromSubquery(constructor: DeleteQuery.FromSubquery.Constructor<qUE, ttUE, sUE>): DeleteQuery.FromSubquery<qUE>
public fun <qUE : Any, ttUE : Any> deleteMultipleRows(constructor: DeleteQuery.MultipleRows.Constructor<qUE, ttUE>): DeleteQuery.MultipleRows<qUE>
}
}
} }