drizzle-orm 0.38.3-e6823b4 → 0.38.3-efed06b

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.
Files changed (91) hide show
  1. package/libsql/session.cjs +4 -8
  2. package/libsql/session.cjs.map +1 -1
  3. package/libsql/session.js +4 -8
  4. package/libsql/session.js.map +1 -1
  5. package/mysql-core/dialect.cjs +29 -11
  6. package/mysql-core/dialect.cjs.map +1 -1
  7. package/mysql-core/dialect.d.cts +3 -1
  8. package/mysql-core/dialect.d.ts +3 -1
  9. package/mysql-core/dialect.js +29 -11
  10. package/mysql-core/dialect.js.map +1 -1
  11. package/mysql-proxy/driver.cjs.map +1 -1
  12. package/mysql-proxy/driver.d.cts +1 -1
  13. package/mysql-proxy/driver.d.ts +1 -1
  14. package/mysql-proxy/driver.js.map +1 -1
  15. package/mysql-proxy/session.cjs +3 -23
  16. package/mysql-proxy/session.cjs.map +1 -1
  17. package/mysql-proxy/session.js +3 -23
  18. package/mysql-proxy/session.js.map +1 -1
  19. package/mysql2/session.cjs +1 -22
  20. package/mysql2/session.cjs.map +1 -1
  21. package/mysql2/session.js +1 -22
  22. package/mysql2/session.js.map +1 -1
  23. package/package.json +1 -1
  24. package/pg-core/dialect.cjs +20 -11
  25. package/pg-core/dialect.cjs.map +1 -1
  26. package/pg-core/dialect.d.cts +2 -1
  27. package/pg-core/dialect.d.ts +2 -1
  28. package/pg-core/dialect.js +20 -11
  29. package/pg-core/dialect.js.map +1 -1
  30. package/planetscale-serverless/session.cjs +1 -24
  31. package/planetscale-serverless/session.cjs.map +1 -1
  32. package/planetscale-serverless/session.js +1 -24
  33. package/planetscale-serverless/session.js.map +1 -1
  34. package/relations.cjs +141 -22
  35. package/relations.cjs.map +1 -1
  36. package/relations.d.cts +39 -26
  37. package/relations.d.ts +39 -26
  38. package/relations.js +149 -24
  39. package/relations.js.map +1 -1
  40. package/sql/sql.cjs +1 -1
  41. package/sql/sql.cjs.map +1 -1
  42. package/sql/sql.js +1 -1
  43. package/sql/sql.js.map +1 -1
  44. package/sql-js/driver.cjs.map +1 -1
  45. package/sql-js/driver.d.cts +1 -1
  46. package/sql-js/driver.d.ts +1 -1
  47. package/sql-js/driver.js.map +1 -1
  48. package/sql-js/session.cjs +18 -0
  49. package/sql-js/session.cjs.map +1 -1
  50. package/sql-js/session.d.cts +1 -0
  51. package/sql-js/session.d.ts +1 -0
  52. package/sql-js/session.js +18 -0
  53. package/sql-js/session.js.map +1 -1
  54. package/sqlite-core/db.cjs +4 -2
  55. package/sqlite-core/db.cjs.map +1 -1
  56. package/sqlite-core/db.d.cts +2 -1
  57. package/sqlite-core/db.d.ts +2 -1
  58. package/sqlite-core/db.js +4 -2
  59. package/sqlite-core/db.js.map +1 -1
  60. package/sqlite-core/dialect.cjs +19 -7
  61. package/sqlite-core/dialect.cjs.map +1 -1
  62. package/sqlite-core/dialect.d.cts +2 -1
  63. package/sqlite-core/dialect.d.ts +2 -1
  64. package/sqlite-core/dialect.js +19 -7
  65. package/sqlite-core/dialect.js.map +1 -1
  66. package/sqlite-core/query-builders/query.cjs +27 -9
  67. package/sqlite-core/query-builders/query.cjs.map +1 -1
  68. package/sqlite-core/query-builders/query.d.cts +5 -3
  69. package/sqlite-core/query-builders/query.d.ts +5 -3
  70. package/sqlite-core/query-builders/query.js +27 -9
  71. package/sqlite-core/query-builders/query.js.map +1 -1
  72. package/sqlite-core/session.cjs +2 -2
  73. package/sqlite-core/session.cjs.map +1 -1
  74. package/sqlite-core/session.d.cts +1 -1
  75. package/sqlite-core/session.d.ts +1 -1
  76. package/sqlite-core/session.js +2 -2
  77. package/sqlite-core/session.js.map +1 -1
  78. package/sqlite-proxy/driver.cjs +3 -2
  79. package/sqlite-proxy/driver.cjs.map +1 -1
  80. package/sqlite-proxy/driver.d.cts +2 -2
  81. package/sqlite-proxy/driver.d.ts +2 -2
  82. package/sqlite-proxy/driver.js +3 -2
  83. package/sqlite-proxy/driver.js.map +1 -1
  84. package/sqlite-proxy/session.cjs +15 -14
  85. package/sqlite-proxy/session.cjs.map +1 -1
  86. package/sqlite-proxy/session.js +15 -14
  87. package/sqlite-proxy/session.js.map +1 -1
  88. package/version.cjs +1 -1
  89. package/version.d.cts +1 -1
  90. package/version.d.ts +1 -1
  91. package/version.js +1 -1
