drizzle-orm 0.38.3-7db411e → 0.38.3-b4f992e

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/relations.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, IsAlias, Schema, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'RelationsV2';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tif (!is(table, Table)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: Table | undefined;\n\n\tonTable(table: Table) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean | undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>\n\t\t\t\t\t\t: never)\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\ttable: Simplify<\n\t\t\t\t\t& AnyTable<TTableConfig>\n\t\t\t\t\t& TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t\twhere?: RelationsFilter<TTableConfig['columns']> | undefined;\n\t\torderBy?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;\n\t\t\t}\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\tAnyTable<TTableConfig> & TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\t\tif (is(field, Table)) {\n\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(item, selectionItem.selection!, mapColumnValue);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\n\t\treturn this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T;\n\tne?: T;\n\tgt?: T;\n\tgte?: T;\n\tlt?: T;\n\tlte?: T;\n\tin?: T[];\n\tnotIn?: T[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: true;\n\tisNotNull?: true;\n\tNOT?: RelationsFieldFilter<T>;\n\tOR?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> = T | RelationFieldsFilterInternals<T | Placeholder>;\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TColumns>[];\n\t\tNOT?: RelationsFilter<TColumns>;\n\t\tRAW?: (\n\t\t\ttable: Simplify<\n\t\t\t\t& AnyTable<{ columns: TColumns }>\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TColumns]: TColumns[K];\n\t\t\t\t}\n\t\t\t>,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables, string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table> = Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<DBQueryConfig['extras'], undefined>;\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<any>[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(table, value as RelationsFilter<Record<string, Column>>);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(entries.map(([column, value]) => (value === 'asc' ? asc : desc)(table[Columns][column]!)), sql`, `);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table as any, { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined {\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(sourceTable[Schema] ?? '')}.`.if(sourceTable[Schema] && !sourceTable[IsAlias])\n\t\t\t}`}${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(targetTable[Schema] ?? '')}.`.if(targetTable[Schema] && !targetTable[IsAlias])\n\t\t\t}`}${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationsFilterToSQL(sourceTable, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"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","names":["acc","key"]}
1
+ {"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, IsAlias, Schema, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'RelationsV2';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tif (!is(table, Table)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: Table | undefined;\n\n\tonTable(table: Table) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean | undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>\n\t\t\t\t\t\t: never)\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\ttable: Simplify<\n\t\t\t\t\t& AnyTable<TTableConfig>\n\t\t\t\t\t& TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t\twhere?: RelationsFilter<TTableConfig['columns']> | undefined;\n\t\torderBy?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;\n\t\t\t}\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\tAnyTable<TTableConfig> & TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null\n\t\t\t\t\t\t: TInclude[K] extends Record<string, unknown> ? TInclude[K]['where'] extends Record<string, any> ? null\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t: never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\tisOptional?: boolean;\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\tpath?: string,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\n\t\tif (is(field, Table)) {\n\t\t\t// MySQL's lateral joins act only as inner joins, thus must have null responses on single relations be casted as arrays to preserve rows\n\t\t\tif (!selectionItem.isArray && Array.isArray(row[selectionItem.key])) {\n\t\t\t\trow[selectionItem.key] = (row[selectionItem.key] as Array<any>)[0] ?? null;\n\t\t\t}\n\n\t\t\tconst currentPath = `${path ? `${path}.` : ''}${selectionItem.key}`;\n\n\t\t\tif (row[selectionItem.key] === null) {\n\t\t\t\tif (!selectionItem.isOptional) {\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Unexpected null in relational query result on field \"${currentPath}\".\\nDid you forget to mark relation as optional?`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tcurrentPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t\tfalse,\n\t\t\t\tcurrentPath,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\t\tthrow new Error('Not implemented');\n\t\t// return this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T | Placeholder;\n\tne?: T | Placeholder;\n\tgt?: T | Placeholder;\n\tgte?: T | Placeholder;\n\tlt?: T | Placeholder;\n\tlte?: T | Placeholder;\n\tin?: (T | Placeholder)[] | Placeholder;\n\tnotIn?: (T | Placeholder)[] | Placeholder;\n\tlike?: string | Placeholder;\n\tilike?: string | Placeholder;\n\tnotLike?: string | Placeholder;\n\tnotIlike?: string | Placeholder;\n\tisNull?: true;\n\tisNotNull?: true;\n\tNOT?: RelationsFieldFilter<T>;\n\tOR?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tT extends Record<string, any> ? never : T\n\t);\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TColumns>[];\n\t\tNOT?: RelationsFilter<TColumns>;\n\t\tRAW?: (\n\t\t\ttable: Simplify<\n\t\t\t\t& AnyTable<{ columns: TColumns }>\n\t\t\t\t& TColumns\n\t\t\t>,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables, string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table> = Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<DBQueryConfig['extras'], undefined>;\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object') return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<any>[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tparts.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tparts.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tparts.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(table, value as RelationsFilter<Record<string, Column>>);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(entries.map(([column, value]) => (value === 'asc' ? asc : desc)(table[Columns][column]!)), sql`, `);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table as any, { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined {\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(sourceTable[Schema] ?? '')}.`.if(sourceTable[Schema] && !sourceTable[IsAlias])\n\t\t\t}`}${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(targetTable[Schema] ?? '')}.`.if(targetTable[Schema] && !targetTable[IsAlias])\n\t\t\t}`}${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationsFilterToSQL(sourceTable, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"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","names":["acc","key"]}
@@ -698,7 +698,7 @@ class SQLiteDialect {
698
698
  }
699
699
  const relation = tableConfig.relations[k];
700
700
  const isSingle2 = (0, import_entity.is)(relation, import_relations.One);
701
- const targetTable = relation.targetTable;
701
+ const targetTable = (0, import_alias.aliasedTable)(relation.targetTable, `d${currentDepth + 1}`);
702
702
  const relationFilter = (0, import_relations.relationToSQL)(relation, table, targetTable);
703
703
  const innerQuery = this.buildRelationalQuery({
704
704
  table: targetTable,
@@ -717,7 +717,8 @@ class SQLiteDialect {
717
717
  field: targetTable,
718
718
  key: k,
719
719
  selection: innerQuery.selection,
720
- isArray: !isSingle2
720
+ isArray: !isSingle2,
721
+ isOptional: (relation.optional ?? false) || join !== true && !!join.where
721
722
  });
722
723
  const jsonColumns = import_sql2.sql.join(
723
724
  innerQuery.selection.map((s) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sqlite-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\tAggregatedField,\n\ttype AnyRelations,\n\ttype BuildRelationalQueryResult,\n\ttype ColumnWithTSName,\n\ttype DBQueryConfig,\n\tOne,\n\ttype Relation,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { and, eq } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Columns, getTableName, getTableUniqueName, IsAlias, OriginalName, Schema, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst value = set[colName] ?? sql.param(col.onUpdateFn!(), col);\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\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} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tconst tableName = field.table[Table.Symbol.Name];\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: SQLiteSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(origTableName)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.OriginalName] !== table[Table.Symbol.Name]) {\n\t\t\treturn sql`${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SQLiteSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SQLiteSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SQLiteSelectConfig['setOperators'][number] }): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select }: SQLiteInsertConfig,\n\t): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on conflict ${onConflict}` : undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SQLiteSelectConfig['orderBy'] = [], where;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SQLiteColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = (sql`(${builtRelation.sql})`).as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\tprivate unwrapAllColumns = (table: Table, selection: BuildRelationalQueryResult['selection']) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[Columns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v,\n\t\t\t\t});\n\n\t\t\t\treturn sql`${v} as ${sql.identifier(k)}`;\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (table: Table, columns?: Record<string, boolean | undefined>) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tif (!columns) {\n\t\t\tfor (const [k, v] of Object.entries(table[Columns])) {\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn selectedColumns;\n\t\t}\n\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: table[Columns][k]!,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(table[Columns])) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: SQLiteTable,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfig<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(table, params?.columns);\n\n\t\t\t\tfor (const column of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(sql`${column.column} as ${sql.identifier(column.tsName)}`);\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: column.tsName,\n\t\t\t\t\t\tfield: column.column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery(\n\t\t{\n\t\t\ttables,\n\t\t\tschema,\n\t\t\ttableNamesMap,\n\t\t\ttable,\n\t\t\ttableConfig,\n\t\t\tqueryConfig: config,\n\t\t\trelationWhere,\n\t\t\tmode,\n\t\t\tisNested,\n\t\t\terrorPath,\n\t\t\tdepth,\n\t\t}: {\n\t\t\ttables: Record<string, SQLiteTable>;\n\t\t\tschema: TablesRelationalConfig;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t\ttable: SQLiteTable;\n\t\t\ttableConfig: TableRelationalConfig;\n\t\t\tqueryConfig?: DBQueryConfig<'many'> | true;\n\t\t\trelationWhere?: SQL;\n\t\t\tmode: 'first' | 'many';\n\t\t\tisNested?: boolean;\n\t\t\terrorPath?: string;\n\t\t\tdepth?: number;\n\t\t},\n\t): BuildRelationalQueryResult {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = (params?.where && relationWhere)\n\t\t\t? and(relationsFilterToSQL(table, params.where), relationWhere)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(table, params.where)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy ? relationsOrderToSQL(table, params.orderBy) : undefined;\n\t\tconst extras = params?.extras ? relationExtrasToSQL(table, params.extras) : undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer<any>;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\tif (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t\tconst relation = tableConfig.relations[k]!;\n\n\t\t\t\t\t\t\trelation.onTable(table);\n\t\t\t\t\t\t\tconst query = relation.getSQL();\n\n\t\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\t\tfield: relation,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn sql`(${query}) as ${sql.identifier(k)}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = relation.targetTable;\n\t\t\t\t\t\tconst relationFilter = relationToSQL(relation, table, targetTable);\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as SQLiteTable,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\t\t\t\ttableConfig: schema[tableNamesMap[getTableUniqueName(relation.targetTable)]!]!,\n\t\t\t\t\t\t\ttableNamesMap,\n\t\t\t\t\t\t\ttables,\n\t\t\t\t\t\t\trelationWhere: relationFilter,\n\t\t\t\t\t\t\tisNested: true,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => {\n\t\t\t\t\t\t\t\treturn sql`${sql.raw(this.escapeString(s.key))}, ${\n\t\t\t\t\t\t\t\t\ts.selection ? sql`jsonb(${sql.identifier(s.key)})` : sql.identifier(s.key)\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn isNested\n\t\t\t\t\t\t\t? isSingle\n\t\t\t\t\t\t\t\t? sql`(select jsonb_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\t\tsql.identifier('t')\n\t\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t\t: sql`coalesce((select jsonb_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\t\tsql.identifier('r')\n\t\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), jsonb_array()) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: isSingle\n\t\t\t\t\t\t\t? sql`(select json_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\tsql.identifier('t')\n\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: sql`coalesce((select json_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\tsql.identifier('r')\n\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), jsonb_array()) as ${sql.identifier(k)}`;\n\t\t\t\t\t}),\n\t\t\t\t\tsql`, `,\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tconst selectionArr = [columns, extras?.sql, joins].filter((e) => e !== undefined);\n\t\tif (!selectionArr.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.tsName}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${\n\t\t\ttable[IsAlias]\n\t\t\t\t? sql`${sql`${sql.identifier(table[Schema] ?? '')}.`.if(table[Schema])}${\n\t\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t\t} as ${table}`\n\t\t\t\t: table\n\t\t}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${\n\t\t\tsql` limit ${limit}`.if(limit !== undefined)\n\t\t}${sql` offset ${offset}`.if(offset !== undefined)}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tTablesRelationalConfig,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | MigrationConfig,\n\t): void {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tsession.run(migrationTableCreate);\n\n\t\tconst dbMigrations = session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tsession.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'async',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tTablesRelationalConfig,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | MigrationConfig,\n\t): Promise<void> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tawait session.run(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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","names":["import_sql","import_table","table","select","sql","joinOn","field","joins","relation","query","isSingle"]}
1
+ {"version":3,"sources":["../../src/sqlite-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\tAggregatedField,\n\ttype AnyRelations,\n\ttype BuildRelationalQueryResult,\n\ttype ColumnWithTSName,\n\ttype DBQueryConfig,\n\tOne,\n\ttype Relation,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { and, eq } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Columns, getTableName, getTableUniqueName, IsAlias, OriginalName, Schema, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst value = set[colName] ?? sql.param(col.onUpdateFn!(), col);\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\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} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tconst tableName = field.table[Table.Symbol.Name];\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: SQLiteSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(origTableName)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.OriginalName] !== table[Table.Symbol.Name]) {\n\t\t\treturn sql`${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SQLiteSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SQLiteSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SQLiteSelectConfig['setOperators'][number] }): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select }: SQLiteInsertConfig,\n\t): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on conflict ${onConflict}` : undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SQLiteSelectConfig['orderBy'] = [], where;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SQLiteColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = (sql`(${builtRelation.sql})`).as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\tprivate unwrapAllColumns = (table: Table, selection: BuildRelationalQueryResult['selection']) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[Columns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v,\n\t\t\t\t});\n\n\t\t\t\treturn sql`${v} as ${sql.identifier(k)}`;\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (table: Table, columns?: Record<string, boolean | undefined>) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tif (!columns) {\n\t\t\tfor (const [k, v] of Object.entries(table[Columns])) {\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn selectedColumns;\n\t\t}\n\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: table[Columns][k]!,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(table[Columns])) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: SQLiteTable,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfig<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(table, params?.columns);\n\n\t\t\t\tfor (const column of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(sql`${column.column} as ${sql.identifier(column.tsName)}`);\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: column.tsName,\n\t\t\t\t\t\tfield: column.column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery(\n\t\t{\n\t\t\ttables,\n\t\t\tschema,\n\t\t\ttableNamesMap,\n\t\t\ttable,\n\t\t\ttableConfig,\n\t\t\tqueryConfig: config,\n\t\t\trelationWhere,\n\t\t\tmode,\n\t\t\tisNested,\n\t\t\terrorPath,\n\t\t\tdepth,\n\t\t}: {\n\t\t\ttables: Record<string, SQLiteTable>;\n\t\t\tschema: TablesRelationalConfig;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t\ttable: SQLiteTable;\n\t\t\ttableConfig: TableRelationalConfig;\n\t\t\tqueryConfig?: DBQueryConfig<'many'> | true;\n\t\t\trelationWhere?: SQL;\n\t\t\tmode: 'first' | 'many';\n\t\t\tisNested?: boolean;\n\t\t\terrorPath?: string;\n\t\t\tdepth?: number;\n\t\t},\n\t): BuildRelationalQueryResult {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = (params?.where && relationWhere)\n\t\t\t? and(relationsFilterToSQL(table, params.where), relationWhere)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(table, params.where)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy ? relationsOrderToSQL(table, params.orderBy) : undefined;\n\t\tconst extras = params?.extras ? relationExtrasToSQL(table, params.extras) : undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\tif (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t\tconst relation = tableConfig.relations[k]!;\n\n\t\t\t\t\t\t\trelation.onTable(table);\n\t\t\t\t\t\t\tconst query = relation.getSQL();\n\n\t\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\t\tfield: relation,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn sql`(${query}) as ${sql.identifier(k)}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`);\n\t\t\t\t\t\tconst relationFilter = relationToSQL(relation, table, targetTable);\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as SQLiteTable,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\t\t\t\ttableConfig: schema[tableNamesMap[getTableUniqueName(relation.targetTable)]!]!,\n\t\t\t\t\t\t\ttableNamesMap,\n\t\t\t\t\t\t\ttables,\n\t\t\t\t\t\t\trelationWhere: relationFilter,\n\t\t\t\t\t\t\tisNested: true,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as One<any, any>).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true && !!(join as Exclude<typeof join, boolean | undefined>).where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => {\n\t\t\t\t\t\t\t\treturn sql`${sql.raw(this.escapeString(s.key))}, ${\n\t\t\t\t\t\t\t\t\ts.selection ? sql`jsonb(${sql.identifier(s.key)})` : sql.identifier(s.key)\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn isNested\n\t\t\t\t\t\t\t? isSingle\n\t\t\t\t\t\t\t\t? sql`(select jsonb_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\t\tsql.identifier('t')\n\t\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t\t: sql`coalesce((select jsonb_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\t\tsql.identifier('r')\n\t\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), jsonb_array()) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: isSingle\n\t\t\t\t\t\t\t? sql`(select json_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\tsql.identifier('t')\n\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: sql`coalesce((select json_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\tsql.identifier('r')\n\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), jsonb_array()) as ${sql.identifier(k)}`;\n\t\t\t\t\t}),\n\t\t\t\t\tsql`, `,\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tconst selectionArr = [columns, extras?.sql, joins].filter((e) => e !== undefined);\n\t\tif (!selectionArr.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.tsName}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${\n\t\t\ttable[IsAlias]\n\t\t\t\t? sql`${sql`${sql.identifier(table[Schema] ?? '')}.`.if(table[Schema])}${\n\t\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t\t} as ${table}`\n\t\t\t\t: table\n\t\t}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${\n\t\t\tsql` limit ${limit}`.if(limit !== undefined)\n\t\t}${sql` offset ${offset}`.if(offset !== undefined)}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tTablesRelationalConfig,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | MigrationConfig,\n\t): void {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tsession.run(migrationTableCreate);\n\n\t\tconst dbMigrations = session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tsession.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'async',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tTablesRelationalConfig,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | MigrationConfig,\n\t): Promise<void> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tawait session.run(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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","names":["import_sql","import_table","table","select","sql","joinOn","field","joins","relation","query","isSingle"]}
@@ -670,7 +670,7 @@ class SQLiteDialect {
670
670
  }
671
671
  const relation = tableConfig.relations[k];
672
672
  const isSingle2 = is(relation, One);
673
- const targetTable = relation.targetTable;
673
+ const targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`);
674
674
  const relationFilter = relationToSQL(relation, table, targetTable);
675
675
  const innerQuery = this.buildRelationalQuery({
676
676
  table: targetTable,
@@ -689,7 +689,8 @@ class SQLiteDialect {
689
689
  field: targetTable,
690
690
  key: k,
691
691
  selection: innerQuery.selection,
692
- isArray: !isSingle2
692
+ isArray: !isSingle2,
693
+ isOptional: (relation.optional ?? false) || join !== true && !!join.where
693
694
  });
694
695
  const jsonColumns = sql.join(
695
696
  innerQuery.selection.map((s) => {