drizzle-orm 0.38.3-791f459 → 0.38.3-86fcd29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/libsql/session.cjs +4 -8
- package/libsql/session.cjs.map +1 -1
- package/libsql/session.js +4 -8
- package/libsql/session.js.map +1 -1
- package/mysql-core/dialect.cjs +20 -10
- package/mysql-core/dialect.cjs.map +1 -1
- package/mysql-core/dialect.d.cts +2 -1
- package/mysql-core/dialect.d.ts +2 -1
- package/mysql-core/dialect.js +20 -10
- package/mysql-core/dialect.js.map +1 -1
- package/mysql2/session.cjs +1 -22
- package/mysql2/session.cjs.map +1 -1
- package/mysql2/session.js +1 -22
- package/mysql2/session.js.map +1 -1
- package/package.json +1 -1
- package/pg-core/dialect.cjs +7 -8
- package/pg-core/dialect.cjs.map +1 -1
- package/pg-core/dialect.js +7 -8
- package/pg-core/dialect.js.map +1 -1
- package/planetscale-serverless/session.cjs +1 -24
- package/planetscale-serverless/session.cjs.map +1 -1
- package/planetscale-serverless/session.js +1 -24
- package/planetscale-serverless/session.js.map +1 -1
- package/relations.cjs +52 -13
- package/relations.cjs.map +1 -1
- package/relations.d.cts +39 -44
- package/relations.d.ts +39 -44
- package/relations.js +60 -15
- package/relations.js.map +1 -1
- package/sqlite-core/dialect.cjs +6 -7
- package/sqlite-core/dialect.cjs.map +1 -1
- package/sqlite-core/dialect.js +6 -7
- package/sqlite-core/dialect.js.map +1 -1
- package/version.cjs +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/relations.d.ts
CHANGED
|
@@ -2,14 +2,14 @@ import { type AnyTable, type InferModelFromColumns, Table } from "./table.js";
|
|
|
2
2
|
import { type AnyColumn, Column } from "./column.js";
|
|
3
3
|
import { entityKind } from "./entity.js";
|
|
4
4
|
import { and, asc, between, desc, exists, ilike, inArray, isNotNull, isNull, like, not, notBetween, notExists, notIlike, notInArray, notLike, or } from "./sql/expressions/index.js";
|
|
5
|
-
import { Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.js";
|
|
5
|
+
import { type Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.js";
|
|
6
6
|
import { type Assume, type Equal, type Simplify, type ValueOrArray, type Writable } from "./utils.js";
|
|
7
7
|
export declare class Relations<TSchema extends Record<string, unknown> = Record<string, unknown>, TTables extends Record<string, Table> = Record<string, Table>, TConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>> {
|
|
8
8
|
readonly schema: TSchema;
|
|
9
9
|
readonly tables: TTables;
|
|
10
10
|
readonly config: TConfig;
|
|
11
11
|
static readonly [entityKind]: string;
|
|
12
|
-
readonly $brand: '
|
|
12
|
+
readonly $brand: 'RelationsV2';
|
|
13
13
|
/** table DB name -> schema table key */
|
|
14
14
|
readonly tableNamesMap: Record<string, string>;
|
|
15
15
|
readonly tablesConfig: TablesRelationalConfig;
|
|
@@ -22,7 +22,7 @@ export declare abstract class Relation<TSourceTableName extends string = string,
|
|
|
22
22
|
name: TTargetTableName;
|
|
23
23
|
}>;
|
|
24
24
|
static readonly [entityKind]: string;
|
|
25
|
-
readonly $brand: '
|
|
25
|
+
readonly $brand: 'RelationV2';
|
|
26
26
|
fieldName: string;
|
|
27
27
|
sourceColumns: AnyColumn<{
|
|
28
28
|
tableName: TSourceTableName;
|
|
@@ -41,7 +41,7 @@ export declare abstract class Relation<TSourceTableName extends string = string,
|
|
|
41
41
|
}
|
|
42
42
|
export declare class One<TSourceTableName extends string, TTargetTableName extends string, TOptional extends boolean = boolean> extends Relation<TSourceTableName, TTargetTableName> {
|
|
43
43
|
static readonly [entityKind]: string;
|
|
44
|
-
protected $relationBrand: '
|
|
44
|
+
protected $relationBrand: 'OneV2';
|
|
45
45
|
readonly optional: TOptional;
|
|
46
46
|
constructor(targetTable: AnyTable<{
|
|
47
47
|
name: TTargetTableName;
|
|
@@ -50,7 +50,7 @@ export declare class One<TSourceTableName extends string, TTargetTableName exten
|
|
|
50
50
|
export declare class Many<TSourceTableName extends string, TTargetTableName extends string> extends Relation<TSourceTableName, TTargetTableName> {
|
|
51
51
|
readonly config: AnyManyConfig | undefined;
|
|
52
52
|
static readonly [entityKind]: string;
|
|
53
|
-
protected $relationBrand: '
|
|
53
|
+
protected $relationBrand: 'ManyV2';
|
|
54
54
|
constructor(targetTable: AnyTable<{
|
|
55
55
|
name: TTargetTableName;
|
|
56
56
|
}>, config: AnyManyConfig | undefined);
|
|
@@ -118,25 +118,20 @@ export type SQLOperator = {
|
|
|
118
118
|
sql: Operators['sql'];
|
|
119
119
|
};
|
|
120
120
|
export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many', TSchema extends TablesRelationalConfig = TablesRelationalConfig, TTableConfig extends TableRelationalConfig = TableRelationalConfig> = {
|
|
121
|
-
config?: TTableConfig['relations'];
|
|
122
121
|
columns?: {
|
|
123
|
-
[K in keyof TTableConfig['columns']]?:
|
|
124
|
-
} |
|
|
125
|
-
[K in keyof TTableConfig['columns']]?: false;
|
|
126
|
-
};
|
|
122
|
+
[K in keyof TTableConfig['columns']]?: boolean | undefined;
|
|
123
|
+
} | undefined;
|
|
127
124
|
with?: {
|
|
128
|
-
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never);
|
|
129
|
-
};
|
|
130
|
-
extras?: Record<string, SQLWrapper> | ((table: Simplify<AnyTable<TTableConfig> &
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
TTableConfig['columns']
|
|
137
|
-
] extends [never] ? {} : TTableConfig['columns']>, operators: OrderByOperators) => ValueOrArray<AnyColumn | SQL>);
|
|
125
|
+
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never) | undefined;
|
|
126
|
+
} | undefined;
|
|
127
|
+
extras?: Record<string, SQLWrapper> | ((table: Simplify<AnyTable<TTableConfig> & TTableConfig['columns']>, operators: SQLOperator) => Record<string, SQLWrapper>) | undefined;
|
|
128
|
+
offset?: number | Placeholder | undefined;
|
|
129
|
+
where?: RelationsFilter<TTableConfig['columns']> | undefined;
|
|
130
|
+
orderBy?: {
|
|
131
|
+
[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;
|
|
132
|
+
} | ((fields: Simplify<AnyTable<TTableConfig> & TTableConfig['columns']>, operators: OrderByOperators) => ValueOrArray<AnyColumn | SQL>) | undefined;
|
|
138
133
|
} & (TRelationType extends 'many' ? {
|
|
139
|
-
limit?: number | Placeholder;
|
|
134
|
+
limit?: number | Placeholder | undefined;
|
|
140
135
|
} : {});
|
|
141
136
|
export interface TableRelationalConfig {
|
|
142
137
|
table: Table;
|
|
@@ -169,7 +164,7 @@ export type ExtractTablesWithRelations<TRelations extends Relations, TTables ext
|
|
|
169
164
|
};
|
|
170
165
|
export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
171
166
|
export type BuildRelationResult<TConfig extends TablesRelationalConfig, TInclude, TRelations extends Record<string, RelationsBuilderEntry>> = {
|
|
172
|
-
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
167
|
+
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : TInclude[K] extends Record<string, unknown> ? TInclude[K]['where'] extends Record<string, any> ? null : never : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
173
168
|
};
|
|
174
169
|
export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
|
|
175
170
|
[K in keyof T as T[K] extends undefined ? never : K]: K;
|
|
@@ -191,12 +186,13 @@ export interface BuildRelationalQueryResult {
|
|
|
191
186
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
192
187
|
isArray?: boolean;
|
|
193
188
|
selection?: BuildRelationalQueryResult['selection'];
|
|
189
|
+
isOptional?: boolean;
|
|
194
190
|
}[];
|
|
195
191
|
sql: SQL;
|
|
196
192
|
}
|
|
197
193
|
export declare function mapRelationalRow(row: Record<string, unknown>, buildQueryResultSelection: BuildRelationalQueryResult['selection'], mapColumnValue?: (value: unknown) => unknown,
|
|
198
194
|
/** Needed for SQLite as it returns JSON values as strings */
|
|
199
|
-
parseJson?: boolean): Record<string, unknown>;
|
|
195
|
+
parseJson?: boolean, path?: string): Record<string, unknown>;
|
|
200
196
|
export declare class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {
|
|
201
197
|
static readonly [entityKind]: string;
|
|
202
198
|
readonly _: {
|
|
@@ -238,24 +234,24 @@ export declare class RelationsBuilderColumn<TTableName extends string = string,
|
|
|
238
234
|
getSQL(): SQL;
|
|
239
235
|
}
|
|
240
236
|
export type RelationFieldsFilterInternals<T> = {
|
|
241
|
-
eq?: T;
|
|
242
|
-
ne?: T;
|
|
243
|
-
gt?: T;
|
|
244
|
-
gte?: T;
|
|
245
|
-
lt?: T;
|
|
246
|
-
lte?: T;
|
|
247
|
-
in?: T[];
|
|
248
|
-
notIn?: T[];
|
|
249
|
-
like?: string;
|
|
250
|
-
ilike?: string;
|
|
251
|
-
notLike?: string;
|
|
252
|
-
notIlike?: string;
|
|
237
|
+
eq?: T | Placeholder;
|
|
238
|
+
ne?: T | Placeholder;
|
|
239
|
+
gt?: T | Placeholder;
|
|
240
|
+
gte?: T | Placeholder;
|
|
241
|
+
lt?: T | Placeholder;
|
|
242
|
+
lte?: T | Placeholder;
|
|
243
|
+
in?: (T | Placeholder)[] | Placeholder;
|
|
244
|
+
notIn?: (T | Placeholder)[] | Placeholder;
|
|
245
|
+
like?: string | Placeholder;
|
|
246
|
+
ilike?: string | Placeholder;
|
|
247
|
+
notLike?: string | Placeholder;
|
|
248
|
+
notIlike?: string | Placeholder;
|
|
253
249
|
isNull?: true;
|
|
254
250
|
isNotNull?: true;
|
|
255
251
|
NOT?: RelationsFieldFilter<T>;
|
|
256
252
|
OR?: RelationsFieldFilter<T>[];
|
|
257
253
|
};
|
|
258
|
-
export type RelationsFieldFilter<T> = T |
|
|
254
|
+
export type RelationsFieldFilter<T> = RelationFieldsFilterInternals<T> | (T extends Record<string, any> ? never : T);
|
|
259
255
|
export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
260
256
|
[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;
|
|
261
257
|
} & {
|
|
@@ -263,9 +259,7 @@ export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
|
263
259
|
NOT?: RelationsFilter<TColumns>;
|
|
264
260
|
RAW?: (table: Simplify<AnyTable<{
|
|
265
261
|
columns: TColumns;
|
|
266
|
-
}> &
|
|
267
|
-
[K in keyof TColumns]: TColumns[K];
|
|
268
|
-
}>, operators: Operators) => SQL;
|
|
262
|
+
}> & TColumns>, operators: Operators) => SQL;
|
|
269
263
|
};
|
|
270
264
|
export interface OneConfig<TSchema extends Record<string, Table>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
271
265
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
@@ -323,7 +317,7 @@ export type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {
|
|
|
323
317
|
};
|
|
324
318
|
export declare function createRelationsHelper<TSchema extends Record<string, unknown>, TTables extends Record<string, Table>>(schema: TSchema): RelationsBuilder<TTables>;
|
|
325
319
|
export declare function defineRelations<TSchema extends Record<string, unknown>, TConfig extends RelationsBuilderConfig<TTables>, TTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>>(schema: TSchema, relations: (helpers: RelationsBuilder<TTables>) => TConfig): Relations<TSchema, TTables, TConfig>;
|
|
326
|
-
export type WithContainer<TRelatedTables extends Record<string, Table>> = {
|
|
320
|
+
export type WithContainer<TRelatedTables extends Record<string, Table> = Record<string, Table>> = {
|
|
327
321
|
with?: {
|
|
328
322
|
[K in keyof TRelatedTables]?: boolean | DBQueryConfig;
|
|
329
323
|
};
|
|
@@ -335,17 +329,18 @@ export type ColumnWithTSName = {
|
|
|
335
329
|
export type RelationsOrder<TColumns extends Record<string, Column>> = {
|
|
336
330
|
[K in keyof TColumns]?: 'asc' | 'desc';
|
|
337
331
|
};
|
|
338
|
-
export type OrderBy =
|
|
339
|
-
export type Extras =
|
|
332
|
+
export type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;
|
|
333
|
+
export type Extras = Exclude<DBQueryConfig['extras'], undefined>;
|
|
340
334
|
export declare function relationsFilterToSQL(table: Table, filter: RelationsFilter<Record<string, Column>>): SQL | undefined;
|
|
341
|
-
export declare function relationsOrderToSQL(table: Table, orders:
|
|
342
|
-
export declare function relationExtrasToSQL(table: Table, extras:
|
|
335
|
+
export declare function relationsOrderToSQL(table: Table, orders: OrderBy): SQL | undefined;
|
|
336
|
+
export declare function relationExtrasToSQL(table: Table, extras: Extras): {
|
|
343
337
|
sql: SQL<unknown> | undefined;
|
|
344
338
|
selection: {
|
|
345
339
|
key: string;
|
|
346
340
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
347
341
|
isArray?: boolean;
|
|
348
342
|
selection?: BuildRelationalQueryResult["selection"];
|
|
343
|
+
isOptional?: boolean;
|
|
349
344
|
}[];
|
|
350
345
|
};
|
|
351
346
|
export declare function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined;
|
package/relations.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
getTableUniqueName,
|
|
3
|
+
IsAlias,
|
|
4
|
+
OriginalName,
|
|
5
|
+
Schema,
|
|
6
|
+
Table
|
|
7
|
+
} from "./table.js";
|
|
2
8
|
import { Columns, getTableName } from "./table.js";
|
|
3
9
|
import { Column } from "./column.js";
|
|
4
10
|
import { entityKind, is } from "./entity.js";
|
|
11
|
+
import { DrizzleError } from "./errors.js";
|
|
5
12
|
import { PrimaryKeyBuilder } from "./pg-core/primary-keys.js";
|
|
6
13
|
import {
|
|
7
14
|
and,
|
|
@@ -28,7 +35,7 @@ import {
|
|
|
28
35
|
notLike,
|
|
29
36
|
or
|
|
30
37
|
} from "./sql/expressions/index.js";
|
|
31
|
-
import {
|
|
38
|
+
import { SQL, sql } from "./sql/sql.js";
|
|
32
39
|
import { getTableColumns } from "./utils.js";
|
|
33
40
|
class Relations {
|
|
34
41
|
constructor(schema, tables, config) {
|
|
@@ -164,7 +171,7 @@ class Relation {
|
|
|
164
171
|
constructor(targetTable) {
|
|
165
172
|
this.targetTable = targetTable;
|
|
166
173
|
}
|
|
167
|
-
static [entityKind] = "
|
|
174
|
+
static [entityKind] = "RelationV2";
|
|
168
175
|
fieldName;
|
|
169
176
|
sourceColumns;
|
|
170
177
|
targetColumns;
|
|
@@ -173,7 +180,7 @@ class Relation {
|
|
|
173
180
|
sourceTable;
|
|
174
181
|
}
|
|
175
182
|
class One extends Relation {
|
|
176
|
-
static [entityKind] = "
|
|
183
|
+
static [entityKind] = "OneV2";
|
|
177
184
|
optional;
|
|
178
185
|
constructor(targetTable, config) {
|
|
179
186
|
super(targetTable);
|
|
@@ -201,7 +208,7 @@ class Many extends Relation {
|
|
|
201
208
|
this.targetColumns = Array.isArray(config.to) ? config.to.map((it) => it._.column) : [config.to._.column];
|
|
202
209
|
}
|
|
203
210
|
}
|
|
204
|
-
static [entityKind] = "
|
|
211
|
+
static [entityKind] = "ManyV2";
|
|
205
212
|
}
|
|
206
213
|
class AggregatedField {
|
|
207
214
|
static [entityKind] = "AggregatedField";
|
|
@@ -218,7 +225,8 @@ class Count extends AggregatedField {
|
|
|
218
225
|
if (!this.query) {
|
|
219
226
|
if (!this.table)
|
|
220
227
|
throw new Error("Table must be set before building aggregate field");
|
|
221
|
-
|
|
228
|
+
const table = this.table;
|
|
229
|
+
this.query = sql`select count(*) as ${sql.identifier("r")} from ${table[IsAlias] ? sql`${sql`${sql.identifier(table[Schema] ?? "")}.`.if(table[Schema])}${sql.identifier(table[OriginalName])} as ${table}` : table}`.mapWith(Number);
|
|
222
230
|
}
|
|
223
231
|
return this.query;
|
|
224
232
|
}
|
|
@@ -255,24 +263,40 @@ const orderByOperators = {
|
|
|
255
263
|
function getOrderByOperators() {
|
|
256
264
|
return orderByOperators;
|
|
257
265
|
}
|
|
258
|
-
function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false) {
|
|
266
|
+
function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false, path) {
|
|
259
267
|
for (const selectionItem of buildQueryResultSelection) {
|
|
260
268
|
const field = selectionItem.field;
|
|
261
269
|
if (is(field, Table)) {
|
|
262
|
-
|
|
270
|
+
const currentPath = `${path ? `${path}.` : ""}${selectionItem.key}`;
|
|
271
|
+
if (row[selectionItem.key] === null) {
|
|
272
|
+
if (!selectionItem.isOptional) {
|
|
273
|
+
throw new DrizzleError({
|
|
274
|
+
message: `Unexpected null in relational query result on field "${currentPath}".
|
|
275
|
+
Did you forget to mark relation as optional?`
|
|
276
|
+
});
|
|
277
|
+
}
|
|
263
278
|
continue;
|
|
279
|
+
}
|
|
264
280
|
if (parseJson)
|
|
265
281
|
row[selectionItem.key] = JSON.parse(row[selectionItem.key]);
|
|
266
282
|
if (selectionItem.isArray) {
|
|
267
283
|
for (const item of row[selectionItem.key]) {
|
|
268
|
-
mapRelationalRow(
|
|
284
|
+
mapRelationalRow(
|
|
285
|
+
item,
|
|
286
|
+
selectionItem.selection,
|
|
287
|
+
mapColumnValue,
|
|
288
|
+
false,
|
|
289
|
+
currentPath
|
|
290
|
+
);
|
|
269
291
|
}
|
|
270
292
|
continue;
|
|
271
293
|
}
|
|
272
294
|
mapRelationalRow(
|
|
273
295
|
row[selectionItem.key],
|
|
274
296
|
selectionItem.selection,
|
|
275
|
-
mapColumnValue
|
|
297
|
+
mapColumnValue,
|
|
298
|
+
false,
|
|
299
|
+
currentPath
|
|
276
300
|
);
|
|
277
301
|
continue;
|
|
278
302
|
}
|
|
@@ -318,7 +342,7 @@ class RelationsBuilderColumn {
|
|
|
318
342
|
}
|
|
319
343
|
through(column) {
|
|
320
344
|
this._.through = column;
|
|
321
|
-
|
|
345
|
+
throw new Error("Not implemented");
|
|
322
346
|
}
|
|
323
347
|
getSQL() {
|
|
324
348
|
return this._.column.getSQL();
|
|
@@ -382,7 +406,7 @@ function defineRelations(schema, relations) {
|
|
|
382
406
|
);
|
|
383
407
|
}
|
|
384
408
|
function relationsFieldFilterToSQL(column, filter) {
|
|
385
|
-
if (typeof filter !== "object"
|
|
409
|
+
if (typeof filter !== "object")
|
|
386
410
|
return eq(column, filter);
|
|
387
411
|
const entries = Object.entries(filter);
|
|
388
412
|
if (!entries.length)
|
|
@@ -409,6 +433,21 @@ function relationsFieldFilterToSQL(column, filter) {
|
|
|
409
433
|
);
|
|
410
434
|
continue;
|
|
411
435
|
}
|
|
436
|
+
case "isNotNull":
|
|
437
|
+
case "isNull": {
|
|
438
|
+
if (!value)
|
|
439
|
+
continue;
|
|
440
|
+
parts.push(operators[target](column));
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
case "in": {
|
|
444
|
+
parts.push(operators.inArray(column, value));
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
case "notIn": {
|
|
448
|
+
parts.push(operators.notInArray(column, value));
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
412
451
|
default: {
|
|
413
452
|
parts.push(
|
|
414
453
|
operators[target](
|
|
@@ -476,14 +515,20 @@ function relationsFilterToSQL(table, filter) {
|
|
|
476
515
|
return and(...parts);
|
|
477
516
|
}
|
|
478
517
|
function relationsOrderToSQL(table, orders) {
|
|
479
|
-
|
|
480
|
-
|
|
518
|
+
if (typeof orders === "function") {
|
|
519
|
+
const data = orders(table, orderByOperators);
|
|
520
|
+
return is(data, SQL) ? data : Array.isArray(data) ? data.length ? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `) : void 0 : is(data, Column) ? asc(data) : void 0;
|
|
521
|
+
}
|
|
522
|
+
const entries = Object.entries(orders).filter(([_, value]) => value);
|
|
523
|
+
if (!entries.length)
|
|
524
|
+
return void 0;
|
|
525
|
+
return sql.join(entries.map(([column, value]) => (value === "asc" ? asc : desc)(table[Columns][column])), sql`, `);
|
|
481
526
|
}
|
|
482
527
|
function relationExtrasToSQL(table, extras) {
|
|
483
528
|
const subqueries = [];
|
|
484
529
|
const selection = [];
|
|
485
530
|
for (const [key, extra] of Object.entries(
|
|
486
|
-
typeof extras === "function" ? extras(table
|
|
531
|
+
typeof extras === "function" ? extras(table, { sql: operators.sql }) : extras
|
|
487
532
|
)) {
|
|
488
533
|
if (!extra)
|
|
489
534
|
continue;
|
package/relations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, IsAlias, Schema, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'Relations';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tif (!is(table, Table)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\tdeclare readonly $brand: 'Relation';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\tdeclare protected $relationBrand: 'One';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: Table | undefined;\n\n\tonTable(table: Table) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tconfig?: TTableConfig['relations'];\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: true;\n\t\t\t}\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: false;\n\t\t\t};\n\t\twith?: {\n\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t| true\n\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t: never);\n\t\t};\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\ttable: Simplify<\n\t\t\t\t\t& AnyTable<TTableConfig>\n\t\t\t\t\t& {\n\t\t\t\t\t\t[K in keyof TTableConfig['columns']]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>);\n\t\toffset?: number | Placeholder;\n\t\twhere?: RelationsFilter<TTableConfig['columns']>;\n\t\torderBy?:\n\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>);\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\t\tif (is(field, Table)) {\n\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(item, selectionItem.selection!, mapColumnValue);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\n\t\treturn this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T;\n\tne?: T;\n\tgt?: T;\n\tgte?: T;\n\tlt?: T;\n\tlte?: T;\n\tin?: T[];\n\tnotIn?: T[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: true;\n\tisNotNull?: true;\n\tNOT?: RelationsFieldFilter<T>;\n\tOR?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> = T | RelationFieldsFilterInternals<T | Placeholder>;\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TColumns>[];\n\t\tNOT?: RelationsFilter<TColumns>;\n\t\tRAW?: (\n\t\t\ttable: Simplify<\n\t\t\t\t& AnyTable<{ columns: TColumns }>\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TColumns]: TColumns[K];\n\t\t\t\t}\n\t\t\t>,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables, string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy =\n\t| ValueOrArray<AnyColumn | SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: OrderByOperators,\n\t) => ValueOrArray<AnyColumn | SQL>);\n\nexport type Extras =\n\t| Record<string, SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: SQLOperator,\n\t) => Record<string, SQL>);\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<any>[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(table, value as RelationsFilter<Record<string, Column>>);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders:\n\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t| ((\n\t\t\tfields: Record<string, Column>,\n\t\t\toperators: OrderByOperators,\n\t\t) => ValueOrArray<AnyColumn | SQL>),\n): SQL | undefined {\n\tconst data = typeof orders === 'function'\n\t\t? orders(table[Columns], orderByOperators)\n\t\t: orders;\n\n\treturn is(data, SQL)\n\t\t? data\n\t\t: Array.isArray(data)\n\t\t? data.length\n\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t: undefined\n\t\t: asc(data);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras:\n\t\t| Record<string, SQLWrapper>\n\t\t| ((columns: Record<string, Column>, operators: SQLOperator) => Record<string, SQLWrapper>),\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table[Columns], { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined {\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(sourceTable[Schema] ?? '')}.`.if(sourceTable[Schema] && !sourceTable[IsAlias])\n\t\t\t}`}${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(targetTable[Schema] ?? '')}.`.if(targetTable[Schema] && !targetTable[IsAlias])\n\t\t\t}`}${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationsFilterToSQL(sourceTable, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"AAAA,SAAwB,oBAAgD,SAAS,QAAQ,aAAa;AACtG,SAAS,SAAS,oBAAoB;AACtC,SAAyB,cAAc;AACvC,SAAS,YAAY,UAAU;AAC/B,SAAS,yBAAyB;AAClC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,aAAa,KAAK,WAA4B;AACvD,SAAkC,uBAAwE;AAEnG,MAAM,UAIX;AAAA,EAOD,YACU,QACA,QACA,QACR;AAHQ;AACA;AACA;AAET,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAI,CAAC,GAAG,OAAO,KAAK;AAAG;AAEvB,WAAK,cAAc,mBAAmB,KAAK,CAAC,IAAI;AAEhD,YAAM,cAAqC,KAAK,aAAa,MAAM,IAAI;AAAA,QACtE;AAAA,QACA;AAAA,QACA,QAAQ,MAAM,MAAM,OAAO,IAAI;AAAA,QAC/B,QAAQ,MAAM,MAAM,OAAO,MAAM;AAAA,QACjC,SAAS,MAAM,MAAM,OAAO,OAAO;AAAA,QACnC,WAAW,OAAO,MAAM,KAAK,CAAC;AAAA,QAC9B,YAAY,CAAC;AAAA,MACd;AAEA,iBAAW,UAAU,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,CAAC,GAAG;AAChE,YAAI,OAAO,SAAS;AACnB,sBAAY,WAAW,KAAK,MAAM;AAAA,QACnC;AAAA,MACD;AAEA,YAAM,cAAc,MAAM,MAAM,OAAO,kBAAkB,IAAI,KAAK;AAClE,UAAI,aAAa;AAChB,mBAAW,eAAe,OAAO,OAAO,WAAW,GAAG;AACrD,cAAI,GAAG,aAAa,iBAAiB,GAAG;AACvC,wBAAY,WAAW,KAAK,GAAG,YAAY,OAAO;AAAA,UACnD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,eAAW,eAAe,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3D,iBAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,YAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,QACD;AAEA,iBAAS,cAAc,YAAY;AACnC,iBAAS,YAAY;AAAA,MACtB;AAAA,IACD;AAEA,eAAW,eAAe,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3D,iBAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,cAAM,oBAAoB,gBAAgB,YAAY,MAAM,IAAI,iBAAiB;AACjF,YAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,QACD;AAEA,YAAI,OAAO,SAAS,UAAU,YAAY,CAAC,SAAS,OAAO;AAC1D,gBAAM,IAAI,MAAM,GAAG,iBAAiB,oEAAoE;AAAA,QACzG;AAEA,YAAI,SAAS,eAAe,WAAW,GAAG;AACzC,gBAAM,IAAI,MAAM,GAAG,iBAAiB,mCAAmC;AAAA,QACxE;AAEA,YAAI,SAAS,eAAe,WAAW,GAAG;AACzC,gBAAM,IAAI,MAAM,GAAG,iBAAiB,iCAAiC;AAAA,QACtE;AAEA,YAAI,SAAS,iBAAiB,SAAS,eAAe;AACrD,cAAI,SAAS,cAAc,WAAW,SAAS,cAAc,QAAQ;AACpE,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB;AAAA,YACrB;AAAA,UACD;AAEA;AAAA,QACD;AAEA,YAAI,SAAS,iBAAiB,SAAS,eAAe;AACrD,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB;AAAA,UACrB;AAAA,QACD;AAQA,YAAI;AACJ,cAAM,oBAAoB,KAAK,cAAc,mBAAmB,SAAS,WAAW,CAAC;AACrF,YAAI,CAAC,mBAAmB;AACvB,gBAAM,IAAI;AAAA,YACT,UAAU,mBAAmB,SAAS,WAAW,CAAC;AAAA,UACnD;AAAA,QACD;AACA,cAAM,qBAAqB,KAAK,aAAa,iBAAiB;AAC9D,YAAI,CAAC,oBAAoB;AACxB,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,sHAAsH,iBAAiB;AAAA,UAC5J;AAAA,QACD;AACA,YAAI,SAAS,OAAO;AACnB,gBAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,YAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,UAAU,SAAS;AAAA,UAC3C;AACA,cAAI,iBAAiB,SAAS,GAAG;AAChC,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,sHAAsH,SAAS,KAAK,qBAAqB,iBAAiB,MAC7L,iBAAiB,IAAI,CAAC,OAAO,IAAI,GAAG,SAAS,GAAG,EAAE,KAAK,IAAI,CAC5D;AAAA,YACD;AAAA,UACD;AACA,4BAAkB,iBAAiB,CAAC;AACpC,cAAI,CAAC,iBAAiB;AACrB,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,8HAA8H,iBAAiB,iBAAiB,SAAS,KAAK;AAAA,YACnM;AAAA,UACD;AAAA,QACD,OAAO;AACN,gBAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,YAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,gBAAgB,SAAS,eAAe,CAAC,GAAG;AAAA,UACpE;AACA,cAAI,iBAAiB,SAAS,GAAG;AAChC,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,mHAAmH,iBAAiB,UACvJ,mBAAmB,SAAS,WAAW,CACxC;AAAA;AAAA,YACD;AAAA,UACD;AACA,4BAAkB,iBAAiB,CAAC;AACpC,cAAI,CAAC,iBAAiB;AACrB,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,qHAAqH,iBAAiB,wBACzJ,mBAAmB,SAAS,WAAW,CACxC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AACA,YAAI,CAAC,gBAAgB,iBAAiB,CAAC,gBAAgB,eAAe;AACrE,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,yGAAyG,iBAAiB,IAAI,gBAAgB,SAAS;AAAA,UAC5K;AAAA,QACD;AAEA,iBAAS,gBAAgB,gBAAgB;AACzC,iBAAS,gBAAgB,gBAAgB;AACzC,iBAAS,QAAQ,gBAAgB;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA,EA3JA,QAAiB,UAAU,IAAY;AAAA;AAAA,EAG9B,gBAAwC,CAAC;AAAA,EACzC,eAAuC,CAAC;AAwJlD;AAKO,MAAe,SAGpB;AAAA,EAWD,YACU,aACR;AADQ;AAAA,EAEV;AAAA,EAbA,QAAiB,UAAU,IAAY;AAAA,EAGvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAMD;AAEO,MAAM,YAIH,SAA6C;AAAA,EACtD,QAA0B,UAAU,IAAY;AAAA,EAGvC;AAAA,EAET,YACC,aACA,QACC;AACD,UAAM,WAAW;AACjB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,gBAAgB,MAAM,QAAQ,OAAO,IAAI,IAC3C,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IACjF,CAAE,OAAO,KAAoC,EAAE,MAAoD;AAAA,IACvG;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,gBAAgB,MAAM,QAAQ,OAAO,EAAE,IACzC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IAC/E,CAAE,OAAO,GAAkC,EAAE,MAAoD;AAAA,IACrG;AACA,SAAK,WAAY,QAAQ,YAAY;AAAA,EACtC;AACD;AAEO,MAAM,aAGH,SAA6C;AAAA,EAItD,YACC,aACS,QACR;AACD,UAAM,WAAW;AAFR;AAGT,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,gBAAgB,MAAM,QAAQ,OAAO,IAAI,IAC3C,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IACjF,CAAE,OAAO,KAAoC,EAAE,MAAoD;AAAA,IACvG;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,gBAAgB,MAAM,QAAQ,OAAO,EAAE,IACzC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IAC/E,CAAE,OAAO,GAAkC,EAAE,MAAoD;AAAA,IACrG;AAAA,EACD;AAAA,EApBA,QAA0B,UAAU,IAAY;AAqBjD;AAEO,MAAe,gBAAsD;AAAA,EAC3E,QAAiB,UAAU,IAAY;AAAA,EAQ7B;AAAA,EAEV,QAAQ,OAAc;AACrB,SAAK,QAAQ;AAEb,WAAO;AAAA,EACR;AAGD;AAEO,MAAM,cAAc,gBAAwB;AAAA,EAClD,QAA0B,UAAU,IAAY;AAAA,EAIxC;AAAA,EAER,SAAsB;AACrB,QAAI,CAAC,KAAK,OAAO;AAChB,UAAI,CAAC,KAAK;AAAO,cAAM,IAAI,MAAM,mDAAmD;AAEpF,WAAK,QAAQ,yBAAyB,IAAI,WAAW,GAAG,CAAC,SAAS,KAAK,KAAK,GAAG,QAAQ,MAAM;AAAA,IAC9F;AAEA,WAAO,KAAK;AAAA,EACb;AACD;AAgBO,MAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAIO,MAAM,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACD;AAEO,SAAS,sBAAsB;AACrC,SAAO;AACR;AAgOO,SAAS,iBACf,KACA,2BACA,iBAA8C,CAAC,UAAU,OAEzD,YAAqB,OACK;AAC1B,aACO,iBAAiB,2BACtB;AACD,UAAM,QAAQ,cAAc;AAC5B,QAAI,GAAG,OAAO,KAAK,GAAG;AACrB,UAAI,IAAI,cAAc,GAAG,MAAM;AAAM;AACrC,UAAI;AAAW,YAAI,cAAc,GAAG,IAAI,KAAK,MAAM,IAAI,cAAc,GAAG,CAAW;AAEnF,UAAI,cAAc,SAAS;AAC1B,mBAAW,QAAS,IAAI,cAAc,GAAG,GAAsC;AAC9E,2BAAiB,MAAM,cAAc,WAAY,cAAc;AAAA,QAChE;AAEA;AAAA,MACD;AAEA;AAAA,QACC,IAAI,cAAc,GAAG;AAAA,QACrB,cAAc;AAAA,QACd;AAAA,MACD;AAEA;AAAA,IACD;AAEA,UAAM,QAAQ,eAAe,IAAI,cAAc,GAAG,CAAC;AACnD,QAAI,UAAU;AAAM;AAEpB,QAAI;AACJ,QAAI,GAAG,OAAO,MAAM,GAAG;AACtB,gBAAU;AAAA,IACX,WAAW,GAAG,OAAO,GAAG,GAAG;AAC1B,gBAAU,MAAM;AAAA,IACjB,WAAW,GAAG,OAAO,IAAI,OAAO,GAAG;AAClC,gBAAU,MAAM,IAAI;AAAA,IACrB,OAAO;AACN,gBAAU,MAAM,OAAO,EAAE;AAAA,IAC1B;AACA,QAAI,cAAc,GAAG,IAAI,QAAQ,mBAAmB,KAAK;AAAA,EAC1D;AAEA,SAAO;AACR;AAEO,MAAM,sBAAgF;AAAA,EAC5F,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAKT,YAAY,OAAuC;AAClD,SAAK,IAAI;AAAA,MACR,MAAM,aAAa,KAAK;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,SAAc;AACb,WAAO,KAAK,EAAE,MAAM,OAAO;AAAA,EAC5B;AACD;AAaO,MAAM,uBAG0D;AAAA,EACtE,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAOT,YAAY,QAA8C;AACzD,SAAK,IAAI;AAAA,MACR,WAAW,aAAa,OAAO,KAAK;AAAA,MACpC,MAAM;AAAA,MACN;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAQ,QAA0E;AACjF,SAAK,EAAE,UAAU;AAEjB,WAAO;AAAA,EACR;AAAA,EAEA,SAAc;AACb,WAAO,KAAK,EAAE,OAAO,OAAO;AAAA,EAC7B;AACD;AAkIO,MAAM,sBAA6D;AAAA,EACzE,QAAiB,UAAU,IAAY;AAAA,EAG9B;AAAA,EAIT,YAAY,QAAiB;AAC5B,SAAK,IAAI;AAAA,MACR;AAAA,IACD;AAEA,UAAM,MAA8C,CAAC;AACrD,UAAM,OAAgD,CAAC;AAEvD,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,UAAI,SAAS,IAAI,CAAC,WAAW;AAC5B,eAAO,IAAI,IAAI,OAAO,MAA8B;AAAA,MACrD;AAEA,WAAK,SAAS,IAAI,CAAC,WAAW;AAC7B,eAAO,IAAI,KAAK,OAAO,MAA+B;AAAA,MACvD;AAAA,IACD;AAEA,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACb;AAAA,EAEA;AAAA,EAIA;AAAA,EAIA,OAAO;AAAA,IACN,QAAe;AACd,aAAO,IAAI,MAAM;AAAA,IAClB;AAAA,EACD;AACD;AA8BO,SAAS,sBAGd,QAA4C;AAC7C,QAAM,eAAe,OAAO;AAAA,IAC3B,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,MAAiC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;AAAA,EAChF;AACA,QAAM,eAAe,IAAI,sBAAsB,YAAY;AAC3D,QAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,OAA8C,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC1G,QAAI,GAAG,OAAO,KAAK,GAAG;AACrB,YAAM,SAAS,IAAI,sBAAsB,KAAK;AAC9C,YAAM,UAAU,OAAO,QAAQ,gBAAgB,KAAK,CAAC,EAAE;AAAA,QACtD,CAACA,MAAK,CAACC,MAAK,MAAM,MAAM;AACvB,gBAAM,WAAW,IAAI,uBAAuB,MAAM;AAClD,UAAAD,KAAIC,IAAG,IAAI;AACX,iBAAOD;AAAA,QACR;AAAA,QACA,CAAC;AAAA,MACF;AACA,UAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,OAAO;AAAA,IACzC;AACA,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO,OAAO,OAAO,cAAc,MAAM;AAC1C;AAEO,SAAS,gBAKf,QACA,WACuC;AACvC,SAAO,IAAI;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU,sBAAsB,MAA4B,CAAC;AAAA,EAC9D;AACD;AA+BA,SAAS,0BAA0B,QAAgB,QAAwD;AAC1G,MAAI,OAAO,WAAW,YAAY,GAAG,QAAQ,WAAW;AAAG,WAAO,GAAG,QAAQ,MAAM;AAEnF,QAAM,UAAU,OAAO,QAAQ,MAAgD;AAC/E,MAAI,CAAC,QAAQ;AAAQ,WAAO;AAE5B,QAAM,QAAiB,CAAC;AACxB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU;AAAW;AAEzB,YAAQ,QAAQ;AAAA,MACf,KAAK,OAAO;AACX,cAAM,MAAM,0BAA0B,QAAQ,KAAsC;AACpF,YAAI,CAAC;AAAK;AAEV,cAAM,KAAK,IAAI,GAAG,CAAC;AAEnB;AAAA,MACD;AAAA,MACA,KAAK,MAAM;AACV,YAAI,CAAE,MAA0C;AAAQ;AAExD,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAAiC,IAAI,CAAC,cAAc,0BAA0B,QAAQ,SAAS,CAAC;AAAA,UACrG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MAEA,SAAS;AACR,cAAM;AAAA,UACJ,UAAU,MAAgC;AAAA,YAC1C;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,CAAC,MAAM;AAAQ,WAAO;AAE1B,SAAO,IAAI,GAAG,KAAK;AACpB;AAEO,SAAS,qBACf,OACA,QACkB;AAClB,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,MAAI,CAAC,QAAQ;AAAQ,WAAO;AAE5B,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU;AAAW;AAEzB,YAAQ,QAAQ;AAAA,MACf,KAAK,OAAO;AACX,YAAI,OAAO;AACV,gBAAM;AAAA,YACJ,MAAuE,MAAM,OAAO,GAAG,SAAS;AAAA,UAClG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,MAAM;AACV,YAAI,CAAE,OAAiE;AAAQ;AAE/E,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAAoD;AAAA,cAAI,CAAC,cAC5D,qBAAqB,OAAO,SAAS;AAAA,YACtC;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,OAAO;AACX,YAAI,UAAU;AAAW;AAEzB,cAAM,QAAQ,qBAAqB,OAAO,KAAgD;AAC1F,YAAI,CAAC;AAAO;AAEZ,cAAM,KAAK,IAAI,KAAK,CAAC;AAErB;AAAA,MACD;AAAA,MACA,SAAS;AACR,cAAM,YAAY;AAAA,UACjB,MAAM,MAAqB;AAAA,UAC3B;AAAA,QACD;AACA,YAAI;AAAW,gBAAM,KAAK,SAAS;AAEnC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO,IAAI,GAAG,KAAK;AACpB;AAEO,SAAS,oBACf,OACA,QAMkB;AAClB,QAAM,OAAO,OAAO,WAAW,aAC5B,OAAO,MAAM,OAAO,GAAG,gBAAgB,IACvC;AAEH,SAAO,GAAG,MAAM,GAAG,IAChB,OACA,MAAM,QAAQ,IAAI,IAClB,KAAK,SACJ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,IAC1D,SACD,IAAI,IAAI;AACZ;AAEO,SAAS,oBACf,OACA,QAGC;AACD,QAAM,aAAoB,CAAC;AAC3B,QAAM,YAAqD,CAAC;AAE5D,aACO,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,IAC5B,OAAO,WAAW,aAAa,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK,UAAU,IAAI,CAAC,IAAI;AAAA,EACjF,GACC;AACD,QAAI,CAAC;AAAO;AAEZ,UAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAE9D,UAAM,UAAU,MAAM,OAAO,EAAE;AAE/B,eAAW,KAAK,KAAK;AACrB,cAAU,KAAK;AAAA,MACd;AAAA,MACA,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,KAAK,WAAW,SAAS,IAAI,KAAK,YAAY,OAAO,IAAI;AAAA,IACzD;AAAA,EACD;AACD;AAEO,SAAS,cAAc,UAAoB,aAAoB,aAAqC;AAC1G,QAAM,cAAc,SAAS,cAAc,IAAI,CAAC,GAAG,MAAM;AACxD,UAAM,IAAI,SAAS,cAAc,CAAC;AAElC,WAAO;AAAA,MACN,MAAM,MACL,MAAM,IAAI,WAAW,YAAY,MAAM,KAAK,EAAE,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC,YAAY,OAAO,CAAC,CACnG,EAAE,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC;AAAA,MAC1C,MAAM,MACL,MAAM,IAAI,WAAW,YAAY,MAAM,KAAK,EAAE,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC,YAAY,OAAO,CAAC,CACnG,EAAE,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC;AAAA,IAC3C;AAAA,EACD,CAAC;AAED,QAAM,cAAc,SAAS,QAC1B,IAAI,GAAG,aAAa,qBAAqB,aAAa,SAAS,KAAK,CAAC,IACrE,IAAI,GAAG,WAAW;AAErB,SAAO;AACR;","names":["acc","key"]}
|
|
1
|
+
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import {\n\ttype AnyTable,\n\tgetTableUniqueName,\n\ttype InferModelFromColumns,\n\tIsAlias,\n\tOriginalName,\n\tSchema,\n\tTable,\n} from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'RelationsV2';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tif (!is(table, Table)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: Table | undefined;\n\n\tonTable(table: Table) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\n\t\t\tconst table = this.table;\n\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${\n\t\t\t\ttable[IsAlias]\n\t\t\t\t\t? sql`${sql`${sql.identifier(table[Schema] ?? '')}.`.if(table[Schema])}${\n\t\t\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t\t\t} as ${table}`\n\t\t\t\t\t: table\n\t\t\t}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean | undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>\n\t\t\t\t\t\t: never)\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\ttable: Simplify<\n\t\t\t\t\t& AnyTable<TTableConfig>\n\t\t\t\t\t& TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t\twhere?: RelationsFilter<TTableConfig['columns']> | undefined;\n\t\torderBy?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;\n\t\t\t}\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\tAnyTable<TTableConfig> & TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null\n\t\t\t\t\t\t: TInclude[K] extends Record<string, unknown> ? TInclude[K]['where'] extends Record<string, any> ? null\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t: never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\tisOptional?: boolean;\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\tpath?: string,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\n\t\tif (is(field, Table)) {\n\t\t\tconst currentPath = `${path ? `${path}.` : ''}${selectionItem.key}`;\n\n\t\t\tif (row[selectionItem.key] === null) {\n\t\t\t\tif (!selectionItem.isOptional) {\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Unexpected null in relational query result on field \"${currentPath}\".\\nDid you forget to mark relation as optional?`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tcurrentPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t\tfalse,\n\t\t\t\tcurrentPath,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\t\tthrow new Error('Not implemented');\n\t\t// return this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T | Placeholder;\n\tne?: T | Placeholder;\n\tgt?: T | Placeholder;\n\tgte?: T | Placeholder;\n\tlt?: T | Placeholder;\n\tlte?: T | Placeholder;\n\tin?: (T | Placeholder)[] | Placeholder;\n\tnotIn?: (T | Placeholder)[] | Placeholder;\n\tlike?: string | Placeholder;\n\tilike?: string | Placeholder;\n\tnotLike?: string | Placeholder;\n\tnotIlike?: string | Placeholder;\n\tisNull?: true;\n\tisNotNull?: true;\n\tNOT?: RelationsFieldFilter<T>;\n\tOR?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tT extends Record<string, any> ? never : T\n\t);\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TColumns>[];\n\t\tNOT?: RelationsFilter<TColumns>;\n\t\tRAW?: (\n\t\t\ttable: Simplify<\n\t\t\t\t& AnyTable<{ columns: TColumns }>\n\t\t\t\t& TColumns\n\t\t\t>,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables, string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table> = Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<DBQueryConfig['extras'], undefined>;\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object') return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<any>[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tparts.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tparts.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tparts.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(table, value as RelationsFilter<Record<string, Column>>);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(entries.map(([column, value]) => (value === 'asc' ? asc : desc)(table[Columns][column]!)), sql`, `);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table as any, { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined {\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(sourceTable[Schema] ?? '')}.`.if(sourceTable[Schema] && !sourceTable[IsAlias])\n\t\t\t}`}${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(targetTable[Schema] ?? '')}.`.if(targetTable[Schema] && !targetTable[IsAlias])\n\t\t\t}`}${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationsFilterToSQL(sourceTable, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"AAAA;AAAA,EAEC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,SAAS,oBAAoB;AACtC,SAAyB,cAAc;AACvC,SAAS,YAAY,UAAU;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAA2B,KAAK,WAA4B;AAC5D,SAAkC,uBAAwE;AAEnG,MAAM,UAIX;AAAA,EAOD,YACU,QACA,QACA,QACR;AAHQ;AACA;AACA;AAET,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAI,CAAC,GAAG,OAAO,KAAK;AAAG;AAEvB,WAAK,cAAc,mBAAmB,KAAK,CAAC,IAAI;AAEhD,YAAM,cAAqC,KAAK,aAAa,MAAM,IAAI;AAAA,QACtE;AAAA,QACA;AAAA,QACA,QAAQ,MAAM,MAAM,OAAO,IAAI;AAAA,QAC/B,QAAQ,MAAM,MAAM,OAAO,MAAM;AAAA,QACjC,SAAS,MAAM,MAAM,OAAO,OAAO;AAAA,QACnC,WAAW,OAAO,MAAM,KAAK,CAAC;AAAA,QAC9B,YAAY,CAAC;AAAA,MACd;AAEA,iBAAW,UAAU,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,CAAC,GAAG;AAChE,YAAI,OAAO,SAAS;AACnB,sBAAY,WAAW,KAAK,MAAM;AAAA,QACnC;AAAA,MACD;AAEA,YAAM,cAAc,MAAM,MAAM,OAAO,kBAAkB,IAAI,KAAK;AAClE,UAAI,aAAa;AAChB,mBAAW,eAAe,OAAO,OAAO,WAAW,GAAG;AACrD,cAAI,GAAG,aAAa,iBAAiB,GAAG;AACvC,wBAAY,WAAW,KAAK,GAAG,YAAY,OAAO;AAAA,UACnD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,eAAW,eAAe,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3D,iBAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,YAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,QACD;AAEA,iBAAS,cAAc,YAAY;AACnC,iBAAS,YAAY;AAAA,MACtB;AAAA,IACD;AAEA,eAAW,eAAe,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3D,iBAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,cAAM,oBAAoB,gBAAgB,YAAY,MAAM,IAAI,iBAAiB;AACjF,YAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,QACD;AAEA,YAAI,OAAO,SAAS,UAAU,YAAY,CAAC,SAAS,OAAO;AAC1D,gBAAM,IAAI,MAAM,GAAG,iBAAiB,oEAAoE;AAAA,QACzG;AAEA,YAAI,SAAS,eAAe,WAAW,GAAG;AACzC,gBAAM,IAAI,MAAM,GAAG,iBAAiB,mCAAmC;AAAA,QACxE;AAEA,YAAI,SAAS,eAAe,WAAW,GAAG;AACzC,gBAAM,IAAI,MAAM,GAAG,iBAAiB,iCAAiC;AAAA,QACtE;AAEA,YAAI,SAAS,iBAAiB,SAAS,eAAe;AACrD,cAAI,SAAS,cAAc,WAAW,SAAS,cAAc,QAAQ;AACpE,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB;AAAA,YACrB;AAAA,UACD;AAEA;AAAA,QACD;AAEA,YAAI,SAAS,iBAAiB,SAAS,eAAe;AACrD,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB;AAAA,UACrB;AAAA,QACD;AAQA,YAAI;AACJ,cAAM,oBAAoB,KAAK,cAAc,mBAAmB,SAAS,WAAW,CAAC;AACrF,YAAI,CAAC,mBAAmB;AACvB,gBAAM,IAAI;AAAA,YACT,UAAU,mBAAmB,SAAS,WAAW,CAAC;AAAA,UACnD;AAAA,QACD;AACA,cAAM,qBAAqB,KAAK,aAAa,iBAAiB;AAC9D,YAAI,CAAC,oBAAoB;AACxB,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,sHAAsH,iBAAiB;AAAA,UAC5J;AAAA,QACD;AACA,YAAI,SAAS,OAAO;AACnB,gBAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,YAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,UAAU,SAAS;AAAA,UAC3C;AACA,cAAI,iBAAiB,SAAS,GAAG;AAChC,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,sHAAsH,SAAS,KAAK,qBAAqB,iBAAiB,MAC7L,iBAAiB,IAAI,CAAC,OAAO,IAAI,GAAG,SAAS,GAAG,EAAE,KAAK,IAAI,CAC5D;AAAA,YACD;AAAA,UACD;AACA,4BAAkB,iBAAiB,CAAC;AACpC,cAAI,CAAC,iBAAiB;AACrB,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,8HAA8H,iBAAiB,iBAAiB,SAAS,KAAK;AAAA,YACnM;AAAA,UACD;AAAA,QACD,OAAO;AACN,gBAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,YAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,gBAAgB,SAAS,eAAe,CAAC,GAAG;AAAA,UACpE;AACA,cAAI,iBAAiB,SAAS,GAAG;AAChC,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,mHAAmH,iBAAiB,UACvJ,mBAAmB,SAAS,WAAW,CACxC;AAAA;AAAA,YACD;AAAA,UACD;AACA,4BAAkB,iBAAiB,CAAC;AACpC,cAAI,CAAC,iBAAiB;AACrB,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,qHAAqH,iBAAiB,wBACzJ,mBAAmB,SAAS,WAAW,CACxC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AACA,YAAI,CAAC,gBAAgB,iBAAiB,CAAC,gBAAgB,eAAe;AACrE,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,yGAAyG,iBAAiB,IAAI,gBAAgB,SAAS;AAAA,UAC5K;AAAA,QACD;AAEA,iBAAS,gBAAgB,gBAAgB;AACzC,iBAAS,gBAAgB,gBAAgB;AACzC,iBAAS,QAAQ,gBAAgB;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA,EA3JA,QAAiB,UAAU,IAAY;AAAA;AAAA,EAG9B,gBAAwC,CAAC;AAAA,EACzC,eAAuC,CAAC;AAwJlD;AAKO,MAAe,SAGpB;AAAA,EAWD,YACU,aACR;AADQ;AAAA,EAEV;AAAA,EAbA,QAAiB,UAAU,IAAY;AAAA,EAGvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAMD;AAEO,MAAM,YAIH,SAA6C;AAAA,EACtD,QAA0B,UAAU,IAAY;AAAA,EAGvC;AAAA,EAET,YACC,aACA,QACC;AACD,UAAM,WAAW;AACjB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,gBAAgB,MAAM,QAAQ,OAAO,IAAI,IAC3C,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IACjF,CAAE,OAAO,KAAoC,EAAE,MAAoD;AAAA,IACvG;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,gBAAgB,MAAM,QAAQ,OAAO,EAAE,IACzC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IAC/E,CAAE,OAAO,GAAkC,EAAE,MAAoD;AAAA,IACrG;AACA,SAAK,WAAY,QAAQ,YAAY;AAAA,EACtC;AACD;AAEO,MAAM,aAGH,SAA6C;AAAA,EAItD,YACC,aACS,QACR;AACD,UAAM,WAAW;AAFR;AAGT,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,gBAAgB,MAAM,QAAQ,OAAO,IAAI,IAC3C,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IACjF,CAAE,OAAO,KAAoC,EAAE,MAAoD;AAAA,IACvG;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,gBAAgB,MAAM,QAAQ,OAAO,EAAE,IACzC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,MAAoD,IAC/E,CAAE,OAAO,GAAkC,EAAE,MAAoD;AAAA,IACrG;AAAA,EACD;AAAA,EApBA,QAA0B,UAAU,IAAY;AAqBjD;AAEO,MAAe,gBAAsD;AAAA,EAC3E,QAAiB,UAAU,IAAY;AAAA,EAQ7B;AAAA,EAEV,QAAQ,OAAc;AACrB,SAAK,QAAQ;AAEb,WAAO;AAAA,EACR;AAGD;AAEO,MAAM,cAAc,gBAAwB;AAAA,EAClD,QAA0B,UAAU,IAAY;AAAA,EAIxC;AAAA,EAER,SAAsB;AACrB,QAAI,CAAC,KAAK,OAAO;AAChB,UAAI,CAAC,KAAK;AAAO,cAAM,IAAI,MAAM,mDAAmD;AAEpF,YAAM,QAAQ,KAAK;AAEnB,WAAK,QAAQ,yBAAyB,IAAI,WAAW,GAAG,CAAC,SACxD,MAAM,OAAO,IACV,MAAM,MAAM,IAAI,WAAW,MAAM,MAAM,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,GACrE,IAAI,WAAW,MAAM,YAAY,CAAC,CACnC,OAAO,KAAK,KACV,KACJ,GAAG,QAAQ,MAAM;AAAA,IAClB;AAEA,WAAO,KAAK;AAAA,EACb;AACD;AAgBO,MAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAIO,MAAM,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACD;AAEO,SAAS,sBAAsB;AACrC,SAAO;AACR;AAqOO,SAAS,iBACf,KACA,2BACA,iBAA8C,CAAC,UAAU,OAEzD,YAAqB,OACrB,MAC0B;AAC1B,aACO,iBAAiB,2BACtB;AACD,UAAM,QAAQ,cAAc;AAE5B,QAAI,GAAG,OAAO,KAAK,GAAG;AACrB,YAAM,cAAc,GAAG,OAAO,GAAG,IAAI,MAAM,EAAE,GAAG,cAAc,GAAG;AAEjE,UAAI,IAAI,cAAc,GAAG,MAAM,MAAM;AACpC,YAAI,CAAC,cAAc,YAAY;AAC9B,gBAAM,IAAI,aAAa;AAAA,YACtB,SACC,wDAAwD,WAAW;AAAA;AAAA,UACrE,CAAC;AAAA,QACF;AAEA;AAAA,MACD;AAEA,UAAI;AAAW,YAAI,cAAc,GAAG,IAAI,KAAK,MAAM,IAAI,cAAc,GAAG,CAAW;AAEnF,UAAI,cAAc,SAAS;AAC1B,mBAAW,QAAS,IAAI,cAAc,GAAG,GAAsC;AAC9E;AAAA,YACC;AAAA,YACA,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAEA;AAAA,QACC,IAAI,cAAc,GAAG;AAAA,QACrB,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA;AAAA,IACD;AAEA,UAAM,QAAQ,eAAe,IAAI,cAAc,GAAG,CAAC;AACnD,QAAI,UAAU;AAAM;AAEpB,QAAI;AACJ,QAAI,GAAG,OAAO,MAAM,GAAG;AACtB,gBAAU;AAAA,IACX,WAAW,GAAG,OAAO,GAAG,GAAG;AAC1B,gBAAU,MAAM;AAAA,IACjB,WAAW,GAAG,OAAO,IAAI,OAAO,GAAG;AAClC,gBAAU,MAAM,IAAI;AAAA,IACrB,OAAO;AACN,gBAAU,MAAM,OAAO,EAAE;AAAA,IAC1B;AACA,QAAI,cAAc,GAAG,IAAI,QAAQ,mBAAmB,KAAK;AAAA,EAC1D;AAEA,SAAO;AACR;AAEO,MAAM,sBAAgF;AAAA,EAC5F,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAKT,YAAY,OAAuC;AAClD,SAAK,IAAI;AAAA,MACR,MAAM,aAAa,KAAK;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,SAAc;AACb,WAAO,KAAK,EAAE,MAAM,OAAO;AAAA,EAC5B;AACD;AAaO,MAAM,uBAG0D;AAAA,EACtE,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAOT,YAAY,QAA8C;AACzD,SAAK,IAAI;AAAA,MACR,WAAW,aAAa,OAAO,KAAK;AAAA,MACpC,MAAM;AAAA,MACN;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAQ,QAA0E;AACjF,SAAK,EAAE,UAAU;AACjB,UAAM,IAAI,MAAM,iBAAiB;AAAA,EAElC;AAAA,EAEA,SAAc;AACb,WAAO,KAAK,EAAE,OAAO,OAAO;AAAA,EAC7B;AACD;AAoIO,MAAM,sBAA6D;AAAA,EACzE,QAAiB,UAAU,IAAY;AAAA,EAG9B;AAAA,EAIT,YAAY,QAAiB;AAC5B,SAAK,IAAI;AAAA,MACR;AAAA,IACD;AAEA,UAAM,MAA8C,CAAC;AACrD,UAAM,OAAgD,CAAC;AAEvD,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,UAAI,SAAS,IAAI,CAAC,WAAW;AAC5B,eAAO,IAAI,IAAI,OAAO,MAA8B;AAAA,MACrD;AAEA,WAAK,SAAS,IAAI,CAAC,WAAW;AAC7B,eAAO,IAAI,KAAK,OAAO,MAA+B;AAAA,MACvD;AAAA,IACD;AAEA,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACb;AAAA,EAEA;AAAA,EAIA;AAAA,EAIA,OAAO;AAAA,IACN,QAAe;AACd,aAAO,IAAI,MAAM;AAAA,IAClB;AAAA,EACD;AACD;AA8BO,SAAS,sBAGd,QAA4C;AAC7C,QAAM,eAAe,OAAO;AAAA,IAC3B,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,MAAiC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;AAAA,EAChF;AACA,QAAM,eAAe,IAAI,sBAAsB,YAAY;AAC3D,QAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,OAA8C,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC1G,QAAI,GAAG,OAAO,KAAK,GAAG;AACrB,YAAM,SAAS,IAAI,sBAAsB,KAAK;AAC9C,YAAM,UAAU,OAAO,QAAQ,gBAAgB,KAAK,CAAC,EAAE;AAAA,QACtD,CAACA,MAAK,CAACC,MAAK,MAAM,MAAM;AACvB,gBAAM,WAAW,IAAI,uBAAuB,MAAM;AAClD,UAAAD,KAAIC,IAAG,IAAI;AACX,iBAAOD;AAAA,QACR;AAAA,QACA,CAAC;AAAA,MACF;AACA,UAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,OAAO;AAAA,IACzC;AACA,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO,OAAO,OAAO,cAAc,MAAM;AAC1C;AAEO,SAAS,gBAKf,QACA,WACuC;AACvC,SAAO,IAAI;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU,sBAAsB,MAA4B,CAAC;AAAA,EAC9D;AACD;AAqBA,SAAS,0BAA0B,QAAgB,QAAwD;AAC1G,MAAI,OAAO,WAAW;AAAU,WAAO,GAAG,QAAQ,MAAM;AAExD,QAAM,UAAU,OAAO,QAAQ,MAAgD;AAC/E,MAAI,CAAC,QAAQ;AAAQ,WAAO;AAE5B,QAAM,QAAiB,CAAC;AACxB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU;AAAW;AAEzB,YAAQ,QAAwD;AAAA,MAC/D,KAAK,OAAO;AACX,cAAM,MAAM,0BAA0B,QAAQ,KAAsC;AACpF,YAAI,CAAC;AAAK;AAEV,cAAM,KAAK,IAAI,GAAG,CAAC;AAEnB;AAAA,MACD;AAAA,MAEA,KAAK,MAAM;AACV,YAAI,CAAE,MAA0C;AAAQ;AAExD,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAAiC,IAAI,CAAC,cAAc,0BAA0B,QAAQ,SAAS,CAAC;AAAA,UACrG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,UAAU;AACd,YAAI,CAAC;AAAO;AAEZ,cAAM,KAAK,UAAU,MAAgC,EAAE,MAAM,CAAC;AAE9D;AAAA,MACD;AAAA,MAEA,KAAK,MAAM;AACV,cAAM,KAAK,UAAU,QAAQ,QAAQ,KAA4B,CAAC;AAElE;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,cAAM,KAAK,UAAU,WAAW,QAAQ,KAA4B,CAAC;AAErE;AAAA,MACD;AAAA,MAEA,SAAS;AACR,cAAM;AAAA,UACJ,UAAU,MAAgC;AAAA,YAC1C;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,CAAC,MAAM;AAAQ,WAAO;AAE1B,SAAO,IAAI,GAAG,KAAK;AACpB;AAEO,SAAS,qBACf,OACA,QACkB;AAClB,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,MAAI,CAAC,QAAQ;AAAQ,WAAO;AAE5B,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU;AAAW;AAEzB,YAAQ,QAAQ;AAAA,MACf,KAAK,OAAO;AACX,YAAI,OAAO;AACV,gBAAM;AAAA,YACJ,MAAuE,MAAM,OAAO,GAAG,SAAS;AAAA,UAClG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,MAAM;AACV,YAAI,CAAE,OAAiE;AAAQ;AAE/E,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAAoD;AAAA,cAAI,CAAC,cAC5D,qBAAqB,OAAO,SAAS;AAAA,YACtC;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,OAAO;AACX,YAAI,UAAU;AAAW;AAEzB,cAAM,QAAQ,qBAAqB,OAAO,KAAgD;AAC1F,YAAI,CAAC;AAAO;AAEZ,cAAM,KAAK,IAAI,KAAK,CAAC;AAErB;AAAA,MACD;AAAA,MACA,SAAS;AACR,cAAM,YAAY;AAAA,UACjB,MAAM,MAAqB;AAAA,UAC3B;AAAA,QACD;AACA,YAAI;AAAW,gBAAM,KAAK,SAAS;AAEnC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO,IAAI,GAAG,KAAK;AACpB;AAEO,SAAS,oBACf,OACA,QACkB;AAClB,MAAI,OAAO,WAAW,YAAY;AACjC,UAAM,OAAO,OAAO,OAAc,gBAAgB;AAElD,WAAO,GAAG,MAAM,GAAG,IAChB,OACA,MAAM,QAAQ,IAAI,IAClB,KAAK,SACJ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,IAC1D,SACD,GAAG,MAAM,MAAM,IACf,IAAI,IAAI,IACR;AAAA,EACJ;AAEA,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK;AACnE,MAAI,CAAC,QAAQ;AAAQ,WAAO;AAE5B,SAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,OAAO,EAAE,MAAM,CAAE,CAAC,GAAG,OAAO;AACnH;AAEO,SAAS,oBACf,OACA,QACC;AACD,QAAM,aAAoB,CAAC;AAC3B,QAAM,YAAqD,CAAC;AAE5D,aACO,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,IAC5B,OAAO,WAAW,aAAa,OAAO,OAAc,EAAE,KAAK,UAAU,IAAI,CAAC,IAAI;AAAA,EAC/E,GACC;AACD,QAAI,CAAC;AAAO;AAEZ,UAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAE9D,UAAM,UAAU,MAAM,OAAO,EAAE;AAE/B,eAAW,KAAK,KAAK;AACrB,cAAU,KAAK;AAAA,MACd;AAAA,MACA,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,KAAK,WAAW,SAAS,IAAI,KAAK,YAAY,OAAO,IAAI;AAAA,IACzD;AAAA,EACD;AACD;AAEO,SAAS,cAAc,UAAoB,aAAoB,aAAqC;AAC1G,QAAM,cAAc,SAAS,cAAc,IAAI,CAAC,GAAG,MAAM;AACxD,UAAM,IAAI,SAAS,cAAc,CAAC;AAElC,WAAO;AAAA,MACN,MAAM,MACL,MAAM,IAAI,WAAW,YAAY,MAAM,KAAK,EAAE,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC,YAAY,OAAO,CAAC,CACnG,EAAE,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC;AAAA,MAC1C,MAAM,MACL,MAAM,IAAI,WAAW,YAAY,MAAM,KAAK,EAAE,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC,YAAY,OAAO,CAAC,CACnG,EAAE,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC;AAAA,IAC3C;AAAA,EACD,CAAC;AAED,QAAM,cAAc,SAAS,QAC1B,IAAI,GAAG,aAAa,qBAAqB,aAAa,SAAS,KAAK,CAAC,IACrE,IAAI,GAAG,WAAW;AAErB,SAAO;AACR;","names":["acc","key"]}
|
package/sqlite-core/dialect.cjs
CHANGED
|
@@ -617,11 +617,9 @@ class SQLiteDialect {
|
|
|
617
617
|
const entries = Object.entries(columns);
|
|
618
618
|
let colSelectionMode;
|
|
619
619
|
for (const [k, v] of entries) {
|
|
620
|
-
if (
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
throw new Error("Columns cannot be both true and false at the same time");
|
|
624
|
-
}
|
|
620
|
+
if (v === void 0)
|
|
621
|
+
continue;
|
|
622
|
+
colSelectionMode = colSelectionMode || v;
|
|
625
623
|
if (v) {
|
|
626
624
|
selectedColumns.push({
|
|
627
625
|
column: table[import_table2.Columns][k],
|
|
@@ -700,7 +698,7 @@ class SQLiteDialect {
|
|
|
700
698
|
}
|
|
701
699
|
const relation = tableConfig.relations[k];
|
|
702
700
|
const isSingle2 = (0, import_entity.is)(relation, import_relations.One);
|
|
703
|
-
const targetTable = relation.targetTable;
|
|
701
|
+
const targetTable = (0, import_alias.aliasedTable)(relation.targetTable, `d${currentDepth + 1}`);
|
|
704
702
|
const relationFilter = (0, import_relations.relationToSQL)(relation, table, targetTable);
|
|
705
703
|
const innerQuery = this.buildRelationalQuery({
|
|
706
704
|
table: targetTable,
|
|
@@ -719,7 +717,8 @@ class SQLiteDialect {
|
|
|
719
717
|
field: targetTable,
|
|
720
718
|
key: k,
|
|
721
719
|
selection: innerQuery.selection,
|
|
722
|
-
isArray: !isSingle2
|
|
720
|
+
isArray: !isSingle2,
|
|
721
|
+
isOptional: (relation.optional ?? false) || join !== true && !!join.where
|
|
723
722
|
});
|
|
724
723
|
const jsonColumns = import_sql2.sql.join(
|
|
725
724
|
innerQuery.selection.map((s) => {
|