package/relations.cjs CHANGED
@@ -106,9 +106,30 @@ class Relations {
106
106
  if (relation.sourceColumns && relation.targetColumns) {
107
107
  if (relation.sourceColumns.length !== relation.targetColumns.length) {
108
108
  throw new Error(
109
- `${relationPrintName}: "from" and "to" arrays must have the same length`
109
+ `${relationPrintName}: "from" and "to" fields must have the same length`
110
110
  );
111
111
  }
112
+ if (relation.through) {
113
+ if (relation.through.source.length !== relation.through.target.length || relation.through.source.length !== relation.sourceColumns.length || relation.through.target.length !== relation.targetColumns.length) {
114
+ throw new Error(
115
+ `${relationPrintName}: ".through(column)" must be used either on all columns in "from" and "to" or not defined on any of them`
116
+ );
117
+ }
118
+ for (const column of relation.through.source) {
119
+ if (column.table !== relation.throughTable) {
120
+ throw new Error(
121
+ `${relationPrintName}: ".through(column)" must be used on the same table by all columns of the relation`
122
+ );
123
+ }
124
+ }
125
+ for (const column of relation.through.target) {
126
+ if (column.table !== relation.throughTable) {
127
+ throw new Error(
128
+ `${relationPrintName}: ".through(column)" must be used on the same table by all columns of the relation`
129
+ );
130
+ }
131
+ }
132
+ }
112
133
  continue;
113
134
  }
114
135
  if (relation.sourceColumns || relation.targetColumns) {
@@ -168,7 +189,13 @@ Hint: you can specify "alias" on both sides of the relation with the same value`
168
189
  }
169
190
  relation.sourceColumns = reverseRelation.targetColumns;
170
191
  relation.targetColumns = reverseRelation.sourceColumns;
171
- relation.where = reverseRelation.where;
192
+ relation.through = reverseRelation.through ? {
193
+ source: reverseRelation.through.target,
194
+ target: reverseRelation.through.source
195
+ } : void 0;
196
+ relation.throughTable = reverseRelation.throughTable;
197
+ relation.isReversed = !relation.where;
198
+ relation.where = relation.where ?? reverseRelation.where;
172
199
  }
173
200
  }
174
201
  }
@@ -188,6 +215,9 @@ class Relation {
188
215
  alias;
189
216
  where;
190
217
  sourceTable;
218
+ through;
219
+ throughTable;
220
+ isReversed;
191
221
  }
192
222
  class One extends Relation {
193
223
  static [import_entity.entityKind] = "OneV2";
@@ -197,12 +227,30 @@ class One extends Relation {
197
227
  this.alias = config?.alias;
198
228
  this.where = config?.where;
199
229
  if (config?.from) {
200
- this.sourceColumns = Array.isArray(config.from) ? config.from.map((it) => it._.column) : [config.from._.column];
230
+ this.sourceColumns = (Array.isArray(config.from) ? config.from : [config.from]).map((it) => {
231
+ this.throughTable ??= it._.through?._.column.table;
232
+ return it._.column;
233
+ });
201
234
  }
202
235
  if (config?.to) {
203
- this.targetColumns = Array.isArray(config.to) ? config.to.map((it) => it._.column) : [config.to._.column];
236
+ this.targetColumns = (Array.isArray(config.to) ? config.to : [config.to]).map((it) => {
237
+ this.throughTable ??= it._.through?._.column.table;
238
+ return it._.column;
239
+ });
240
+ }
241
+ if (this.throughTable) {
242
+ this.through = Array.isArray(config?.from) ? {
243
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor
244
+ source: config.from.map((e) => e._.through?._.column),
245
+ target: (config.to ?? []).map((e) => e._.column)
246
+ } : {
247
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor
248
+ source: [config?.from?._.through?._.column],
249
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
250
+ target: [config?.to?._.through?._.column]
251
+ };
204
252
  }
205
- this.optional = config?.optional ?? false;
253
+ this.optional = config?.optional ?? true;
206
254
  }
207
255
  }
208
256
  class Many extends Relation {
@@ -212,10 +260,28 @@ class Many extends Relation {
212
260
  this.alias = config?.alias;
213
261
  this.where = config?.where;
214
262
  if (config?.from) {
215
- this.sourceColumns = Array.isArray(config.from) ? config.from.map((it) => it._.column) : [config.from._.column];
263
+ this.sourceColumns = (Array.isArray(config.from) ? config.from : [config.from]).map((it) => {
264
+ this.throughTable ??= it._.through?._.column.table;
265
+ return it._.column;
266
+ });
216
267
  }
217
268
  if (config?.to) {
218
- this.targetColumns = Array.isArray(config.to) ? config.to.map((it) => it._.column) : [config.to._.column];
269
+ this.targetColumns = (Array.isArray(config.to) ? config.to : [config.to]).map((it) => {
270
+ this.throughTable ??= it._.through?._.column.table;
271
+ return it._.column;
272
+ });
273
+ }
274
+ if (this.throughTable) {
275
+ this.through = Array.isArray(config?.from) ? {
276
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor
277
+ source: config.from.map((e) => e._.through?._.column),
278
+ target: (config.to ?? []).map((e) => e._.column)
279
+ } : {
280
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor
281
+ source: [config?.from?._.through?._.column],
282
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
283
+ target: [config?.to?._.through?._.column]
284
+ };
219
285
  }
220
286
  }
221
287
  static [import_entity.entityKind] = "ManyV2";
@@ -235,7 +301,8 @@ class Count extends AggregatedField {
235
301
  if (!this.query) {
236
302
  if (!this.table)
237
303
  throw new Error("Table must be set before building aggregate field");
238
- this.query = import_sql.sql`select count(*) as ${import_sql.sql.identifier("r")} from ${this.table}`.mapWith(Number);
304
+ const table = this.table;
305
+ this.query = import_sql.sql`select count(*) as ${import_sql.sql.identifier("r")} from ${table[import_table.IsAlias] ? import_sql.sql`${import_sql.sql`${import_sql.sql.identifier(table[import_table.Schema] ?? "")}.`.if(table[import_table.Schema])}${import_sql.sql.identifier(table[import_table.OriginalName])} as ${table}` : table}`.mapWith(Number);
239
306
  }
240
307
  return this.query;
241
308
  }
@@ -272,24 +339,33 @@ const orderByOperators = {
272
339
  function getOrderByOperators() {
273
340
  return orderByOperators;
274
341
  }
275
- function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false) {
342
+ function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false, path) {
276
343
  for (const selectionItem of buildQueryResultSelection) {
277
344
  const field = selectionItem.field;
278
345
  if ((0, import_entity.is)(field, import_table.Table)) {
346
+ const currentPath = `${path ? `${path}.` : ""}${selectionItem.key}`;
279
347
  if (row[selectionItem.key] === null)
280
348
  continue;
281
349
  if (parseJson)
282
350
  row[selectionItem.key] = JSON.parse(row[selectionItem.key]);
283
351
  if (selectionItem.isArray) {
284
352
  for (const item of row[selectionItem.key]) {
285
- mapRelationalRow(item, selectionItem.selection, mapColumnValue);
353
+ mapRelationalRow(
354
+ item,
355
+ selectionItem.selection,
356
+ mapColumnValue,
357
+ false,
358
+ currentPath
359
+ );
286
360
  }
287
361
  continue;
288
362
  }
289
363
  mapRelationalRow(
290
364
  row[selectionItem.key],
291
365
  selectionItem.selection,
292
- mapColumnValue
366
+ mapColumnValue,
367
+ false,
368
+ currentPath
293
369
  );
294
370
  continue;
295
371
  }
@@ -326,16 +402,16 @@ class RelationsBuilderTable {
326
402
  class RelationsBuilderColumn {
327
403
  static [import_entity.entityKind] = "RelationsBuilderColumn";
328
404
  _;
329
- constructor(column) {
405
+ constructor(column, through) {
330
406
  this._ = {
331
407
  tableName: (0, import_table2.getTableName)(column.table),
332
408
  data: void 0,
333
- column
409
+ column,
410
+ through
334
411
  };
335
412
  }
336
413
  through(column) {
337
- this._.through = column;
338
- return this;
414
+ return new RelationsBuilderColumn(this._.column, column);
339
415
  }
340
416
  getSQL() {
341
417
  return this._.column.getSQL();
@@ -399,7 +475,7 @@ function defineRelations(schema, relations) {
399
475
  );
400
476
  }
401
477
  function relationsFieldFilterToSQL(column, filter) {
402
- if (typeof filter !== "object" || (0, import_entity.is)(filter, import_sql.Placeholder))
478
+ if (typeof filter !== "object")
403
479
  return (0, import_expressions.eq)(column, filter);
404
480
  const entries = Object.entries(filter);
405
481
  if (!entries.length)
@@ -426,6 +502,21 @@ function relationsFieldFilterToSQL(column, filter) {
426
502
  );
427
503
  continue;
428
504
  }
505
+ case "isNotNull":
506
+ case "isNull": {
507
+ if (!value)
508
+ continue;
509
+ parts.push(operators[target](column));
510
+ continue;
511
+ }
512
+ case "in": {
513
+ parts.push(operators.inArray(column, value));
514
+ continue;
515
+ }
516
+ case "notIn": {
517
+ parts.push(operators.notInArray(column, value));
518
+ continue;
519
+ }
429
520
  default: {
430
521
  parts.push(
431
522
  operators[target](
@@ -453,7 +544,7 @@ function relationsFilterToSQL(table, filter) {
453
544
  case "RAW": {
454
545
  if (value) {
455
546
  parts.push(
456
- value(table[import_table2.Columns], operators)
547
+ value(table, operators)
457
548
  );
458
549
  }
459
550
  continue;
@@ -523,16 +614,44 @@ function relationExtrasToSQL(table, extras) {
523
614
  selection
524
615
  };
525
616
  }
526
- function relationToSQL(relation, sourceTable, targetTable) {
617
+ function relationToSQL(relation, sourceTable, targetTable, throughTable) {
618
+ if (relation.through) {
619
+ const outerColumnWhere = relation.sourceColumns.map((s, i) => {
620
+ const t = relation.through.source[i];
621
+ return (0, import_expressions.eq)(
622
+ import_sql.sql`${sourceTable}.${import_sql.sql.identifier(s.name)}`,
623
+ import_sql.sql`${throughTable}.${import_sql.sql.identifier(t.name)}`
624
+ );
625
+ });
626
+ const innerColumnWhere = relation.targetColumns.map((s, i) => {
627
+ const t = relation.through.target[i];
628
+ return (0, import_expressions.eq)(
629
+ import_sql.sql`${throughTable}.${import_sql.sql.identifier(t.name)}`,
630
+ import_sql.sql`${targetTable}.${import_sql.sql.identifier(s.name)}`
631
+ );
632
+ });
633
+ return {
634
+ filter: (0, import_expressions.and)(
635
+ relation.where ? relation.isReversed ? relationsFilterToSQL(targetTable, relation.where) : relationsFilterToSQL(sourceTable, relation.where) : void 0
636
+ ),
637
+ joinCondition: (0, import_expressions.and)(
638
+ ...outerColumnWhere,
639
+ ...innerColumnWhere
640
+ )
641
+ };
642
+ }
527
643
  const columnWhere = relation.sourceColumns.map((s, i) => {
528
644
  const t = relation.targetColumns[i];
529
645
  return (0, import_expressions.eq)(
530
- import_sql.sql`${import_sql.sql`${import_sql.sql`${import_sql.sql.identifier(sourceTable[import_table.Schema] ?? "")}.`.if(sourceTable[import_table.Schema] && !sourceTable[import_table.IsAlias])}`}${sourceTable}.${import_sql.sql.identifier(s.name)}`,
531
- import_sql.sql`${import_sql.sql`${import_sql.sql`${import_sql.sql.identifier(targetTable[import_table.Schema] ?? "")}.`.if(targetTable[import_table.Schema] && !targetTable[import_table.IsAlias])}`}${targetTable}.${import_sql.sql.identifier(t.name)}`
646
+ import_sql.sql`${sourceTable}.${import_sql.sql.identifier(s.name)}`,
647
+ import_sql.sql`${targetTable}.${import_sql.sql.identifier(t.name)}`
532
648
  );
533
649
  });
534
- const targetWhere = relation.where ? (0, import_expressions.and)(...columnWhere, relationsFilterToSQL(sourceTable, relation.where)) : (0, import_expressions.and)(...columnWhere);
535
- return targetWhere;
650
+ const fullWhere = (0, import_expressions.and)(
651
+ ...columnWhere,
652
+ relation.where ? relation.isReversed ? relationsFilterToSQL(targetTable, relation.where) : relationsFilterToSQL(sourceTable, relation.where) : void 0
653
+ );
654
+ return { filter: fullWhere };
536
655
  }
537
656
  // Annotate the CommonJS export names for ESM import in node:
538
657
  0 && (module.exports = {
package/relations.cjs.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: '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\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\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 : 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> = 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' || 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: 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":"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","names":["import_table","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 { 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\" fields must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relation.through) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trelation.through.source.length !== relation.through.target.length\n\t\t\t\t\t\t\t|| relation.through.source.length !== relation.sourceColumns.length\n\t\t\t\t\t\t\t|| relation.through.target.length !== relation.targetColumns.length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used either on all columns in \"from\" and \"to\" or not defined on any of them`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const column of relation.through.source) {\n\t\t\t\t\t\t\tif (column.table !== relation.throughTable) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const column of relation.through.target) {\n\t\t\t\t\t\t\tif (column.table !== relation.throughTable) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\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\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.through = reverseRelation.through\n\t\t\t\t\t? {\n\t\t\t\t\t\tsource: reverseRelation.through.target,\n\t\t\t\t\t\ttarget: reverseRelation.through.source,\n\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t\trelation.throughTable = reverseRelation.throughTable;\n\t\t\t\trelation.isReversed = !relation.where;\n\t\t\t\trelation.where = relation.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\tthrough?: {\n\t\tsource: AnyColumn[];\n\t\ttarget: AnyColumn[];\n\t};\n\tthroughTable?: Table;\n\tisReversed?: boolean;\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\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through?._.column.table;\n\n\t\t\t\t\treturn it._.column as AnyColumn<{ tableName: TSourceTableName }>;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through?._.column.table;\n\n\t\t\t\t\treturn it._.column as AnyColumn<{ tableName: TTargetTableName }>;\n\t\t\t\t});\n\t\t}\n\n\t\tif (this.throughTable) {\n\t\t\tthis.through = Array.isArray(config?.from)\n\t\t\t\t? {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor\n\t\t\t\t\tsource: config.from.map((e: RelationsBuilderColumnBase) => e._.through?._.column!),\n\t\t\t\t\ttarget: ((config.to ?? []) as any as RelationsBuilderColumnBase[]).map((e) => e._.column),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor\n\t\t\t\t\tsource: [(config?.from as RelationsBuilderColumnBase | undefined)?._.through?._.column!],\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n\t\t\t\t\ttarget: [config?.to?._.through?._.column!],\n\t\t\t\t};\n\t\t}\n\t\tthis.optional = (config?.optional ?? true) 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\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through?._.column.table;\n\n\t\t\t\t\treturn it._.column as AnyColumn<{ tableName: TSourceTableName }>;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through?._.column.table;\n\n\t\t\t\t\treturn it._.column as AnyColumn<{ tableName: TTargetTableName }>;\n\t\t\t\t});\n\t\t}\n\t\tif (this.throughTable) {\n\t\t\tthis.through = Array.isArray(config?.from)\n\t\t\t\t? {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor\n\t\t\t\t\tsource: config.from.map((e: RelationsBuilderColumnBase) => e._.through?._.column!),\n\t\t\t\t\ttarget: ((config.to ?? []) as any as RelationsBuilderColumnBase[]).map((e) => e._.column),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- in case it's undefined, error will be thrown in Relations constructor\n\t\t\t\t\tsource: [(config?.from as RelationsBuilderColumnBase | undefined)?._.through?._.column!],\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n\t\t\t\t\ttarget: [config?.to?._.through?._.column!],\n\t\t\t\t};\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| boolean\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& TruthyKeysOnly<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 TruthyKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined | false ? 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) continue;\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<\n\tTTableName extends string = string,\n\tTData = unknown,\n> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\treadonly through?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<\n\tTTableName extends string = string,\n\tTData = unknown,\n> = {\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\treadonly through?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>, through?: RelationsBuilderColumn) {\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\tthrough,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderColumnBase<TTableName, TData> {\n\t\treturn new RelationsBuilderColumn(this._.column, column);\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 = true,\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 as any, 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 type BuiltRelationFilters = {\n\tfilter?: SQL;\n\tjoinCondition?: SQL;\n};\n\nexport function relationToSQL(\n\trelation: Relation,\n\tsourceTable: Table,\n\ttargetTable: Table,\n\tthroughTable?: Table,\n): BuiltRelationFilters {\n\tif (relation.through) {\n\t\tconst outerColumnWhere = relation.sourceColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.source[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\t\tsql`${throughTable!}.${sql.identifier(t.name)}`,\n\t\t\t);\n\t\t});\n\n\t\tconst innerColumnWhere = relation.targetColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.target[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${throughTable!}.${sql.identifier(t.name)}`,\n\t\t\t\tsql`${targetTable}.${sql.identifier(s.name)}`,\n\t\t\t);\n\t\t});\n\n\t\treturn {\n\t\t\tfilter: and(\n\t\t\t\trelation.where\n\t\t\t\t\t? (relation.isReversed\n\t\t\t\t\t\t? relationsFilterToSQL(targetTable, relation.where)\n\t\t\t\t\t\t: relationsFilterToSQL(sourceTable, relation.where))\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t\tjoinCondition: and(\n\t\t\t\t...outerColumnWhere,\n\t\t\t\t...innerColumnWhere,\n\t\t\t),\n\t\t};\n\t}\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst fullWhere = and(\n\t\t...columnWhere,\n\t\trelation.where\n\t\t\t? relation.isReversed\n\t\t\t\t? relationsFilterToSQL(targetTable, relation.where)\n\t\t\t\t: relationsFilterToSQL(sourceTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n"],"mappings":"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","names":["import_table","acc","key"]}