drizzle-orm 0.39.2-aaa57ff → 0.39.2-c7c31ad
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mysql-core/dialect.cjs +1 -11
- package/mysql-core/dialect.cjs.map +1 -1
- package/mysql-core/dialect.js +1 -12
- package/mysql-core/dialect.js.map +1 -1
- package/package.json +49 -49
- package/pg-core/dialect.cjs +1 -12
- package/pg-core/dialect.cjs.map +1 -1
- package/pg-core/dialect.js +1 -13
- package/pg-core/dialect.js.map +1 -1
- package/relations.cjs +43 -13
- package/relations.cjs.map +1 -1
- package/relations.d.cts +23 -10
- package/relations.d.ts +23 -10
- package/relations.js +43 -13
- package/relations.js.map +1 -1
- package/sqlite-core/dialect.cjs +1 -11
- package/sqlite-core/dialect.cjs.map +1 -1
- package/sqlite-core/dialect.js +1 -12
- package/sqlite-core/dialect.js.map +1 -1
- package/version.cjs +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/relations.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.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, View } from './sql/sql.ts';\nimport type { Assume, DrizzleTypeError, Equal, Simplify, ValueOrArray, Writable } from './utils.ts';\n\nexport type FieldValue =\n\t| Column\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table | View> = Record<string, Table | View>,\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 (config[tsName]?.$drizzleTypeError) continue;\n\n\t\t\tconst isTable = is(table, Table);\n\t\t\tconst isView = is(table, View);\n\n\t\t\tif (!(isTable || isView)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tthis.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] as FieldSelection,\n\t\t\t\trelations: (config[tsName] || {}) as Record<string, RelationsBuilderEntry<TTables, string>>,\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 (tables[column._.tableName] !== 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 (tables[column._.tableName] !== 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 | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }> | View<TSourceTableName>;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: Table | View;\n\tisReversed?: boolean;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }> | View<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\ttables: Record<string, Table | View>,\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }> | View<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 ? tables[it._.through._.tableName]! : undefined;\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 ? tables[it._.through._.tableName]! : undefined;\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\tsource: config.from.map((c: RelationsBuilderColumnBase) => c._.through!),\n\t\t\t\t\ttarget: ((config.to ?? []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tsource: ((config?.from ? [config.from] : []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t\ttarget: (config?.to ? [config.to] : [] as RelationsBuilderColumnBase[]).map((c) => c._.through!),\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\ttables: Record<string, Table | View>,\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }> | View<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 ? tables[it._.through._.tableName]! : undefined;\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 ? tables[it._.through._.tableName]! : undefined;\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\tsource: config.from.map((c: RelationsBuilderColumnBase) => c._.through!),\n\t\t\t\t\ttarget: ((config.to ?? []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tsource: ((config?.from ? [config.from] : []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t\ttarget: (config?.to ? [config.to] : [] as RelationsBuilderColumnBase[]).map((c) => c._.through!),\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 | View | undefined;\n\n\tonTable(table: Table | View) {\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\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${getTableAsAliasSQL(this.table)}`\n\t\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 | View,\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: TTableConfig['table'],\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\twhere?: RelationsFilter<TTableConfig['table']> | 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\ttable: TTableConfig['table'],\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | 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 | View;\n\ttsName: string;\n\tdbName: string;\n\tschema: string | undefined;\n\tcolumns: FieldSelection;\n\trelations: Record<string, RelationsBuilderEntry>;\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 | View> = 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] extends Table ? TTables[K]['_']['columns'] : Assume<TTables[K], View>['_']['selectedFields'];\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\t// Views don't have schema on type-level, TBD\n\t\tschema: TTables[K] extends Table ? TTables[K]['_']['schema'] : string | undefined;\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 ExtractSelectionColumns<TSelection extends Record<string, unknown>> = {\n\t[K in keyof TSelection as TSelection[K] extends Column ? K : never]: TSelection[K];\n};\n\nexport type ExtractSelectionNonColumns<TSelection extends Record<string, unknown>> = {\n\t[K in keyof TSelection as TSelection[K] extends Column ? never : K]: TSelection[K];\n};\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n\tTFilteredSelection extends Record<string, unknown> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t\t[\n\t\t\tK in Equal<\n\t\t\t\tExclude<\n\t\t\t\t\tTSelectedFields[\n\t\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t\t],\n\t\t\t\t\tundefined\n\t\t\t\t>,\n\t\t\t\tfalse\n\t\t\t> extends true ? Exclude<\n\t\t\t\t\tkeyof TRawSelection,\n\t\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t\t>\n\t\t\t\t:\n\t\t\t\t\t& {\n\t\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t: never;\n\t\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t\t& keyof TRawSelection\n\t\t]: TRawSelection[K];\n\t},\n\tTColumns extends Record<string, unknown> = ExtractSelectionColumns<TFilteredSelection>,\n\tTSubqueries extends Record<string, unknown> = ExtractSelectionNonColumns<TFilteredSelection>,\n> =\n\t& (TColumns extends Record<string, Column> ? InferModelFromColumns<TColumns>\n\t\t: {})\n\t& (TSubqueries extends Record<string, Exclude<FieldValue, Column>> ? {\n\t\t\t[K in keyof TSubqueries as TSubqueries[K] extends FieldValue ? K : never]: ReturnType<\n\t\t\t\tAssume<\n\t\t\t\t\tTSubqueries[K],\n\t\t\t\t\tSQLWrapper\n\t\t\t\t>['getSQL']\n\t\t\t>['_']['type'];\n\t\t}\n\t\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 ? Simplify<InferRelationalQueryTableResult<TTableConfig['columns']>>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTTableConfig['columns'],\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\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\tif (selectionItem.selection) {\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 field = selectionItem.field!;\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 }> | View<TTableName>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }> | View<TTableName>, key: string) {\n\t\tthis._ = {\n\t\t\tname: key as TTableName,\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 }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\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 }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>;\n\t\treadonly through?: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: AnyColumn<{ tableName: TTableName }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough?: RelationsBuilderColumn,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderColumnBase<TTableName, TData> {\n\t\treturn new RelationsBuilderColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\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 = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends object ? never : T\n\t);\n\nexport type RelationsFilter<\n\tTTable extends Table | View = Table | View,\n\tTColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection>\n\t\t: Assume<TTable, Table>['_']['columns'],\n> =\n\t& {\n\t\t[K in keyof TColumns]?: TColumns[K] extends Column ? RelationsFieldFilter<TColumns[K]['_']['data']>\n\t\t\t: RelationsFieldFilter<unknown>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TTable, TColumns>[];\n\t\tNOT?: RelationsFilter<TTable, TColumns>;\n\t\tRAW?: (\n\t\t\ttable: TTable,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table | View>,\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']]>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table | View>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table | View>,\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']]>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table | View>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table | View>,\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 | View>,\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 | View>> {\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(tables, table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, 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\t/** @internal - to be reworked */\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 | View>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]: TSchema[TTableName] extends Table | View<string, boolean, FieldSelection>\n\t\t\t? (\n\t\t\t\t& {\n\t\t\t\t\t[\n\t\t\t\t\t\tTColumnName in keyof (TSchema[TTableName] extends Table ? TSchema[TTableName]['_']['columns']\n\t\t\t\t\t\t\t: Assume<TSchema[TTableName], View>['_']['selectedFields'])\n\t\t\t\t\t]: RelationsBuilderColumn<\n\t\t\t\t\t\tTTableName,\n\t\t\t\t\t\t(TSchema[TTableName] extends Table ? TSchema[TTableName]['_']['columns']\n\t\t\t\t\t\t\t: Assume<Assume<TSchema[TTableName], View>['_']['selectedFields'], FieldSelection>)[TColumnName] extends\n\t\t\t\t\t\t\tinfer Field ? Field extends Column ? Field['_']['data']\n\t\t\t\t\t\t\t: Field extends SQLWrapper<infer Data> | SQL<infer Data> | SQL.Aliased<infer Data> ? Data\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t}\n\t\t\t\t& RelationsBuilderTable<TTableName>\n\t\t\t)\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table | View>> = {\n\t[TTableName in keyof TTables & string]?: TTables[TTableName] extends Table | View<string, boolean, FieldSelection>\n\t\t? Record<string, RelationsBuilderEntry<TTables, TTableName>>\n\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table | View> = Record<string, Table | View>,\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 | View ? K : never]: TSchema[K] extends Table | View ? TSchema[K]\n\t\t: never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table | View>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table | View] => is(e[1], Table) || is(e[1], View)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tif (is(value, Table) || is(value, View)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\t\tconst columns = Object.entries(value[Columns]).reduce<\n\t\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t\t>(\n\t\t\t\t(acc, [cKey, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as Column, tKey, cKey);\n\t\t\t\t\tacc[cKey] = 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[tKey] = 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 | View> = 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 | SQL | SQLWrapper | SQL.Aliased;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\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\n/** @internal */\nexport function fieldSelectionToSQL(table: Table | View, target: string) {\n\tconst field = table[Columns][target];\n\n\treturn field\n\t\t? is(field, Column)\n\t\t\t? field\n\t\t\t: is(field, SQL.Aliased)\n\t\t\t? sql`${table}.${sql.identifier(field.fieldAlias)}`\n\t\t\t: sql`${table}.${sql.identifier(target)}`\n\t\t: sql`${table}.${sql.identifier(target)}`;\n}\n\nfunction relationsFieldFilterToSQL(column: SQLWrapper, 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: SQLWrapper, 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 | View,\n\tfilter: RelationsFilter,\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: FieldSelection, 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[] | 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[]).map((subFilter) => relationsFilterToSQL(table, subFilter)),\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);\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 column = fieldSelectionToSQL(table, target);\n\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\tcolumn,\n\t\t\t\t\tvalue as RelationsFieldFilter,\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 | View,\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(\n\t\tentries.map(([target, value]) => (value === 'asc' ? asc : desc)(fieldSelectionToSQL(table, target))),\n\t\tsql`, `,\n\t);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table | View,\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 | View,\n\ttargetTable: Table | View,\n\tthroughTable?: Table | View,\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(is(t._.column, Column) ? t._.column.name : t._.key)}`,\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(is(t._.column, Column) ? t._.column.name : t._.key)}`,\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? relationsFilterToSQL(relation.isReversed ? targetTable : 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? relationsFilterToSQL(relation.isReversed ? targetTable : sourceTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n\nexport function getTableAsAliasSQL(table: Table | View) {\n\treturn sql`${\n\t\ttable[IsAlias]\n\t\t\t? sql`${sql`${sql.identifier(table[Schema] ?? '')}.`.if(table[Schema])}${\n\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t} as ${table}`\n\t\t\t: table\n\t}`;\n}\n"],"mappings":"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","names":["import_table","acc"]}
|
|
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 } from '~/table.ts';\nimport { aliasedTable } from './alias.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.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, View } from './sql/sql.ts';\nimport type { Assume, DrizzleTypeError, Equal, Simplify, ValueOrArray, Writable } from './utils.ts';\n\nexport type FieldValue =\n\t| Column\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table | View> = Record<string, Table | View>,\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 (config[tsName]?.$drizzleTypeError) continue;\n\n\t\t\tconst isTable = is(table, Table);\n\t\t\tconst isView = is(table, View);\n\n\t\t\tif (!(isTable || isView)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tthis.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] as FieldSelection,\n\t\t\t\trelations: (config[tsName] || {}) as Record<string, RelationsBuilderEntry<TTables, string>>,\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 (tables[column._.tableName] !== 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 (tables[column._.tableName] !== 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: AnyTableFilter | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }> | View<TSourceTableName>;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: Table | View;\n\tisReversed?: boolean;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }> | View<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\ttables: Record<string, Table | View>,\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }> | View<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 ? tables[it._.through._.tableName]! : undefined;\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 ? tables[it._.through._.tableName]! : undefined;\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\tsource: config.from.map((c: RelationsBuilderColumnBase) => c._.through!),\n\t\t\t\t\ttarget: ((config.to ?? []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tsource: ((config?.from ? [config.from] : []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t\ttarget: (config?.to ? [config.to] : [] as RelationsBuilderColumnBase[]).map((c) => c._.through!),\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\ttables: Record<string, Table | View>,\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }> | View<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 ? tables[it._.through._.tableName]! : undefined;\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 ? tables[it._.through._.tableName]! : undefined;\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\tsource: config.from.map((c: RelationsBuilderColumnBase) => c._.through!),\n\t\t\t\t\ttarget: ((config.to ?? []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tsource: ((config?.from ? [config.from] : []) as RelationsBuilderColumnBase[]).map((c) => c._.through!),\n\t\t\t\t\ttarget: (config?.to ? [config.to] : [] as RelationsBuilderColumnBase[]).map((c) => c._.through!),\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 | View | undefined;\n\n\tonTable(table: Table | View) {\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\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${getTableAsAliasSQL(this.table)}`\n\t\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 | View,\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: TTableConfig['table'],\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | 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\ttable: TTableConfig['table'],\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | 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 | View;\n\ttsName: string;\n\tdbName: string;\n\tschema: string | undefined;\n\tcolumns: FieldSelection;\n\trelations: Record<string, RelationsBuilderEntry>;\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 | View> = 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] extends Table ? TTables[K]['_']['columns'] : Assume<TTables[K], View>['_']['selectedFields'];\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\t// Views don't have schema on type-level, TBD\n\t\tschema: TTables[K] extends Table ? TTables[K]['_']['schema'] : string | undefined;\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 ExtractSelectionColumns<TSelection extends Record<string, unknown>> = {\n\t[K in keyof TSelection as TSelection[K] extends Column ? K : never]: TSelection[K];\n};\n\nexport type ExtractSelectionNonColumns<TSelection extends Record<string, unknown>> = {\n\t[K in keyof TSelection as TSelection[K] extends Column ? never : K]: TSelection[K];\n};\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n\tTFilteredSelection extends Record<string, unknown> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t\t[\n\t\t\tK in Equal<\n\t\t\t\tExclude<\n\t\t\t\t\tTSelectedFields[\n\t\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t\t],\n\t\t\t\t\tundefined\n\t\t\t\t>,\n\t\t\t\tfalse\n\t\t\t> extends true ? Exclude<\n\t\t\t\t\tkeyof TRawSelection,\n\t\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t\t>\n\t\t\t\t:\n\t\t\t\t\t& {\n\t\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t: never;\n\t\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t\t& keyof TRawSelection\n\t\t]: TRawSelection[K];\n\t},\n\tTColumns extends Record<string, unknown> = ExtractSelectionColumns<TFilteredSelection>,\n\tTSubqueries extends Record<string, unknown> = ExtractSelectionNonColumns<TFilteredSelection>,\n> =\n\t& (TColumns extends Record<string, Column> ? InferModelFromColumns<TColumns>\n\t\t: {})\n\t& (TSubqueries extends Record<string, Exclude<FieldValue, Column>> ? {\n\t\t\t[K in keyof TSubqueries as TSubqueries[K] extends FieldValue ? K : never]: ReturnType<\n\t\t\t\tAssume<\n\t\t\t\t\tTSubqueries[K],\n\t\t\t\t\tSQLWrapper\n\t\t\t\t>['getSQL']\n\t\t\t>['_']['type'];\n\t\t}\n\t\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 ? Simplify<InferRelationalQueryTableResult<TTableConfig['columns']>>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTTableConfig['columns'],\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\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\tif (selectionItem.selection) {\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 field = selectionItem.field!;\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 }> | View<TTableName>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }> | View<TTableName>, key: string) {\n\t\tthis._ = {\n\t\t\tname: key as TTableName,\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 }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\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 }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>;\n\t\treadonly through?: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: AnyColumn<{ tableName: TTableName }> | SQL<TData> | SQLWrapper<TData> | SQL.Aliased<TData>,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough?: RelationsBuilderColumn,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderColumnBase<TTableName, TData> {\n\t\treturn new RelationsBuilderColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\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 = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends object ? never : T\n\t);\n\nexport type RelationsFilterCommons<\n\tTTable extends TableRelationalConfig = TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n> = {\n\tOR?: RelationsFilter<TTable, TSchema>[];\n\tNOT?: RelationsFilter<TTable, TSchema>;\n\tRAW?: (\n\t\ttable: TTable['table'],\n\t\toperators: Operators,\n\t) => SQL;\n};\n\nexport type RelationsFilter<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTRelations extends Record<string, Relation> = TTable['relations'],\n\tTColumns extends FieldSelection = TTable['columns'],\n> =\n\t& {\n\t\t[K in keyof TColumns as K extends keyof RelationsFilterCommons ? never : K]?: TColumns[K] extends Column\n\t\t\t? RelationsFieldFilter<TColumns[K]['_']['data']>\n\t\t\t: RelationsFieldFilter<unknown>;\n\t}\n\t& {\n\t\t[K in keyof TRelations as K extends keyof TColumns | keyof RelationsFilterCommons ? never : K]?:\n\t\t\t| boolean\n\t\t\t| RelationsFilter<FindTableInRelationalConfig<TSchema, TRelations[K]['targetTable']>, TSchema>;\n\t}\n\t& RelationsFilterCommons<TTable, TSchema>;\n\nexport type TableFilterCommons<\n\tTTable extends Table | View = Table | View,\n\tTColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection>\n\t\t: Assume<TTable, Table>['_']['columns'],\n> = {\n\tOR?: TableFilter<TTable, TColumns>[];\n\tNOT?: TableFilter<TTable, TColumns>;\n\tRAW?: (\n\t\ttable: TTable,\n\t\toperators: Operators,\n\t) => SQL;\n};\n\nexport type TableFilter<\n\tTTable extends Table | View = Table | View,\n\tTColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection>\n\t\t: Assume<TTable, Table>['_']['columns'],\n> =\n\t& {\n\t\t[K in keyof TColumns as K extends keyof TableFilterCommons ? never : K]?: TColumns[K] extends Column\n\t\t\t? RelationsFieldFilter<TColumns[K]['_']['data']>\n\t\t\t: RelationsFieldFilter<unknown>;\n\t}\n\t& TableFilterCommons<TTable, TColumns>;\n\nexport type AnyRelationsFilter = RelationsFilter<\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tRecord<string, Relation>,\n\tFieldSelection\n>;\n\nexport type AnyTableFilter = TableFilter<\n\tTable | View,\n\tFieldSelection\n>;\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table | View>,\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? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]>\n\t\t: TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table | View>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table | View>,\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? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]>\n\t\t: TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table | View>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table | View>,\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 | View>,\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 | View>> {\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(tables, table, config as AnyOneConfig);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, table, config as AnyManyConfig);\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\t/** @internal - to be reworked */\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 | View>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]: TSchema[TTableName] extends Table | View<string, boolean, FieldSelection>\n\t\t\t? (\n\t\t\t\t& {\n\t\t\t\t\t[\n\t\t\t\t\t\tTColumnName in keyof (TSchema[TTableName] extends Table ? TSchema[TTableName]['_']['columns']\n\t\t\t\t\t\t\t: Assume<TSchema[TTableName], View>['_']['selectedFields'])\n\t\t\t\t\t]: RelationsBuilderColumn<\n\t\t\t\t\t\tTTableName,\n\t\t\t\t\t\t(TSchema[TTableName] extends Table ? TSchema[TTableName]['_']['columns']\n\t\t\t\t\t\t\t: Assume<Assume<TSchema[TTableName], View>['_']['selectedFields'], FieldSelection>)[TColumnName] extends\n\t\t\t\t\t\t\tinfer Field ? Field extends Column ? Field['_']['data']\n\t\t\t\t\t\t\t: Field extends SQLWrapper<infer Data> | SQL<infer Data> | SQL.Aliased<infer Data> ? Data\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t}\n\t\t\t\t& RelationsBuilderTable<TTableName>\n\t\t\t)\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table | View>> = {\n\t[TTableName in keyof TTables & string]?: TTables[TTableName] extends Table | View<string, boolean, FieldSelection>\n\t\t? Record<string, RelationsBuilderEntry<TTables, TTableName>>\n\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table | View> = Record<string, Table | View>,\n\tTSourceTableName extends string = string,\n> = Relation<TSourceTableName, keyof TTables & string>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table | View ? K : never]: TSchema[K] extends Table | View ? TSchema[K]\n\t\t: never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table | View>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table | View] => is(e[1], Table) || is(e[1], View)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tif (is(value, Table) || is(value, View)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\t\tconst columns = Object.entries(value[Columns]).reduce<\n\t\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t\t>(\n\t\t\t\t(acc, [cKey, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as Column, tKey, cKey);\n\t\t\t\t\tacc[cKey] = 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[tKey] = 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 | View> = 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 | SQL | SQLWrapper | SQL.Aliased;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\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\n/** @internal */\nexport function fieldSelectionToSQL(table: Table | View, target: string) {\n\tconst field = table[Columns][target];\n\n\treturn field\n\t\t? is(field, Column)\n\t\t\t? field\n\t\t\t: is(field, SQL.Aliased)\n\t\t\t? sql`${table}.${sql.identifier(field.fieldAlias)}`\n\t\t\t: sql`${table}.${sql.identifier(target)}`\n\t\t: sql`${table}.${sql.identifier(target)}`;\n}\n\nfunction relationsFieldFilterToSQL(column: SQLWrapper, 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 AnyRelationsFilter[]).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: SQLWrapper, 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 | View,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: Record<string, Relation> = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\ttableNamesMap: Record<string, string> = {},\n\tdepth: number = 0,\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: FieldSelection, 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 AnyRelationsFilter[] | 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 AnyRelationsFilter[]).map((subFilter) => relationsFilterToSQL(table, subFilter)),\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 AnyRelationsFilter);\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\tif (table[Columns][target]) {\n\t\t\t\t\tconst column = fieldSelectionToSQL(table, target);\n\n\t\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue as RelationsFieldFilter,\n\t\t\t\t\t);\n\t\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst relation = tableRelations[target];\n\t\t\t\tif (!relation) {\n\t\t\t\t\t// Should never trigger unless the types've been violated\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage: `Unknown relational filter field: \"${target}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `f${depth}`);\n\t\t\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined;\n\t\t\t\tconst targetConfig = tablesRelations[tableNamesMap[getTableUniqueName(relation.targetTable)]!]!;\n\n\t\t\t\tconst {\n\t\t\t\t\tfilter: relationFilter,\n\t\t\t\t\tjoinCondition,\n\t\t\t\t} = relationToSQL(relation, table, targetTable, throughTable);\n\t\t\t\tconst subfilter = typeof value === 'boolean' ? undefined : relationsFilterToSQL(\n\t\t\t\t\ttargetTable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttargetConfig.relations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t);\n\t\t\t\tconst filter = and(\n\t\t\t\t\trelationFilter,\n\t\t\t\t\tsubfilter,\n\t\t\t\t);\n\n\t\t\t\tconst subquery = throughTable\n\t\t\t\t\t? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${\n\t\t\t\t\t\tgetTableAsAliasSQL(throughTable)\n\t\t\t\t\t} on ${joinCondition}${sql` where ${filter}`.if(filter)} limit 1)`\n\t\t\t\t\t: sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter}`.if(filter)} limit 1)`;\n\t\t\t\tif (filter) parts.push((value ? exists : notExists)(subquery));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table | View,\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(\n\t\tentries.map(([target, value]) => (value === 'asc' ? asc : desc)(fieldSelectionToSQL(table, target))),\n\t\tsql`, `,\n\t);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table | View,\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 | View,\n\ttargetTable: Table | View,\n\tthroughTable?: Table | View,\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(is(t._.column, Column) ? t._.column.name : t._.key)}`,\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(is(t._.column, Column) ? t._.column.name : t._.key)}`,\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? relationsFilterToSQL(relation.isReversed ? targetTable : sourceTable, relation.where)\n\t\t\t\t\t: undefined,\n\t\t\t\t...outerColumnWhere,\n\t\t\t),\n\t\t\tjoinCondition: and(...innerColumnWhere),\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? relationsFilterToSQL(relation.isReversed ? targetTable : sourceTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n\nexport function getTableAsAliasSQL(table: Table | View) {\n\treturn sql`${\n\t\ttable[IsAlias]\n\t\t\t? sql`${sql`${sql.identifier(table[Schema] ?? '')}.`.if(table[Schema])}${\n\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t} as ${table}`\n\t\t\t: table\n\t}`;\n}\n"],"mappings":"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","names":["import_table","acc","filter"]}
|
package/relations.d.cts
CHANGED
|
@@ -33,7 +33,7 @@ export declare abstract class Relation<TSourceTableName extends string = string,
|
|
|
33
33
|
tableName: TTargetTableName;
|
|
34
34
|
}>[];
|
|
35
35
|
alias: string | undefined;
|
|
36
|
-
where:
|
|
36
|
+
where: AnyTableFilter | undefined;
|
|
37
37
|
sourceTable: AnyTable<{
|
|
38
38
|
name: TSourceTableName;
|
|
39
39
|
}> | View<TSourceTableName>;
|
|
@@ -133,7 +133,7 @@ export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many',
|
|
|
133
133
|
[K in keyof TTableConfig['relations']]?: boolean | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never) | undefined;
|
|
134
134
|
} | undefined;
|
|
135
135
|
extras?: Record<string, SQLWrapper> | ((table: TTableConfig['table'], operators: SQLOperator) => Record<string, SQLWrapper>) | undefined;
|
|
136
|
-
where?: RelationsFilter<TTableConfig
|
|
136
|
+
where?: RelationsFilter<TTableConfig, TSchema> | undefined;
|
|
137
137
|
orderBy?: {
|
|
138
138
|
[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;
|
|
139
139
|
} | ((table: TTableConfig['table'], operators: OrderByOperators) => ValueOrArray<AnyColumn | SQL>) | undefined;
|
|
@@ -272,19 +272,32 @@ export type RelationFieldsFilterInternals<T> = {
|
|
|
272
272
|
OR?: RelationsFieldFilter<T>[];
|
|
273
273
|
};
|
|
274
274
|
export type RelationsFieldFilter<T = unknown> = RelationFieldsFilterInternals<T> | (unknown extends T ? never : T extends object ? never : T);
|
|
275
|
-
export type
|
|
276
|
-
|
|
275
|
+
export type RelationsFilterCommons<TTable extends TableRelationalConfig = TableRelationalConfig, TSchema extends TablesRelationalConfig = TablesRelationalConfig> = {
|
|
276
|
+
OR?: RelationsFilter<TTable, TSchema>[];
|
|
277
|
+
NOT?: RelationsFilter<TTable, TSchema>;
|
|
278
|
+
RAW?: (table: TTable['table'], operators: Operators) => SQL;
|
|
279
|
+
};
|
|
280
|
+
export type RelationsFilter<TTable extends TableRelationalConfig, TSchema extends TablesRelationalConfig, TRelations extends Record<string, Relation> = TTable['relations'], TColumns extends FieldSelection = TTable['columns']> = {
|
|
281
|
+
[K in keyof TColumns as K extends keyof RelationsFilterCommons ? never : K]?: TColumns[K] extends Column ? RelationsFieldFilter<TColumns[K]['_']['data']> : RelationsFieldFilter<unknown>;
|
|
277
282
|
} & {
|
|
278
|
-
|
|
279
|
-
|
|
283
|
+
[K in keyof TRelations as K extends keyof TColumns | keyof RelationsFilterCommons ? never : K]?: boolean | RelationsFilter<FindTableInRelationalConfig<TSchema, TRelations[K]['targetTable']>, TSchema>;
|
|
284
|
+
} & RelationsFilterCommons<TTable, TSchema>;
|
|
285
|
+
export type TableFilterCommons<TTable extends Table | View = Table | View, TColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection> : Assume<TTable, Table>['_']['columns']> = {
|
|
286
|
+
OR?: TableFilter<TTable, TColumns>[];
|
|
287
|
+
NOT?: TableFilter<TTable, TColumns>;
|
|
280
288
|
RAW?: (table: TTable, operators: Operators) => SQL;
|
|
281
289
|
};
|
|
290
|
+
export type TableFilter<TTable extends Table | View = Table | View, TColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection> : Assume<TTable, Table>['_']['columns']> = {
|
|
291
|
+
[K in keyof TColumns as K extends keyof TableFilterCommons ? never : K]?: TColumns[K] extends Column ? RelationsFieldFilter<TColumns[K]['_']['data']> : RelationsFieldFilter<unknown>;
|
|
292
|
+
} & TableFilterCommons<TTable, TColumns>;
|
|
293
|
+
export type AnyRelationsFilter = RelationsFilter<TableRelationalConfig, TablesRelationalConfig, Record<string, Relation>, FieldSelection>;
|
|
294
|
+
export type AnyTableFilter = TableFilter<Table | View, FieldSelection>;
|
|
282
295
|
export interface OneConfig<TSchema extends Record<string, Table | View>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
283
296
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
284
297
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
285
298
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
286
299
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
287
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ?
|
|
300
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]> : TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;
|
|
288
301
|
optional?: TOptional;
|
|
289
302
|
alias?: string;
|
|
290
303
|
}
|
|
@@ -294,7 +307,7 @@ export interface ManyConfig<TSchema extends Record<string, Table | View>, TSourc
|
|
|
294
307
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
295
308
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
296
309
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
297
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ?
|
|
310
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]> : TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;
|
|
298
311
|
alias?: string;
|
|
299
312
|
}
|
|
300
313
|
export type AnyManyConfig = ManyConfig<Record<string, Table | View>, Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, string>;
|
|
@@ -326,7 +339,7 @@ export type RelationsBuilder<TSchema extends Record<string, Table | View>> = {
|
|
|
326
339
|
export type RelationsBuilderConfig<TTables extends Record<string, Table | View>> = {
|
|
327
340
|
[TTableName in keyof TTables & string]?: TTables[TTableName] extends Table | View<string, boolean, FieldSelection> ? Record<string, RelationsBuilderEntry<TTables, TTableName>> : DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;
|
|
328
341
|
};
|
|
329
|
-
export type RelationsBuilderEntry<TTables extends Record<string, Table | View> = Record<string, Table | View>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string
|
|
342
|
+
export type RelationsBuilderEntry<TTables extends Record<string, Table | View> = Record<string, Table | View>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string>;
|
|
330
343
|
export type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {
|
|
331
344
|
[K in keyof TSchema as TSchema[K] extends Table | View ? K : never]: TSchema[K] extends Table | View ? TSchema[K] : never;
|
|
332
345
|
};
|
|
@@ -346,7 +359,7 @@ export type RelationsOrder<TColumns extends FieldSelection> = {
|
|
|
346
359
|
};
|
|
347
360
|
export type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;
|
|
348
361
|
export type Extras = Exclude<DBQueryConfig['extras'], undefined>;
|
|
349
|
-
export declare function relationsFilterToSQL(table: Table | View, filter:
|
|
362
|
+
export declare function relationsFilterToSQL(table: Table | View, filter: AnyRelationsFilter | AnyTableFilter, tableRelations?: Record<string, Relation>, tablesRelations?: TablesRelationalConfig, tableNamesMap?: Record<string, string>, depth?: number): SQL | undefined;
|
|
350
363
|
export declare function relationsOrderToSQL(table: Table | View, orders: OrderBy): SQL | undefined;
|
|
351
364
|
export declare function relationExtrasToSQL(table: Table | View, extras: Extras): {
|
|
352
365
|
sql: SQL<unknown> | undefined;
|
package/relations.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare abstract class Relation<TSourceTableName extends string = string,
|
|
|
33
33
|
tableName: TTargetTableName;
|
|
34
34
|
}>[];
|
|
35
35
|
alias: string | undefined;
|
|
36
|
-
where:
|
|
36
|
+
where: AnyTableFilter | undefined;
|
|
37
37
|
sourceTable: AnyTable<{
|
|
38
38
|
name: TSourceTableName;
|
|
39
39
|
}> | View<TSourceTableName>;
|
|
@@ -133,7 +133,7 @@ export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many',
|
|
|
133
133
|
[K in keyof TTableConfig['relations']]?: boolean | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never) | undefined;
|
|
134
134
|
} | undefined;
|
|
135
135
|
extras?: Record<string, SQLWrapper> | ((table: TTableConfig['table'], operators: SQLOperator) => Record<string, SQLWrapper>) | undefined;
|
|
136
|
-
where?: RelationsFilter<TTableConfig
|
|
136
|
+
where?: RelationsFilter<TTableConfig, TSchema> | undefined;
|
|
137
137
|
orderBy?: {
|
|
138
138
|
[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;
|
|
139
139
|
} | ((table: TTableConfig['table'], operators: OrderByOperators) => ValueOrArray<AnyColumn | SQL>) | undefined;
|
|
@@ -272,19 +272,32 @@ export type RelationFieldsFilterInternals<T> = {
|
|
|
272
272
|
OR?: RelationsFieldFilter<T>[];
|
|
273
273
|
};
|
|
274
274
|
export type RelationsFieldFilter<T = unknown> = RelationFieldsFilterInternals<T> | (unknown extends T ? never : T extends object ? never : T);
|
|
275
|
-
export type
|
|
276
|
-
|
|
275
|
+
export type RelationsFilterCommons<TTable extends TableRelationalConfig = TableRelationalConfig, TSchema extends TablesRelationalConfig = TablesRelationalConfig> = {
|
|
276
|
+
OR?: RelationsFilter<TTable, TSchema>[];
|
|
277
|
+
NOT?: RelationsFilter<TTable, TSchema>;
|
|
278
|
+
RAW?: (table: TTable['table'], operators: Operators) => SQL;
|
|
279
|
+
};
|
|
280
|
+
export type RelationsFilter<TTable extends TableRelationalConfig, TSchema extends TablesRelationalConfig, TRelations extends Record<string, Relation> = TTable['relations'], TColumns extends FieldSelection = TTable['columns']> = {
|
|
281
|
+
[K in keyof TColumns as K extends keyof RelationsFilterCommons ? never : K]?: TColumns[K] extends Column ? RelationsFieldFilter<TColumns[K]['_']['data']> : RelationsFieldFilter<unknown>;
|
|
277
282
|
} & {
|
|
278
|
-
|
|
279
|
-
|
|
283
|
+
[K in keyof TRelations as K extends keyof TColumns | keyof RelationsFilterCommons ? never : K]?: boolean | RelationsFilter<FindTableInRelationalConfig<TSchema, TRelations[K]['targetTable']>, TSchema>;
|
|
284
|
+
} & RelationsFilterCommons<TTable, TSchema>;
|
|
285
|
+
export type TableFilterCommons<TTable extends Table | View = Table | View, TColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection> : Assume<TTable, Table>['_']['columns']> = {
|
|
286
|
+
OR?: TableFilter<TTable, TColumns>[];
|
|
287
|
+
NOT?: TableFilter<TTable, TColumns>;
|
|
280
288
|
RAW?: (table: TTable, operators: Operators) => SQL;
|
|
281
289
|
};
|
|
290
|
+
export type TableFilter<TTable extends Table | View = Table | View, TColumns extends FieldSelection = TTable extends View ? Assume<TTable['_']['selectedFields'], FieldSelection> : Assume<TTable, Table>['_']['columns']> = {
|
|
291
|
+
[K in keyof TColumns as K extends keyof TableFilterCommons ? never : K]?: TColumns[K] extends Column ? RelationsFieldFilter<TColumns[K]['_']['data']> : RelationsFieldFilter<unknown>;
|
|
292
|
+
} & TableFilterCommons<TTable, TColumns>;
|
|
293
|
+
export type AnyRelationsFilter = RelationsFilter<TableRelationalConfig, TablesRelationalConfig, Record<string, Relation>, FieldSelection>;
|
|
294
|
+
export type AnyTableFilter = TableFilter<Table | View, FieldSelection>;
|
|
282
295
|
export interface OneConfig<TSchema extends Record<string, Table | View>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
283
296
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
284
297
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
285
298
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
286
299
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
287
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ?
|
|
300
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]> : TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;
|
|
288
301
|
optional?: TOptional;
|
|
289
302
|
alias?: string;
|
|
290
303
|
}
|
|
@@ -294,7 +307,7 @@ export interface ManyConfig<TSchema extends Record<string, Table | View>, TSourc
|
|
|
294
307
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
295
308
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
296
309
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
297
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ?
|
|
310
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? TableFilter<TSchema[TSourceColumns[number]['_']['tableName']]> : TableFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]>;
|
|
298
311
|
alias?: string;
|
|
299
312
|
}
|
|
300
313
|
export type AnyManyConfig = ManyConfig<Record<string, Table | View>, Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, string>;
|
|
@@ -326,7 +339,7 @@ export type RelationsBuilder<TSchema extends Record<string, Table | View>> = {
|
|
|
326
339
|
export type RelationsBuilderConfig<TTables extends Record<string, Table | View>> = {
|
|
327
340
|
[TTableName in keyof TTables & string]?: TTables[TTableName] extends Table | View<string, boolean, FieldSelection> ? Record<string, RelationsBuilderEntry<TTables, TTableName>> : DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;
|
|
328
341
|
};
|
|
329
|
-
export type RelationsBuilderEntry<TTables extends Record<string, Table | View> = Record<string, Table | View>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string
|
|
342
|
+
export type RelationsBuilderEntry<TTables extends Record<string, Table | View> = Record<string, Table | View>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string>;
|
|
330
343
|
export type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {
|
|
331
344
|
[K in keyof TSchema as TSchema[K] extends Table | View ? K : never]: TSchema[K] extends Table | View ? TSchema[K] : never;
|
|
332
345
|
};
|
|
@@ -346,7 +359,7 @@ export type RelationsOrder<TColumns extends FieldSelection> = {
|
|
|
346
359
|
};
|
|
347
360
|
export type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;
|
|
348
361
|
export type Extras = Exclude<DBQueryConfig['extras'], undefined>;
|
|
349
|
-
export declare function relationsFilterToSQL(table: Table | View, filter:
|
|
362
|
+
export declare function relationsFilterToSQL(table: Table | View, filter: AnyRelationsFilter | AnyTableFilter, tableRelations?: Record<string, Relation>, tablesRelations?: TablesRelationalConfig, tableNamesMap?: Record<string, string>, depth?: number): SQL | undefined;
|
|
350
363
|
export declare function relationsOrderToSQL(table: Table | View, orders: OrderBy): SQL | undefined;
|
|
351
364
|
export declare function relationExtrasToSQL(table: Table | View, extras: Extras): {
|
|
352
365
|
sql: SQL<unknown> | undefined;
|
package/relations.js
CHANGED
|
@@ -6,8 +6,10 @@ import {
|
|
|
6
6
|
Table
|
|
7
7
|
} from "./table.js";
|
|
8
8
|
import { Columns } from "./table.js";
|
|
9
|
+
import { aliasedTable } from "./alias.js";
|
|
9
10
|
import { Column } from "./column.js";
|
|
10
11
|
import { entityKind, is } from "./entity.js";
|
|
12
|
+
import { DrizzleError } from "./errors.js";
|
|
11
13
|
import {
|
|
12
14
|
and,
|
|
13
15
|
asc,
|
|
@@ -513,7 +515,7 @@ function relationsFieldFilterToSQL(column, filter) {
|
|
|
513
515
|
return void 0;
|
|
514
516
|
return and(...parts);
|
|
515
517
|
}
|
|
516
|
-
function relationsFilterToSQL(table, filter) {
|
|
518
|
+
function relationsFilterToSQL(table, filter, tableRelations = {}, tablesRelations = {}, tableNamesMap = {}, depth = 0) {
|
|
517
519
|
const entries = Object.entries(filter);
|
|
518
520
|
if (!entries.length)
|
|
519
521
|
return void 0;
|
|
@@ -550,14 +552,44 @@ function relationsFilterToSQL(table, filter) {
|
|
|
550
552
|
continue;
|
|
551
553
|
}
|
|
552
554
|
default: {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
555
|
+
if (table[Columns][target]) {
|
|
556
|
+
const column = fieldSelectionToSQL(table, target);
|
|
557
|
+
const colFilter = relationsFieldFilterToSQL(
|
|
558
|
+
column,
|
|
559
|
+
value
|
|
560
|
+
);
|
|
561
|
+
if (colFilter)
|
|
562
|
+
parts.push(colFilter);
|
|
563
|
+
continue;
|
|
564
|
+
}
|
|
565
|
+
const relation = tableRelations[target];
|
|
566
|
+
if (!relation) {
|
|
567
|
+
throw new DrizzleError({
|
|
568
|
+
message: `Unknown relational filter field: "${target}"`
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
const targetTable = aliasedTable(relation.targetTable, `f${depth}`);
|
|
572
|
+
const throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : void 0;
|
|
573
|
+
const targetConfig = tablesRelations[tableNamesMap[getTableUniqueName(relation.targetTable)]];
|
|
574
|
+
const {
|
|
575
|
+
filter: relationFilter,
|
|
576
|
+
joinCondition
|
|
577
|
+
} = relationToSQL(relation, table, targetTable, throughTable);
|
|
578
|
+
const subfilter = typeof value === "boolean" ? void 0 : relationsFilterToSQL(
|
|
579
|
+
targetTable,
|
|
580
|
+
value,
|
|
581
|
+
targetConfig.relations,
|
|
582
|
+
tablesRelations,
|
|
583
|
+
tableNamesMap,
|
|
584
|
+
depth + 1
|
|
557
585
|
);
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
586
|
+
const filter2 = and(
|
|
587
|
+
relationFilter,
|
|
588
|
+
subfilter
|
|
589
|
+
);
|
|
590
|
+
const subquery = throughTable ? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition}${sql` where ${filter2}`.if(filter2)} limit 1)` : sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter2}`.if(filter2)} limit 1)`;
|
|
591
|
+
if (filter2)
|
|
592
|
+
parts.push((value ? exists : notExists)(subquery));
|
|
561
593
|
}
|
|
562
594
|
}
|
|
563
595
|
}
|
|
@@ -615,12 +647,10 @@ function relationToSQL(relation, sourceTable, targetTable, throughTable) {
|
|
|
615
647
|
});
|
|
616
648
|
return {
|
|
617
649
|
filter: and(
|
|
618
|
-
relation.where ? relationsFilterToSQL(relation.isReversed ? targetTable : sourceTable, relation.where) : void 0
|
|
650
|
+
relation.where ? relationsFilterToSQL(relation.isReversed ? targetTable : sourceTable, relation.where) : void 0,
|
|
651
|
+
...outerColumnWhere
|
|
619
652
|
),
|
|
620
|
-
joinCondition: and(
|
|
621
|
-
...outerColumnWhere,
|
|
622
|
-
...innerColumnWhere
|
|
623
|
-
)
|
|
653
|
+
joinCondition: and(...innerColumnWhere)
|
|
624
654
|
};
|
|
625
655
|
}
|
|
626
656
|
const columnWhere = relation.sourceColumns.map((s, i) => {
|