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/libsql/session.cjs +4 -8
- package/libsql/session.cjs.map +1 -1
- package/libsql/session.js +4 -8
- package/libsql/session.js.map +1 -1
- package/mysql-core/dialect.cjs +19 -6
- package/mysql-core/dialect.cjs.map +1 -1
- package/mysql-core/dialect.d.cts +2 -1
- package/mysql-core/dialect.d.ts +2 -1
- package/mysql-core/dialect.js +19 -6
- package/mysql-core/dialect.js.map +1 -1
- package/mysql2/session.cjs +1 -22
- package/mysql2/session.cjs.map +1 -1
- package/mysql2/session.js +1 -22
- package/mysql2/session.js.map +1 -1
- package/package.json +49 -49
- package/pg-core/dialect.cjs +4 -3
- package/pg-core/dialect.cjs.map +1 -1
- package/pg-core/dialect.js +4 -3
- package/pg-core/dialect.js.map +1 -1
- package/relations.cjs +41 -6
- package/relations.cjs.map +1 -1
- package/relations.d.cts +19 -19
- package/relations.d.ts +19 -19
- package/relations.js +42 -7
- package/relations.js.map +1 -1
- package/sqlite-core/dialect.cjs +3 -2
- package/sqlite-core/dialect.cjs.map +1 -1
- package/sqlite-core/dialect.js +3 -2
- package/sqlite-core/dialect.js.map +1 -1
- package/version.cjs +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/relations.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, IsAlias, Schema, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'RelationsV2';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tif (!is(table, Table)) continue;\n\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = Array.isArray(config.from)\n\t\t\t\t? config.from.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: Table | undefined;\n\n\tonTable(table: Table) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean | undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>\n\t\t\t\t\t\t: never)\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\ttable: Simplify<\n\t\t\t\t\t& AnyTable<TTableConfig>\n\t\t\t\t\t& TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>)\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t\twhere?: RelationsFilter<TTableConfig['columns']> | undefined;\n\t\torderBy?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: 'asc' | 'desc' | undefined;\n\t\t\t}\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\tAnyTable<TTableConfig> & TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\t\tif (is(field, Table)) {\n\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(item, selectionItem.selection!, mapColumnValue);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\n\t\treturn this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T;\n\tne?: T;\n\tgt?: T;\n\tgte?: T;\n\tlt?: T;\n\tlte?: T;\n\tin?: T[];\n\tnotIn?: T[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: true;\n\tisNotNull?: true;\n\tNOT?: RelationsFieldFilter<T>;\n\tOR?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> = T | RelationFieldsFilterInternals<T | Placeholder>;\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\tOR?: RelationsFilter<TColumns>[];\n\t\tNOT?: RelationsFilter<TColumns>;\n\t\tRAW?: (\n\t\t\ttable: Simplify<\n\t\t\t\t& AnyTable<{ columns: TColumns }>\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TColumns]: TColumns[K];\n\t\t\t\t}\n\t\t\t>,\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables, string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table> = Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<DBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<DBQueryConfig['extras'], undefined>;\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<any>[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(table, value as RelationsFilter<Record<string, Column>>);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(entries.map(([column, value]) => (value === 'asc' ? asc : desc)(table[Columns][column]!)), sql`, `);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table as any, { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined {\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(sourceTable[Schema] ?? '')}.`.if(sourceTable[Schema] && !sourceTable[IsAlias])\n\t\t\t}`}${sourceTable}.${sql.identifier(s.name)}`,\n\t\t\tsql`${sql`${\n\t\t\t\tsql`${sql.identifier(targetTable[Schema] ?? '')}.`.if(targetTable[Schema] && !targetTable[IsAlias])\n\t\t\t}`}${targetTable}.${sql.identifier(t.name)}`,\n\t\t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationsFilterToSQL(sourceTable, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"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","names":["import_table","acc","key"]}
|
|
1
|
+
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { 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":["import_table","acc","key"]}
|
package/relations.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import { type AnyTable, type InferModelFromColumns, Table } from "./table.cjs";
|
|
|
2
2
|
import { type AnyColumn, Column } from "./column.cjs";
|
|
3
3
|
import { entityKind } from "./entity.cjs";
|
|
4
4
|
import { and, asc, between, desc, exists, ilike, inArray, isNotNull, isNull, like, not, notBetween, notExists, notIlike, notInArray, notLike, or } from "./sql/expressions/index.cjs";
|
|
5
|
-
import { Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.cjs";
|
|
5
|
+
import { type Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.cjs";
|
|
6
6
|
import { type Assume, type Equal, type Simplify, type ValueOrArray, type Writable } from "./utils.cjs";
|
|
7
7
|
export declare class Relations<TSchema extends Record<string, unknown> = Record<string, unknown>, TTables extends Record<string, Table> = Record<string, Table>, TConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>> {
|
|
8
8
|
readonly schema: TSchema;
|
|
@@ -164,7 +164,7 @@ export type ExtractTablesWithRelations<TRelations extends Relations, TTables ext
|
|
|
164
164
|
};
|
|
165
165
|
export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
166
166
|
export type BuildRelationResult<TConfig extends TablesRelationalConfig, TInclude, TRelations extends Record<string, RelationsBuilderEntry>> = {
|
|
167
|
-
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
167
|
+
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : TInclude[K] extends Record<string, unknown> ? TInclude[K]['where'] extends Record<string, any> ? null : never : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
168
168
|
};
|
|
169
169
|
export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
|
|
170
170
|
[K in keyof T as T[K] extends undefined ? never : K]: K;
|
|
@@ -186,12 +186,13 @@ export interface BuildRelationalQueryResult {
|
|
|
186
186
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
187
187
|
isArray?: boolean;
|
|
188
188
|
selection?: BuildRelationalQueryResult['selection'];
|
|
189
|
+
isOptional?: boolean;
|
|
189
190
|
}[];
|
|
190
191
|
sql: SQL;
|
|
191
192
|
}
|
|
192
193
|
export declare function mapRelationalRow(row: Record<string, unknown>, buildQueryResultSelection: BuildRelationalQueryResult['selection'], mapColumnValue?: (value: unknown) => unknown,
|
|
193
194
|
/** Needed for SQLite as it returns JSON values as strings */
|
|
194
|
-
parseJson?: boolean): Record<string, unknown>;
|
|
195
|
+
parseJson?: boolean, path?: string): Record<string, unknown>;
|
|
195
196
|
export declare class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {
|
|
196
197
|
static readonly [entityKind]: string;
|
|
197
198
|
readonly _: {
|
|
@@ -233,24 +234,24 @@ export declare class RelationsBuilderColumn<TTableName extends string = string,
|
|
|
233
234
|
getSQL(): SQL;
|
|
234
235
|
}
|
|
235
236
|
export type RelationFieldsFilterInternals<T> = {
|
|
236
|
-
eq?: T;
|
|
237
|
-
ne?: T;
|
|
238
|
-
gt?: T;
|
|
239
|
-
gte?: T;
|
|
240
|
-
lt?: T;
|
|
241
|
-
lte?: T;
|
|
242
|
-
in?: T[];
|
|
243
|
-
notIn?: T[];
|
|
244
|
-
like?: string;
|
|
245
|
-
ilike?: string;
|
|
246
|
-
notLike?: string;
|
|
247
|
-
notIlike?: string;
|
|
237
|
+
eq?: T | Placeholder;
|
|
238
|
+
ne?: T | Placeholder;
|
|
239
|
+
gt?: T | Placeholder;
|
|
240
|
+
gte?: T | Placeholder;
|
|
241
|
+
lt?: T | Placeholder;
|
|
242
|
+
lte?: T | Placeholder;
|
|
243
|
+
in?: (T | Placeholder)[] | Placeholder;
|
|
244
|
+
notIn?: (T | Placeholder)[] | Placeholder;
|
|
245
|
+
like?: string | Placeholder;
|
|
246
|
+
ilike?: string | Placeholder;
|
|
247
|
+
notLike?: string | Placeholder;
|
|
248
|
+
notIlike?: string | Placeholder;
|
|
248
249
|
isNull?: true;
|
|
249
250
|
isNotNull?: true;
|
|
250
251
|
NOT?: RelationsFieldFilter<T>;
|
|
251
252
|
OR?: RelationsFieldFilter<T>[];
|
|
252
253
|
};
|
|
253
|
-
export type RelationsFieldFilter<T> = T |
|
|
254
|
+
export type RelationsFieldFilter<T> = RelationFieldsFilterInternals<T> | (T extends Record<string, any> ? never : T);
|
|
254
255
|
export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
255
256
|
[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;
|
|
256
257
|
} & {
|
|
@@ -258,9 +259,7 @@ export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
|
258
259
|
NOT?: RelationsFilter<TColumns>;
|
|
259
260
|
RAW?: (table: Simplify<AnyTable<{
|
|
260
261
|
columns: TColumns;
|
|
261
|
-
}> &
|
|
262
|
-
[K in keyof TColumns]: TColumns[K];
|
|
263
|
-
}>, operators: Operators) => SQL;
|
|
262
|
+
}> & TColumns>, operators: Operators) => SQL;
|
|
264
263
|
};
|
|
265
264
|
export interface OneConfig<TSchema extends Record<string, Table>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
266
265
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
@@ -341,6 +340,7 @@ export declare function relationExtrasToSQL(table: Table, extras: Extras): {
|
|
|
341
340
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
342
341
|
isArray?: boolean;
|
|
343
342
|
selection?: BuildRelationalQueryResult["selection"];
|
|
343
|
+
isOptional?: boolean;
|
|
344
344
|
}[];
|
|
345
345
|
};
|
|
346
346
|
export declare function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined;
|
package/relations.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { type AnyTable, type InferModelFromColumns, Table } from "./table.js";
|
|
|
2
2
|
import { type AnyColumn, Column } from "./column.js";
|
|
3
3
|
import { entityKind } from "./entity.js";
|
|
4
4
|
import { and, asc, between, desc, exists, ilike, inArray, isNotNull, isNull, like, not, notBetween, notExists, notIlike, notInArray, notLike, or } from "./sql/expressions/index.js";
|
|
5
|
-
import { Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.js";
|
|
5
|
+
import { type Placeholder, SQL, sql, type SQLWrapper } from "./sql/sql.js";
|
|
6
6
|
import { type Assume, type Equal, type Simplify, type ValueOrArray, type Writable } from "./utils.js";
|
|
7
7
|
export declare class Relations<TSchema extends Record<string, unknown> = Record<string, unknown>, TTables extends Record<string, Table> = Record<string, Table>, TConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>> {
|
|
8
8
|
readonly schema: TSchema;
|
|
@@ -164,7 +164,7 @@ export type ExtractTablesWithRelations<TRelations extends Relations, TTables ext
|
|
|
164
164
|
};
|
|
165
165
|
export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
166
166
|
export type BuildRelationResult<TConfig extends TablesRelationalConfig, TInclude, TRelations extends Record<string, RelationsBuilderEntry>> = {
|
|
167
|
-
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
167
|
+
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : TInclude[K] extends Record<string, unknown> ? TInclude[K]['where'] extends Record<string, any> ? null : never : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
168
168
|
};
|
|
169
169
|
export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
|
|
170
170
|
[K in keyof T as T[K] extends undefined ? never : K]: K;
|
|
@@ -186,12 +186,13 @@ export interface BuildRelationalQueryResult {
|
|
|
186
186
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
187
187
|
isArray?: boolean;
|
|
188
188
|
selection?: BuildRelationalQueryResult['selection'];
|
|
189
|
+
isOptional?: boolean;
|
|
189
190
|
}[];
|
|
190
191
|
sql: SQL;
|
|
191
192
|
}
|
|
192
193
|
export declare function mapRelationalRow(row: Record<string, unknown>, buildQueryResultSelection: BuildRelationalQueryResult['selection'], mapColumnValue?: (value: unknown) => unknown,
|
|
193
194
|
/** Needed for SQLite as it returns JSON values as strings */
|
|
194
|
-
parseJson?: boolean): Record<string, unknown>;
|
|
195
|
+
parseJson?: boolean, path?: string): Record<string, unknown>;
|
|
195
196
|
export declare class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {
|
|
196
197
|
static readonly [entityKind]: string;
|
|
197
198
|
readonly _: {
|
|
@@ -233,24 +234,24 @@ export declare class RelationsBuilderColumn<TTableName extends string = string,
|
|
|
233
234
|
getSQL(): SQL;
|
|
234
235
|
}
|
|
235
236
|
export type RelationFieldsFilterInternals<T> = {
|
|
236
|
-
eq?: T;
|
|
237
|
-
ne?: T;
|
|
238
|
-
gt?: T;
|
|
239
|
-
gte?: T;
|
|
240
|
-
lt?: T;
|
|
241
|
-
lte?: T;
|
|
242
|
-
in?: T[];
|
|
243
|
-
notIn?: T[];
|
|
244
|
-
like?: string;
|
|
245
|
-
ilike?: string;
|
|
246
|
-
notLike?: string;
|
|
247
|
-
notIlike?: string;
|
|
237
|
+
eq?: T | Placeholder;
|
|
238
|
+
ne?: T | Placeholder;
|
|
239
|
+
gt?: T | Placeholder;
|
|
240
|
+
gte?: T | Placeholder;
|
|
241
|
+
lt?: T | Placeholder;
|
|
242
|
+
lte?: T | Placeholder;
|
|
243
|
+
in?: (T | Placeholder)[] | Placeholder;
|
|
244
|
+
notIn?: (T | Placeholder)[] | Placeholder;
|
|
245
|
+
like?: string | Placeholder;
|
|
246
|
+
ilike?: string | Placeholder;
|
|
247
|
+
notLike?: string | Placeholder;
|
|
248
|
+
notIlike?: string | Placeholder;
|
|
248
249
|
isNull?: true;
|
|
249
250
|
isNotNull?: true;
|
|
250
251
|
NOT?: RelationsFieldFilter<T>;
|
|
251
252
|
OR?: RelationsFieldFilter<T>[];
|
|
252
253
|
};
|
|
253
|
-
export type RelationsFieldFilter<T> = T |
|
|
254
|
+
export type RelationsFieldFilter<T> = RelationFieldsFilterInternals<T> | (T extends Record<string, any> ? never : T);
|
|
254
255
|
export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
255
256
|
[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;
|
|
256
257
|
} & {
|
|
@@ -258,9 +259,7 @@ export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
|
258
259
|
NOT?: RelationsFilter<TColumns>;
|
|
259
260
|
RAW?: (table: Simplify<AnyTable<{
|
|
260
261
|
columns: TColumns;
|
|
261
|
-
}> &
|
|
262
|
-
[K in keyof TColumns]: TColumns[K];
|
|
263
|
-
}>, operators: Operators) => SQL;
|
|
262
|
+
}> & TColumns>, operators: Operators) => SQL;
|
|
264
263
|
};
|
|
265
264
|
export interface OneConfig<TSchema extends Record<string, Table>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
266
265
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
@@ -341,6 +340,7 @@ export declare function relationExtrasToSQL(table: Table, extras: Extras): {
|
|
|
341
340
|
field: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;
|
|
342
341
|
isArray?: boolean;
|
|
343
342
|
selection?: BuildRelationalQueryResult["selection"];
|
|
343
|
+
isOptional?: boolean;
|
|
344
344
|
}[];
|
|
345
345
|
};
|
|
346
346
|
export declare function relationToSQL(relation: Relation, sourceTable: Table, targetTable: Table): SQL | undefined;
|
package/relations.js
CHANGED
|
@@ -2,6 +2,7 @@ import { getTableUniqueName, IsAlias, Schema, Table } from "./table.js";
|
|
|
2
2
|
import { Columns, getTableName } from "./table.js";
|
|
3
3
|
import { Column } from "./column.js";
|
|
4
4
|
import { entityKind, is } from "./entity.js";
|
|
5
|
+
import { DrizzleError } from "./errors.js";
|
|
5
6
|
import { PrimaryKeyBuilder } from "./pg-core/primary-keys.js";
|
|
6
7
|
import {
|
|
7
8
|
and,
|
|
@@ -28,7 +29,7 @@ import {
|
|
|
28
29
|
notLike,
|
|
29
30
|
or
|
|
30
31
|
} from "./sql/expressions/index.js";
|
|
31
|
-
import {
|
|
32
|
+
import { SQL, sql } from "./sql/sql.js";
|
|
32
33
|
import { getTableColumns } from "./utils.js";
|
|
33
34
|
class Relations {
|
|
34
35
|
constructor(schema, tables, config) {
|
|
@@ -255,24 +256,43 @@ const orderByOperators = {
|
|
|
255
256
|
function getOrderByOperators() {
|
|
256
257
|
return orderByOperators;
|
|
257
258
|
}
|
|
258
|
-
function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false) {
|
|
259
|
+
function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value) => value, parseJson = false, path) {
|
|
259
260
|
for (const selectionItem of buildQueryResultSelection) {
|
|
260
261
|
const field = selectionItem.field;
|
|
261
262
|
if (is(field, Table)) {
|
|
262
|
-
if (row[selectionItem.key]
|
|
263
|
+
if (!selectionItem.isArray && Array.isArray(row[selectionItem.key])) {
|
|
264
|
+
row[selectionItem.key] = row[selectionItem.key][0] ?? null;
|
|
265
|
+
}
|
|
266
|
+
const currentPath = `${path ? `${path}.` : ""}${selectionItem.key}`;
|
|
267
|
+
if (row[selectionItem.key] === null) {
|
|
268
|
+
if (!selectionItem.isOptional) {
|
|
269
|
+
throw new DrizzleError({
|
|
270
|
+
message: `Unexpected null in relational query result on field "${currentPath}".
|
|
271
|
+
Did you forget to mark relation as optional?`
|
|
272
|
+
});
|
|
273
|
+
}
|
|
263
274
|
continue;
|
|
275
|
+
}
|
|
264
276
|
if (parseJson)
|
|
265
277
|
row[selectionItem.key] = JSON.parse(row[selectionItem.key]);
|
|
266
278
|
if (selectionItem.isArray) {
|
|
267
279
|
for (const item of row[selectionItem.key]) {
|
|
268
|
-
mapRelationalRow(
|
|
280
|
+
mapRelationalRow(
|
|
281
|
+
item,
|
|
282
|
+
selectionItem.selection,
|
|
283
|
+
mapColumnValue,
|
|
284
|
+
false,
|
|
285
|
+
currentPath
|
|
286
|
+
);
|
|
269
287
|
}
|
|
270
288
|
continue;
|
|
271
289
|
}
|
|
272
290
|
mapRelationalRow(
|
|
273
291
|
row[selectionItem.key],
|
|
274
292
|
selectionItem.selection,
|
|
275
|
-
mapColumnValue
|
|
293
|
+
mapColumnValue,
|
|
294
|
+
false,
|
|
295
|
+
currentPath
|
|
276
296
|
);
|
|
277
297
|
continue;
|
|
278
298
|
}
|
|
@@ -318,7 +338,7 @@ class RelationsBuilderColumn {
|
|
|
318
338
|
}
|
|
319
339
|
through(column) {
|
|
320
340
|
this._.through = column;
|
|
321
|
-
|
|
341
|
+
throw new Error("Not implemented");
|
|
322
342
|
}
|
|
323
343
|
getSQL() {
|
|
324
344
|
return this._.column.getSQL();
|
|
@@ -382,7 +402,7 @@ function defineRelations(schema, relations) {
|
|
|
382
402
|
);
|
|
383
403
|
}
|
|
384
404
|
function relationsFieldFilterToSQL(column, filter) {
|
|
385
|
-
if (typeof filter !== "object"
|
|
405
|
+
if (typeof filter !== "object")
|
|
386
406
|
return eq(column, filter);
|
|
387
407
|
const entries = Object.entries(filter);
|
|
388
408
|
if (!entries.length)
|
|
@@ -409,6 +429,21 @@ function relationsFieldFilterToSQL(column, filter) {
|
|
|
409
429
|
);
|
|
410
430
|
continue;
|
|
411
431
|
}
|
|
432
|
+
case "isNotNull":
|
|
433
|
+
case "isNull": {
|
|
434
|
+
if (!value)
|
|
435
|
+
continue;
|
|
436
|
+
parts.push(operators[target](column));
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
case "in": {
|
|
440
|
+
parts.push(operators.inArray(column, value));
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
case "notIn": {
|
|
444
|
+
parts.push(operators.notInArray(column, value));
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
412
447
|
default: {
|
|
413
448
|
parts.push(
|
|
414
449
|
operators[target](
|