From 33fe39c70d4346acd197299656a7b32b434f9bde Mon Sep 17 00:00:00 2001
From: Andrew Golovashevich <landgrafhomyak@gmail.com>
Date: Sun, 26 Jan 2025 17:43:40 +0300
Subject: [PATCH] Separating queries descriptors for strict applying
 '_Selectable'

---
 .../api/v0/{queries => misc}/_Selectable.kt   |  2 +-
 .../serdha/api/v0/queries/DeleteQuery.kt      | 25 ++++++++-------
 .../serdha/api/v0/queries/InsertQuery.kt      |  7 +++--
 .../serdha/api/v0/queries/SelectQuery.kt      | 29 ++++++++++-------
 .../serdha/api/v0/queries/UpdateQuery.kt      | 31 ++++++++++---------
 5 files changed, 53 insertions(+), 41 deletions(-)
 rename src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/{queries => misc}/_Selectable.kt (67%)

diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_Selectable.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/_Selectable.kt
similarity index 67%
rename from src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_Selectable.kt
rename to src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/_Selectable.kt
index 89562dc..b35d507 100644
--- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/queries/_Selectable.kt
+++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/_Selectable.kt
@@ -1,4 +1,4 @@
-package ru.landgrafhomyak.serdha.api.v0.queries
+package ru.landgrafhomyak.serdha.api.v0.misc
 
 @Suppress("ClassName")
 public interface _Selectable<@Suppress("unused") QueryUserExtension : Any>
\ 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 c1261ca..40d5a66 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
@@ -4,25 +4,28 @@ 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.misc._Selectable
 import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
 import ru.landgrafhomyak.serdha.api.v0.table.Table
 
-public interface DeleteQuery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> {
+public interface DeleteQuery<QueryUserExtension : Any> {
 	public val userExtension: QueryUserExtension
 
-	public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
-		public fun createDeleteWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension, SelectorTableUserExtension>): QueryUserExtension
+	public interface FromSubquery<QueryUserExtension : Any> : DeleteQuery<QueryUserExtension>, _Selectable<QueryUserExtension> {
+		public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
+			public fun createDeleteWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension, SelectorTableUserExtension>): QueryUserExtension
 
-		public interface Scope<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
-			public val types: DatabaseTypesProvider
-			public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension>
+			public interface Scope<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
+				public val types: DatabaseTypesProvider
+				public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension>
 
-			public val selectorParams: ParametersSetter.WithRedirect<SelectorTableUserExtension, QueryUserExtension>
-			public var selectorColumn: Column<*, DatabaseType.ROW_ID<TargetTableUserExtension>, SelectorTableUserExtension>
+				public val selectorParams: ParametersSetter.WithRedirect<SelectorTableUserExtension, QueryUserExtension>
+				public var selectorColumn: Column<*, DatabaseType.ROW_ID<TargetTableUserExtension>, SelectorTableUserExtension>
 
-			public fun <RT, DT : DatabaseType<RT>> returnFromSubquery(name: String, column: Column<RT, DT, SelectorTableUserExtension>): Column<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> returnRemovedValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> returnParam(name: String, column: QueryParam<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnFromSubquery(name: String, column: Column<RT, DT, SelectorTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnRemovedValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnParam(name: String, column: QueryParam<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+			}
 		}
 	}
 }
\ No newline at end of file
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 2afe727..d8d65e4 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
@@ -5,6 +5,7 @@ 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.misc._Selectable
 import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
 import ru.landgrafhomyak.serdha.api.v0.table.UniqueIndex
 
@@ -29,7 +30,7 @@ public interface InsertQuery<QueryUserExtension : Any> {
 	}
 
 
-	public interface SingleRow<QueryUserExtension : Any, TargetTableUserExtension : Any> : InsertQuery<QueryUserExtension> {
+	public interface SingleRow<QueryUserExtension : Any> : InsertQuery<QueryUserExtension>, _Selectable<QueryUserExtension> {
 		public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any> {
 			public fun createInsertSingleRowWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension>): QueryUserExtension
 
@@ -47,7 +48,7 @@ public interface InsertQuery<QueryUserExtension : Any> {
 	}
 
 
-	public interface FromSubquery<QueryUserExtension : Any, TargetTableUserExtension : Any> : InsertQuery<QueryUserExtension> {
+	public interface FromSubquery<QueryUserExtension : Any> : InsertQuery<QueryUserExtension>, _Selectable<QueryUserExtension> {
 		public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any, SourceQueryUserExtension : Any> {
 			public fun createInsertSingleRowWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension, SourceQueryUserExtension>): QueryUserExtension
 
@@ -68,7 +69,7 @@ public interface InsertQuery<QueryUserExtension : Any> {
 		}
 	}
 
-	public interface MultipleRows<QueryUserExtension : Any, TargetTableUserExtension : Any> : InsertQuery<QueryUserExtension> {
+	public interface MultipleRows<QueryUserExtension : Any> : InsertQuery<QueryUserExtension> {
 		public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any> {
 			public fun createInsertMultipleRows(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension>): QueryUserExtension
 
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 852f1c4..80d38bf 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
@@ -6,6 +6,7 @@ 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.QueryParam
+import ru.landgrafhomyak.serdha.api.v0.misc._Selectable
 import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
 
 public interface SelectQuery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> {
@@ -37,25 +38,29 @@ public interface SelectQuery<QueryUserExtension : Any> : _Selectable<QueryUserEx
 		public fun <RT, DT : DatabaseType<RT>> returnColumn(name: String, column: IntermediateColumn<RT, DT, QueryUserExtension>): Column<RT, DT, QueryUserExtension>
 	}
 
-	public interface JoinCreator<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> {
-		public fun createSelectWithJoin(creator: Scope<QueryUserExtension, LeftTableUserExtension, RightTableUserExtension>): QueryUserExtension
+	public interface WithJoin<QueryUserExtension : Any> : SelectQuery<QueryUserExtension> {
+		public interface JoinCreator<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> {
+			public fun createSelectWithJoin(creator: Scope<QueryUserExtension, LeftTableUserExtension, RightTableUserExtension>): QueryUserExtension
 
-		public interface Scope<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> {
-			public val leftSubqueryParams: ParametersSetter.WithRedirect<LeftTableUserExtension, QueryUserExtension>
-			public val rightSubqueryParams: ParametersSetter.WithRedirect<RightTableUserExtension, QueryUserExtension>
+			public interface Scope<QueryUserExtension : Any, LeftTableUserExtension : Any, RightTableUserExtension : Any> {
+				public val leftSubqueryParams: ParametersSetter.WithRedirect<LeftTableUserExtension, QueryUserExtension>
+				public val rightSubqueryParams: ParametersSetter.WithRedirect<RightTableUserExtension, QueryUserExtension>
 
-			public fun <RT, DT : DatabaseType<RT>> selectColumnFromLeft(column: Column<RT, DT, LeftTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> selectColumnFromRight(column: Column<RT, DT, RightTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> selectColumnFromLeft(column: Column<RT, DT, LeftTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> selectColumnFromRight(column: Column<RT, DT, RightTableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
+			}
 		}
 	}
 
-	public interface Creator<QueryUserExtension : Any, TableUserExtension : Any> {
-		public fun createSelect(creator: Scope<QueryUserExtension, TableUserExtension>): QueryUserExtension
+	public interface FromSubquery<QueryUserExtension : Any> : InsertQuery<QueryUserExtension> {
+		public interface Creator<QueryUserExtension : Any, TableUserExtension : Any> {
+			public fun createSelect(creator: Scope<QueryUserExtension, TableUserExtension>): QueryUserExtension
 
-		public interface Scope<QueryUserExtension : Any, TableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> {
-			public val subqueryParams: ParametersSetter.WithRedirect<TableUserExtension, QueryUserExtension>
+			public interface Scope<QueryUserExtension : Any, TableUserExtension : Any> : _CommonSelectCreatorScope<QueryUserExtension> {
+				public val subqueryParams: ParametersSetter.WithRedirect<TableUserExtension, QueryUserExtension>
 
-			public fun <RT, DT : DatabaseType<RT>> selectColumnFromSubquery(param: Column<RT, DT, TableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> selectColumnFromSubquery(param: Column<RT, DT, TableUserExtension>): IntermediateColumn<RT, DT, QueryUserExtension>
+			}
 		}
 	}
 }
\ No newline at end of file
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 d1b4d10..1e131a7 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
@@ -5,29 +5,32 @@ 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.misc._Selectable
 import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
 
 public interface UpdateQuery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> {
 	public val userExtension: QueryUserExtension
 
-	public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
-		public fun createUpdateWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension, SelectorTableUserExtension>): QueryUserExtension
+	public interface FromSubquery<QueryUserExtension : Any> : _Selectable<QueryUserExtension> {
+		public interface Creator<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
+			public fun createUpdateFromSubqueryWithReturning(table: Table<TargetTableUserExtension, *>, creator: Scope<QueryUserExtension, TargetTableUserExtension, SelectorTableUserExtension>): QueryUserExtension
 
-		public interface Scope<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
-			public val types: DatabaseTypesProvider
-			public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension>
+			public interface Scope<QueryUserExtension : Any, TargetTableUserExtension : Any, SelectorTableUserExtension : Any> {
+				public val types: DatabaseTypesProvider
+				public fun <RT, DT : DatabaseType<RT>> param(name: String, type: DT): QueryParam<RT, DT, QueryUserExtension>
 
-			public val selectorParams: ParametersSetter.WithRedirect<SelectorTableUserExtension, QueryUserExtension>
-			public var selectorColumn: Column<*, DatabaseType.ROW_ID<TargetTableUserExtension>, SelectorTableUserExtension>
+				public val selectorParams: ParametersSetter.WithRedirect<SelectorTableUserExtension, QueryUserExtension>
+				public var selectorColumn: Column<*, DatabaseType.ROW_ID<TargetTableUserExtension>, SelectorTableUserExtension>
 
-			public fun <RT, DT : DatabaseType<RT>> updateColumnWithSubquery(dst: Column<RT, DT, TargetTableUserExtension>, src: Column<RT, DT, SelectorTableUserExtension>)
-			public fun <RT, DT : DatabaseType<RT>> updateColumnWithOldValue(dst: Column<RT, DT, TargetTableUserExtension>, src: Column<RT, DT, TargetTableUserExtension>)
-			public fun <RT, DT : DatabaseType<RT>> updateColumnWithParam(dst: Column<RT, DT, TargetTableUserExtension>, src: QueryParam<RT, DT, QueryUserExtension>)
+				public fun <RT, DT : DatabaseType<RT>> updateColumnWithSubquery(dst: Column<RT, DT, TargetTableUserExtension>, src: Column<RT, DT, SelectorTableUserExtension>)
+				public fun <RT, DT : DatabaseType<RT>> updateColumnWithOldValue(dst: Column<RT, DT, TargetTableUserExtension>, src: Column<RT, DT, TargetTableUserExtension>)
+				public fun <RT, DT : DatabaseType<RT>> updateColumnWithParam(dst: Column<RT, DT, TargetTableUserExtension>, src: QueryParam<RT, DT, QueryUserExtension>)
 
-			public fun <RT, DT : DatabaseType<RT>> returnFromSubquery(name: String, column: Column<RT, DT, SelectorTableUserExtension>): Column<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> returnOldValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> returnNewValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
-			public fun <RT, DT : DatabaseType<RT>> returnParam(name: String, param: QueryParam<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnFromSubquery(name: String, column: Column<RT, DT, SelectorTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnOldValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnNewValue(name: String, column: Column<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+				public fun <RT, DT : DatabaseType<RT>> returnParam(name: String, param: QueryParam<RT, DT, TargetTableUserExtension>): Column<RT, DT, QueryUserExtension>
+			}
 		}
 	}
 }
\ No newline at end of file