pqb 0.18.27 → 0.18.28
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/dist/index.d.ts +22 -4
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/sql/rawSql.ts","../src/columns/columnType.ts","../src/columns/code.ts","../src/sql/common.ts","../src/errors.ts","../src/query/query.ts","../src/sql/distinct.ts","../src/sql/select.ts","../src/sql/orderBy.ts","../src/sql/window.ts","../src/sql/where.ts","../src/sql/join.ts","../src/sql/having.ts","../src/sql/with.ts","../src/sql/types.ts","../src/sql/fromAndAs.ts","../src/sql/insert.ts","../src/sql/update.ts","../src/sql/delete.ts","../src/sql/truncate.ts","../src/sql/columnInfo.ts","../src/quote.ts","../src/sql/copy.ts","../src/sql/toSQL.ts","../src/sql/data.ts","../src/common/utils.ts","../src/query/queryUtils.ts","../src/columns/operators.ts","../src/columns/number.ts","../src/columns/string.ts","../src/columns/dateTime.ts","../src/columns/boolean.ts","../src/columns/enum.ts","../src/columns/json.ts","../src/columns/array.ts","../src/columns/customType.ts","../src/columns/columnTypes.ts","../src/columns/columnsSchema.ts","../src/columns/virtual.ts","../src/columns/unknown.ts","../src/columns/columnsByType.ts","../src/adapter.ts","../src/common/fn.ts","../src/queryMethods/aggregate.ts","../src/query/queryBase.ts","../src/queryMethods/as.ts","../src/queryMethods/clear.ts","../src/queryMethods/columnInfo.ts","../src/queryMethods/copy.ts","../src/queryMethods/create.ts","../src/queryMethods/delete.ts","../src/queryMethods/for.ts","../src/queryMethods/join/_join.ts","../src/queryMethods/select.ts","../src/queryMethods/from.ts","../src/common/selectItemExpression.ts","../src/queryMethods/get.ts","../src/queryMethods/having.ts","../src/queryMethods/hooks.ts","../src/queryMethods/where/where.ts","../src/queryMethods/join/join.ts","../src/queryMethods/json.ts","../src/queryMethods/log.ts","../src/queryMethods/merge.ts","../src/queryMethods/then.ts","../src/queryMethods/with.ts","../src/queryMethods/union.ts","../src/queryMethods/update.ts","../src/queryMethods/transaction.ts","../src/queryMethods/search.ts","../src/queryMethods/upsertOrCreate.ts","../src/queryMethods/rawSql.ts","../src/queryMethods/transform.ts","../src/queryMethods/none.ts","../src/queryMethods/queryMethods.ts","../src/query/db.ts","../src/testTransaction.ts","../src/modules/computed.ts"],"sourcesContent":["import {\n ColumnTypeBase,\n SQLArgs,\n RawSQLBase,\n RawSQLValues,\n TemplateLiteralArgs,\n isTemplateLiteralArgs,\n DynamicSQLArg,\n Expression,\n ExpressionTypeMethod,\n StaticSQLArgs,\n} from 'orchid-core';\nimport { DefaultColumnTypes } from '../columns';\nimport { ToSQLCtx } from './toSQL';\n\n// reuse array to track which variables were used in the SQL, to throw when there are some unused.\nconst used: string[] = [];\nconst literalValues: number[] = [];\n\nexport const templateLiteralToSQL = (\n template: TemplateLiteralArgs,\n ctx: ToSQLCtx,\n quotedAs?: string,\n): string => {\n let sql = '';\n const { values } = ctx;\n const parts = template[0];\n literalValues.length = 0;\n\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n sql += parts[i];\n\n const value = template[i + 1];\n if (value instanceof Expression) {\n sql += value.toSQL(ctx, quotedAs);\n } else {\n values.push(value);\n literalValues.push(sql.length);\n sql += `$${values.length}`;\n }\n }\n\n return sql + parts[i];\n};\n\nexport class RawSQL<\n T extends ColumnTypeBase,\n ColumnTypes = DefaultColumnTypes,\n> extends RawSQLBase<T, ColumnTypes> {\n declare columnTypes: ColumnTypes;\n\n constructor(\n sql: string | TemplateLiteralArgs,\n values?: RawSQLValues,\n type?: T,\n ) {\n super(sql, values);\n if (type) this._type = type;\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n let sql;\n const isTemplate = typeof this._sql !== 'string';\n\n if (isTemplate) {\n sql = templateLiteralToSQL(\n this._sql as TemplateLiteralArgs,\n ctx,\n quotedAs,\n );\n } else {\n sql = this._sql as string;\n }\n\n const data = this._values;\n if (!data) {\n return sql;\n }\n\n const { values } = ctx;\n const arr = sql.split(\"'\");\n const len = arr.length;\n used.length = 0;\n for (let i = 0; i < len; i += 2) {\n arr[i] = arr[i].replace(/\\$\\$?(\\w+)/g, (match, key, i) => {\n if (isTemplate && literalValues.includes(i)) return match;\n\n const value = data[key];\n if (value === undefined) {\n throw new Error(`Query variable \\`${key}\\` is not provided`);\n }\n\n used.push(key);\n\n if (match.length - key.length === 2) {\n if (typeof value !== 'string') {\n throw new Error(\n `Expected string value for $$${key} SQL keyword, got ${typeof value}`,\n );\n }\n\n return `\"${value.replace('\"', '\"\"').replace('.', '\".\"')}\"`;\n }\n\n values.push(value);\n return `$${values.length}`;\n });\n }\n\n if (used.length > 0 && used.length < Object.keys(data).length) {\n for (const key in data) {\n if (!used.includes(key)) {\n throw new Error(`Query variable \\`${key}\\` is unused`);\n }\n }\n }\n\n return arr.join(\"'\");\n }\n}\n\n// `DynamicRawSQL` extends both `Expression` and `ExpressionTypeMethod`, so it needs a separate interface.\nexport interface DynamicRawSQL<T extends ColumnTypeBase>\n extends Expression<T>,\n ExpressionTypeMethod {}\n\n// Calls the given function to get inner SQL each time when converting to SQL.\nexport class DynamicRawSQL<\n T extends ColumnTypeBase,\n ColumnTypes = DefaultColumnTypes,\n> extends Expression<T> {\n declare _type: T;\n declare columnTypes: ColumnTypes;\n\n constructor(public fn: DynamicSQLArg) {\n super();\n }\n\n // Calls the given function to get SQL from it.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return this.fn(raw).toSQL(ctx, quotedAs);\n }\n}\n\nDynamicRawSQL.prototype.type = ExpressionTypeMethod.prototype.type;\n\nexport function raw<T = unknown>(\n ...args: StaticSQLArgs\n): RawSQL<ColumnTypeBase<T>>;\nexport function raw<T = unknown>(\n ...args: [DynamicSQLArg]\n): DynamicRawSQL<ColumnTypeBase<T>>;\nexport function raw(...args: SQLArgs) {\n return isTemplateLiteralArgs(args)\n ? new RawSQL(args)\n : typeof args[0] === 'function'\n ? new DynamicRawSQL(args[0])\n : new RawSQL(args[0].raw, args[0].values);\n}\n\n// Raw SQL count(*) to apply directly to `QueryData.select`.\nexport const countSelect = [new RawSQL('count(*)')];\n","import { Query } from '../query/query';\nimport {\n ColumnDataBase,\n ColumnNameOfTable,\n ColumnTypeBase,\n ForeignKeyTable,\n MaybeArray,\n ErrorMessage,\n PrimaryKeyColumn,\n pushColumnData,\n QueryBaseCommon,\n RawSQLBase,\n setColumnData,\n ValidationContext,\n StaticSQLArgs,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { TableData } from './columnTypes';\nimport { raw, RawSQL } from '../sql/rawSql';\nimport { SearchWeight } from '../sql';\nimport { BaseOperators } from './operators';\n\n// type of data for ColumnType\nexport type ColumnData = ColumnDataBase & {\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: Omit<SingleColumnIndexOptions, 'column'>[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: ForeignKey<string, string[]>[];\n identity?: TableData.Identity;\n // raw SQL for a generated column\n generated?: RawSQLBase;\n};\n\n/**\n * - MATCH FULL will not allow one column of a multicolumn foreign key to be null unless all foreign key columns are null;\n * if they are all null, the row is not required to have a match in the referenced table.\n * - MATCH SIMPLE (default) allows any of the foreign key columns to be null; if any of them are null, the row is not required to have a match in the referenced table.\n * - MATCH PARTIAL - PG docs say it's not implemented.\n */\nexport type ForeignKeyMatch = 'FULL' | 'PARTIAL' | 'SIMPLE';\n\n/**\n * - NO ACTION Produce an error indicating that the deletion or update would create a foreign key constraint violation. If the constraint is deferred, this error will be produced at constraint check time if there still exist any referencing rows. This is the default action.\n * - RESTRICT Produce an error indicating that the deletion or update would create a foreign key constraint violation. This is the same as NO ACTION except that the check is not deferrable.\n * - CASCADE Delete any rows referencing the deleted row, or update the values of the referencing column(s) to the new values of the referenced columns, respectively.\n * - SET NULL Set all the referencing columns, or a specified subset of the referencing columns, to null. A subset of columns can only be specified for ON DELETE actions.\n * - SET DEFAULT Set all the referencing columns, or a specified subset of the referencing columns, to their default values. A subset of columns can only be specified for ON DELETE actions. (There must be a row in the referenced table matching the default values, if they are not null, or the operation will fail.)\n */\nexport type ForeignKeyAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\n// Foreign key type contains a foreign table (by function or a name), columns of this table, and foreign key options.\nexport type ForeignKey<Table extends string, Columns extends string[]> = (\n | {\n fn(): new () => { table: Table; columns: ColumnsShapeBase };\n }\n | {\n table: Table;\n }\n) & {\n columns: Columns;\n} & ForeignKeyOptions;\n\n// Used in migrations to also drop related entities if is set to CASCADE\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\n// Used in migrations to make foreign key SQL\nexport type ForeignKeyOptions = {\n name?: string;\n match?: ForeignKeyMatch;\n onUpdate?: ForeignKeyAction;\n onDelete?: ForeignKeyAction;\n dropMode?: DropMode;\n};\n\n// Index options of a single column, is used in migrations.\nexport type IndexColumnOptions = (\n | { column: string }\n | { expression: string }\n) & {\n collate?: string;\n opclass?: string;\n order?: string;\n // weight for a column in a search index\n weight?: SearchWeight;\n};\n\n// Options of the index, is used in migrations.\nexport type IndexOptions = {\n name?: string;\n unique?: boolean;\n nullsNotDistinct?: boolean;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: 'CASCADE' | 'RESTRICT';\n // set the language for the tsVector, 'english' is a default\n language?: string | RawSQLBase;\n // set the column with language for the tsVector\n languageColumn?: string;\n // create a tsVector index\n tsVector?: boolean;\n};\n\n// Options for the `index` method of a column.\nexport type SingleColumnIndexOptions = IndexColumnOptions & IndexOptions;\n\nexport type ColumnFromDbParams = {\n isNullable?: boolean;\n default?: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n};\n\nconst knownDefaults: Record<string, string> = {\n current_timestamp: 'now()',\n 'transaction_timestamp()': 'now()',\n};\n\nexport const simplifyColumnDefault = (value?: string) => {\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return new RawSQL(knownDefaults[lower] || value);\n }\n return;\n};\n\nexport const instantiateColumn = (\n klass: new (...args: never[]) => ColumnType,\n params: ColumnFromDbParams,\n): ColumnType => {\n const column = new (klass as unknown as new () => ColumnType)();\n\n Object.assign(column.data, {\n ...params,\n default: simplifyColumnDefault(params.default),\n });\n return column as unknown as ColumnType;\n};\n\nexport abstract class ColumnType<\n Type = unknown,\n Ops extends BaseOperators = BaseOperators,\n InputType = Type,\n OutputType = Type,\n QueryType = Type,\n> extends ColumnTypeBase<\n Type,\n Ops,\n InputType,\n OutputType,\n QueryType,\n ColumnData\n> {\n /**\n * Mark the column as a primary key.\n * This column type becomes an argument of the `.find` method.\n * So if the primary key is of `integer` type (`identity` or `serial`), `.find` will accept the number,\n * or if the primary key is of `UUID` type, `.find` will expect a string.\n *\n * Using `primaryKey` on a `uuid` column will automatically add a [gen_random_uuid](https://www.postgresql.org/docs/current/functions-uuid.html) default.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.uuid().primaryKey(),\n * }));\n * }\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n */\n primaryKey<T extends ColumnTypeBase>(this: T): PrimaryKeyColumn<T> {\n return setColumnData(\n this,\n 'isPrimaryKey',\n true,\n ) as unknown as PrimaryKeyColumn<T>;\n }\n\n /**\n * Set the foreignKey for the column.\n *\n * In `snakeCase` mode, columns of both tables are translated to a snake_case.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * otherId: t.integer().foreignKey('otherTableName', 'columnName'),\n * }));\n * });\n * ```\n *\n * In the ORM specify a function returning a table class instead of a name:\n *\n * ```ts\n * export class SomeTable extends BaseTable {\n * readonly table = 'someTable';\n * columns = this.setColumns((t) => ({\n * otherTableId: t.integer().foreignKey(() => OtherTable, 'id'),\n * }));\n * }\n *\n * export class OtherTable extends BaseTable {\n * readonly table = 'otherTable';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * }));\n * }\n * ```\n *\n * Optionally you can pass the third argument to `foreignKey` with options:\n *\n * ```ts\n * type ForeignKeyOptions = {\n * // name of the constraint\n * name?: string;\n * // see database docs for MATCH in FOREIGN KEY\n * match?: 'FULL' | 'PARTIAL' | 'SIMPLE';\n *\n * onUpdate?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * onDelete?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * };\n * ```\n *\n * ## composite foreign key\n *\n * Set foreign key from multiple columns in the current table to corresponding columns in the other table.\n *\n * The first argument is an array of columns in the current table, the second argument is another table name, the third argument is an array of columns in another table, and the fourth argument is for options.\n *\n * Options are the same as in a single-column foreign key.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.integer(),\n * name: t.string(),\n * ...t.foreignKey(\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * ),\n * }));\n * });\n * ```\n *\n * @param fn - function returning a table class\n * @param column - column in the foreign table to connect with\n * @param options - {@link ForeignKeyOptions}\n */\n foreignKey<\n T extends ColumnType,\n Table extends ForeignKeyTable,\n Column extends ColumnNameOfTable<Table>,\n >(\n this: T,\n fn: () => Table,\n column: Column,\n options?: ForeignKeyOptions,\n ): Omit<T, 'foreignKeyData'> & {\n foreignKeyData: ForeignKey<InstanceType<Table>['table'], [Column]>;\n };\n foreignKey<T extends ColumnType, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: ForeignKeyOptions,\n ): Omit<T, 'foreignKeyData'> & {\n foreignKeyData: ForeignKey<Table, [Column]>;\n };\n foreignKey(\n fnOrTable: (() => ForeignKeyTable) | string,\n column: string,\n options: ForeignKeyOptions = {},\n ) {\n const item =\n typeof fnOrTable === 'string'\n ? { table: fnOrTable, columns: [column], ...options }\n : { fn: fnOrTable, columns: [column], ...options };\n return pushColumnData(this, 'foreignKeys', item);\n }\n\n toSQL() {\n return this.dataType;\n }\n\n index<T extends ColumnType>(\n this: T,\n options: Omit<SingleColumnIndexOptions, 'column'> = {},\n ): T {\n return pushColumnData(this, 'indexes', options);\n }\n\n /**\n * `searchIndex` is designed for full text search.\n *\n * It can accept the same options as a regular `index`, but it is `USING GIN` by default, and it is concatenating columns into a `tsvector`.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.string(),\n * body: t.string(),\n * ...t.searchIndex(['title', 'body']),\n * }));\n * });\n * ```\n *\n * Produces the following index ('english' is a default language, see [full text search](/guide/text-search.html#language) for changing it):\n *\n * ```sql\n * CREATE INDEX \"table_title_body_idx\" ON \"table\" USING GIN (to_tsvector('english', concat_ws(' ', \"title\", \"body\")))\n * ```\n *\n * Also, it works well with a generated `tsvector` column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.string(),\n * body: t.string(),\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * }));\n * });\n * ```\n *\n * Produces the following index:\n *\n * ```sql\n * CREATE INDEX \"table_generatedTsVector_idx\" ON \"table\" USING GIN (\"generatedTsVector\")\n * ```\n *\n * @param options - index options\n */\n searchIndex<T extends ColumnType>(\n this: T,\n options?: Omit<SingleColumnIndexOptions, 'tsVector'>,\n ): T {\n return pushColumnData(this, 'indexes', {\n ...options,\n ...(this.dataType === 'tsvector' ? { using: 'GIN' } : { tsVector: true }),\n });\n }\n\n unique<T extends ColumnType>(\n this: T,\n options: Omit<SingleColumnIndexOptions, 'column' | 'unique'> = {},\n ): T {\n return pushColumnData(this, 'indexes', { ...options, unique: true });\n }\n\n comment<T extends ColumnType>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n validationDefault<T extends ColumnType>(this: T, value: T['inputType']): T {\n return setColumnData(this, 'validationDefault', value as unknown);\n }\n\n compression<T extends ColumnType>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends ColumnType>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends ColumnType>(this: T, cb: (q: Query) => void): T {\n return setColumnData(\n this,\n 'modifyQuery',\n cb as (q: QueryBaseCommon) => void,\n );\n }\n\n transform<T extends ColumnType, Transformed>(\n this: T,\n fn: (input: T['inputType'], ctx: ValidationContext) => Transformed,\n ): Omit<T, 'inputType'> & { inputType: Transformed } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['transform', fn]];\n return cloned as Omit<T, 'inputType'> & { inputType: Transformed };\n }\n\n to<T extends ColumnType, ToType extends ColumnType>(\n this: T,\n fn: (input: T['inputType']) => ToType['inputType'] | undefined,\n type: ToType,\n ): ToType {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['to', fn, type], ...cloned.chain];\n return cloned as ToType;\n }\n\n refine<T extends ColumnType, RefinedOutput extends T['inputType']>(\n this: T,\n check: (arg: T['inputType']) => unknown,\n params?: ErrorMessage,\n ): T & { type: RefinedOutput } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['refine', check, cloned]];\n\n if (typeof params === 'string' || params?.message) {\n cloned.data = {\n ...this.data,\n errors: {\n ...this.data.errors,\n refine: typeof params === 'string' ? params : params.message,\n },\n };\n }\n\n return cloned as T & { type: RefinedOutput };\n }\n\n superRefine<T extends ColumnType, RefinedOutput extends T['inputType']>(\n this: T,\n check: (arg: T['inputType'], ctx: ValidationContext) => unknown,\n ): T & { type: RefinedOutput } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['superRefine', check]];\n return cloned as T & { type: RefinedOutput };\n }\n\n /**\n * Define a generated column. `generated` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * two: t.integer().generated`1 + 1`,\n * }));\n * });\n * ```\n *\n * @param args - raw SQL\n */\n generated<T extends ColumnType>(this: T, ...args: StaticSQLArgs): T {\n return setColumnData(this, 'generated', raw(...args));\n }\n}\n","import { ColumnData, ColumnType, ForeignKey } from './columnType';\nimport { getConstraintKind, TableData } from './columnTypes';\nimport {\n addCode,\n Code,\n columnChainToCode,\n columnDefaultArgumentToCode,\n columnErrorMessagesToCode,\n ColumnsShapeBase,\n ColumnTypeBase,\n objectHasValues,\n quoteObjectKey,\n singleQuote,\n singleQuoteArray,\n toArray,\n RawSQLBase,\n} from 'orchid-core';\n\nconst isDefaultTimeStamp = (item: ColumnTypeBase) => {\n if (item.dataType !== 'timestamptz') return false;\n\n const def = item.data.default;\n if (!(def instanceof RawSQLBase)) return false;\n\n return typeof def._sql === 'string' && def._sql.startsWith('now()');\n};\n\nconst combineCodeElements = (input: Code): Code => {\n if (typeof input === 'string') return input;\n\n const output: Code = [];\n let i = -1;\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (typeof output[i] === 'string') {\n output[i] += item;\n } else {\n output[++i] = item;\n }\n } else {\n output[++i] = combineCodeElements(item);\n }\n }\n\n return output;\n};\n\nexport const columnsShapeToCode = (\n shape: ColumnsShapeBase,\n tableData: TableData,\n t: string,\n): Code[] => {\n const hasTimestamps =\n 'createdAt' in shape &&\n isDefaultTimeStamp(shape.createdAt) &&\n 'updatedAt' in shape &&\n isDefaultTimeStamp(shape.updatedAt);\n\n const code: Code = [];\n\n for (const key in shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n code.push(\n ...combineCodeElements([\n `${quoteObjectKey(key)}: `,\n ...toArray(shape[key].toCode(t)),\n ',',\n ]),\n );\n }\n\n if (hasTimestamps) {\n code.push(`...${t}.timestamps(),`);\n }\n\n const { primaryKey, indexes, constraints } = tableData;\n if (primaryKey) {\n code.push(primaryKeyToCode(primaryKey, t));\n }\n\n if (indexes) {\n for (const index of indexes) {\n code.push(...indexToCode(index, t));\n }\n }\n\n if (constraints) {\n for (const item of constraints) {\n code.push(...constraintToCode(item, t));\n }\n }\n\n return code;\n};\n\nexport const primaryKeyToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.options?.name;\n\n return `...${t}.primaryKey([${primaryKey.columns\n .map(singleQuote)\n .join(', ')}]${name ? `, { name: ${singleQuote(name)} }` : ''}),`;\n};\n\nexport const indexToCode = (index: TableData.Index, t: string): Code[] => {\n const code: Code[] = [];\n\n code.push(`...${t}.index(`);\n\n const columnsMultiline = index.columns.some((column) => {\n for (const key in column) {\n if (key !== 'column' && column[key as keyof typeof column] !== undefined)\n return true;\n }\n return false;\n });\n if (columnsMultiline) {\n const objects: Code[] = [];\n\n for (const column of index.columns) {\n const expr = 'column' in column ? column.column : column.expression;\n\n let hasOptions = false;\n for (const key in column) {\n if (key !== 'column' && key !== 'expression') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Code[] = [\n `${'column' in column ? 'column' : 'expression'}: ${singleQuote(\n expr,\n )},`,\n ];\n if (column.collate !== undefined) {\n props.push(`collate: ${singleQuote(column.collate)},`);\n }\n if (column.opclass !== undefined) {\n props.push(`opclass: ${singleQuote(column.opclass)},`);\n }\n if (column.order !== undefined) {\n props.push(`order: ${singleQuote(column.order)},`);\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, ']']);\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n }\n\n const hasOptions = objectHasValues(index.options);\n if (hasOptions) {\n if (columnsMultiline) {\n const columns = code[code.length - 1] as string[];\n columns[columns.length - 1] += ',';\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key in index.options) {\n const value = index.options[key as keyof typeof index.options];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n if (columnsMultiline) {\n code.push([options, '},']);\n } else {\n code.push(options);\n addCode(code, '}');\n }\n }\n\n if (columnsMultiline) {\n code.push('),');\n } else {\n addCode(code, '),');\n }\n\n return code;\n};\n\nexport const constraintToCode = (\n item: TableData.Constraint,\n t: string,\n): Code => {\n const kind = getConstraintKind(item);\n\n if (kind === 'foreignKey' && item.references) {\n return [\n `...${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name),\n '),',\n ];\n } else if (kind === 'check' && item.check) {\n return [`...${t}.check(${item.check.toCode(t)}),`];\n } else {\n return [`...${t}.constraint({`, constraintPropsToCode(t, item), '}),'];\n }\n};\n\nexport const constraintPropsToCode = (\n t: string,\n item: TableData.Constraint,\n): Code[] => {\n const props: Code[] = [];\n\n if (item.name) {\n props.push(`name: ${singleQuote(item.name)},`);\n }\n\n if (item.references) {\n props.push(\n `references: [`,\n referencesArgsToCode(item.references, false),\n '],',\n );\n }\n\n if (item.check) {\n props.push(`check: ${item.check.toCode(t)},`);\n }\n\n return props;\n};\n\nexport const referencesArgsToCode = (\n {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n }: Exclude<TableData.Constraint['references'], undefined>,\n name: string | false = options?.name || false,\n): Code[] => {\n const args: Code[] = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n args.push(\n `${\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString()\n },`,\n );\n\n args.push(`${singleQuoteArray(foreignColumns)},`);\n\n if (objectHasValues(options) || name) {\n const lines: string[] = [];\n if (name) lines.push(`name: ${singleQuote(name)},`);\n for (const key in options) {\n if (key === 'name') continue;\n const value = options[key as keyof typeof options];\n if (value) lines.push(`${key}: ${singleQuote(value)},`);\n }\n args.push('{', lines, '},');\n }\n\n return args;\n};\n\nexport const columnForeignKeysToCode = (\n foreignKeys: ForeignKey<string, string[]>[],\n): Code[] => {\n const code: Code[] = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n foreignKey: ForeignKey<string, string[]>,\n): Code[] => {\n const code: Code = [];\n\n if ('fn' in foreignKey) {\n code.push(foreignKey.fn.toString());\n } else {\n code.push(singleQuote(foreignKey.table));\n }\n addCode(code, `, ${singleQuote(foreignKey.columns[0])}`);\n\n const hasOptions =\n foreignKey.name ||\n foreignKey.match ||\n foreignKey.onUpdate ||\n foreignKey.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (foreignKey.name) arr.push(`name: ${singleQuote(foreignKey.name)},`);\n if (foreignKey.match) arr.push(`match: ${singleQuote(foreignKey.match)},`);\n if (foreignKey.onUpdate)\n arr.push(`onUpdate: ${singleQuote(foreignKey.onUpdate)},`);\n if (foreignKey.onDelete)\n arr.push(`onDelete: ${singleQuote(foreignKey.onDelete)},`);\n\n addCode(code, ', {');\n code.push(arr);\n addCode(code, '}');\n }\n\n return code;\n};\n\nexport const columnIndexesToCode = (\n indexes: Exclude<ColumnData['indexes'], undefined>,\n): Code[] => {\n const code: Code[] = [];\n for (const index of indexes) {\n addCode(code, `.${index.unique ? 'unique' : 'index'}(`);\n\n const arr: string[] = [];\n\n if (index.collate) arr.push(`collate: ${singleQuote(index.collate)},`);\n if (index.opclass) arr.push(`opclass: ${singleQuote(index.opclass)},`);\n if (index.order) arr.push(`order: ${singleQuote(index.order)},`);\n if (index.name) arr.push(`name: ${singleQuote(index.name)},`);\n if (index.using) arr.push(`using: ${singleQuote(index.using)},`);\n if (index.include)\n arr.push(\n `include: ${\n typeof index.include === 'string'\n ? singleQuote(index.include)\n : `[${index.include.map(singleQuote).join(', ')}]`\n },`,\n );\n if (index.nullsNotDistinct) arr.push(`nullsNotDistinct: true,`);\n if (index.with) arr.push(`with: ${singleQuote(index.with)},`);\n if (index.tablespace)\n arr.push(`tablespace: ${singleQuote(index.tablespace)},`);\n if (index.where) arr.push(`where: ${singleQuote(index.where)},`);\n\n if (arr.length) {\n addCode(code, '{');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnCheckToCode = (t: string, check: RawSQLBase): string => {\n return `.check(${check.toCode(t)})`;\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Code[] = [];\n\n if (dataType === 'integer') {\n code.push(`identity(`);\n } else {\n code.push(`${dataType}().identity(`);\n }\n\n const props: string[] = [];\n if (identity.always) props.push(`always: true,`);\n if (identity.incrementBy) props.push(`incrementBy: ${identity.incrementBy},`);\n if (identity.startWith) props.push(`startWith: ${identity.startWith},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache) props.push(`cache: ${identity.cache},`);\n\n if (props.length) {\n addCode(code, '{');\n code.push(props, '}');\n }\n\n addCode(code, ')');\n\n return code;\n};\n\nexport const columnCode = (\n type: ColumnType,\n t: string,\n code: Code,\n data = type.data,\n skip?: Record<'encodeFn', unknown>,\n): Code => {\n code = toArray(code);\n\n let prepend = `${t}.`;\n if (data.name) {\n prepend += `name(${singleQuote(data.name)}).`;\n }\n\n if (typeof code[0] === 'string') {\n code[0] = `${prepend}${code[0]}`;\n } else {\n code[0].unshift(prepend);\n }\n\n if (data.isPrimaryKey) addCode(code, '.primaryKey()');\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(data.foreignKeys)) {\n addCode(code, part);\n }\n }\n\n if (data.isHidden) addCode(code, '.hidden()');\n\n if (data.isNullable) addCode(code, '.nullable()');\n\n if (type.encodeFn && type.encodeFn !== skip?.encodeFn)\n addCode(code, `.encode(${type.encodeFn.toString()})`);\n\n if (type.parseFn && !('hideFromCode' in type.parseFn))\n addCode(code, `.parse(${type.parseFn.toString()})`);\n\n if (data.as) addCode(code, `.as(${data.as.toCode(t)})`);\n\n if (data.default !== undefined) {\n addCode(code, `.default(${columnDefaultArgumentToCode(t, data.default)})`);\n }\n\n if (data.indexes) {\n for (const part of columnIndexesToCode(data.indexes)) {\n addCode(code, part);\n }\n }\n\n if (data.comment) addCode(code, `.comment(${singleQuote(data.comment)})`);\n\n if (data.check) {\n addCode(code, columnCheckToCode(t, data.check));\n }\n\n if (data.errors) {\n for (const part of columnErrorMessagesToCode(data.errors)) {\n addCode(code, part);\n }\n }\n\n const { validationDefault } = data;\n if (validationDefault) {\n addCode(\n code,\n `.validationDefault(${\n typeof validationDefault === 'function'\n ? validationDefault.toString()\n : typeof validationDefault === 'string'\n ? singleQuote(validationDefault)\n : JSON.stringify(validationDefault)\n })`,\n );\n }\n\n if (data.compression)\n addCode(code, `.compression(${singleQuote(data.compression)})`);\n\n if (data.collate) addCode(code, `.collate(${singleQuote(data.collate)})`);\n\n if (data.modifyQuery)\n addCode(code, `.modifyQuery(${data.modifyQuery.toString()})`);\n\n return columnChainToCode(type.chain, t, code);\n};\n","import { SelectableOrExpression } from '../common/utils';\nimport { QueryData } from './data';\nimport { ToSQLCtx } from './toSQL';\nimport { ColumnsShapeBase, ColumnTypeBase } from 'orchid-core';\n\n/**\n * Acts as {@link simpleExistingColumnToSQL} except that the column is optional and will return quoted key if no column.\n */\nexport function simpleColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column?: ColumnTypeBase,\n quotedAs?: string,\n): string {\n return column\n ? column.data.computed\n ? column.data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${column.data.name || key}\"`\n : `\"${key}\"`;\n}\n\n// Takes a column name without dot, and the optional column object.\n// Handles computed column, uses column.data.name when set, prefixes regular column with `quotedAs`.\nexport function simpleExistingColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column: ColumnTypeBase,\n quotedAs?: string,\n): string {\n return column.data.computed\n ? column.data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${column.data.name || key}\"`;\n}\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: Pick<QueryData, 'joinedShapes' | 'joinOverrides'>,\n shape: ColumnsShapeBase,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n if (key === '*') {\n if (data.joinedShapes?.[table]) {\n return select ? `row_to_json(\"${table}\".*)` : `\"${table}\".r`;\n }\n return column;\n }\n\n const tableName = data.joinOverrides?.[table] || table;\n const quoted = `\"${table}\"`;\n\n const col =\n quoted === quotedAs ? shape[key] : data.joinedShapes?.[tableName]?.[key];\n\n if (col) {\n if (col.data.name) {\n return `\"${tableName}\".\"${col.data.name}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quoted)}`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n return simpleColumnToSQL(ctx, column, shape[column], quotedAs);\n};\n\nexport const columnToSqlWithAs = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n if (key === '*') {\n if (data.joinedShapes?.[table]) {\n return select\n ? `row_to_json(\"${table}\".*) \"${table}\"`\n : `\"${table}\".r \"${table}\"`;\n }\n return column;\n }\n\n const tableName = data.joinOverrides?.[table] || table;\n const quoted = `\"${table}\"`;\n\n const col =\n quoted === quotedAs\n ? data.shape[key]\n : data.joinedShapes?.[tableName][key];\n if (col) {\n if (col.data.name && col.data.name !== key) {\n return `\"${tableName}\".\"${col.data.name}\" \"${key}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quoted)} \"${key}\"`;\n }\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return select\n ? `row_to_json(\"${column}\".*) \"${column}\"`\n : `\"${column}\".r \"${column}\"`;\n }\n\n const col = data.shape[column];\n if (col) {\n if (col.data.name && col.data.name !== column) {\n return `${quotedAs ? `${quotedAs}.` : ''}\"${\n col.data.name\n }\" AS \"${column}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quotedAs)} \"${column}\"`;\n }\n }\n\n return `${quotedAs ? `${quotedAs}.` : ''}\"${column}\"`;\n};\n\nexport const ownColumnToSql = (\n data: QueryData,\n column: string,\n quotedAs?: string,\n) => {\n const name = data.shape[column]?.data.name;\n return `${quotedAs ? `${quotedAs}.` : ''}\"${name || column}\"${\n name && name !== column ? ` AS \"${column}\"` : ''\n }`;\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: Pick<QueryData, 'shape' | 'joinedShapes'>,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n shape: ColumnsShapeBase = data.shape,\n select?: true,\n) => {\n return typeof expr === 'string'\n ? columnToSql(ctx, data, shape, expr, quotedAs, select)\n : expr.toSQL(ctx, quotedAs);\n};\n\nexport const quoteSchemaAndTable = (\n schema: string | undefined,\n table: string,\n) => {\n return schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n","import { Query } from './query/query';\nimport { ColumnsShapeBase } from 'orchid-core';\n\nexport abstract class OrchidOrmError extends Error {\n abstract query: Query;\n}\n\n/**\n * When we search for a single record, and it is not found, it can either throw an error, or return `undefined`.\n *\n * Unlike other database libraries, `Orchid ORM` decided to throw errors by default when using methods `take`, `find`, `findBy`, `get` and the record is not found.\n * It is a [good practice](https://github.com/goldbergyoni/nodebestpractices/blob/master/sections/errorhandling/centralizedhandling.md) to catch common errors in a centralized place (see [global error handling](https://orchid-orm.netlify.app/guide/error-handling.html#global-error-handling)), and this allows for a more concise code.\n *\n * If it's more suitable to get the `undefined` value instead of throwing, use `takeOptional`, `findOptional`, `findByOptional`, `getOptional` instead.\n */\nexport class NotFoundError extends OrchidOrmError {\n constructor(public query: Query, message = 'Record is not found') {\n super(message);\n }\n}\n\nexport class OrchidOrmInternalError extends Error {\n constructor(public query: Query, message?: string) {\n super(message);\n }\n}\n\nexport type QueryErrorName =\n | 'parseComplete'\n | 'bindComplete'\n | 'closeComplete'\n | 'noData'\n | 'portalSuspended'\n | 'replicationStart'\n | 'emptyQuery'\n | 'copyDone'\n | 'copyData'\n | 'rowDescription'\n | 'parameterDescription'\n | 'parameterStatus'\n | 'backendKeyData'\n | 'notification'\n | 'readyForQuery'\n | 'commandComplete'\n | 'dataRow'\n | 'copyInResponse'\n | 'copyOutResponse'\n | 'authenticationOk'\n | 'authenticationMD5Password'\n | 'authenticationCleartextPassword'\n | 'authenticationSASL'\n | 'authenticationSASLContinue'\n | 'authenticationSASLFinal'\n | 'error'\n | 'notice';\n\nexport abstract class QueryError<\n T extends { shape: ColumnsShapeBase } = { shape: ColumnsShapeBase },\n> extends OrchidOrmInternalError {\n message!: string;\n name!: QueryErrorName;\n stack: string | undefined;\n code: string | undefined;\n detail: string | undefined;\n severity: string | undefined;\n hint: string | undefined;\n position: string | undefined;\n internalPosition: string | undefined;\n internalQuery: string | undefined;\n where: string | undefined;\n schema: string | undefined;\n table: string | undefined;\n column: string | undefined;\n dataType: string | undefined;\n constraint: string | undefined;\n file: string | undefined;\n line: string | undefined;\n routine: string | undefined;\n\n get isUnique() {\n return this.code === '23505';\n }\n\n columnsCache?: { [K in keyof T['shape']]?: true };\n get columns() {\n if (this.columnsCache) return this.columnsCache;\n\n const columns: { [K in keyof T['shape']]?: true } = {};\n\n if (this.detail) {\n const list = this.detail.match(/\\((.*)\\)=/)?.[1];\n if (list) {\n list.split(', ').forEach((item) => {\n const column = (\n item.startsWith('\"') ? item.slice(1, -1) : item\n ) as keyof T['shape'];\n\n columns[column] = true;\n });\n }\n }\n\n return (this.columnsCache = columns);\n }\n}\n\nexport class MoreThanOneRowError extends OrchidOrmInternalError {\n constructor(query: Query, message?: string) {\n super(query, message);\n }\n}\n\nexport class UnhandledTypeError extends OrchidOrmInternalError {\n constructor(public query: Query, value: never) {\n super(query, `Unhandled type: ${JSON.stringify(value)} received`);\n }\n}\n","import {\n GetStringArg,\n OnQueryBuilder,\n QueryMethods,\n WhereResult,\n} from '../queryMethods';\nimport { QueryData } from '../sql';\nimport { ColumnType } from '../columns';\nimport { AliasOrTable } from '../common/utils';\nimport { Db } from './db';\nimport { RelationsBase } from '../relations';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n ColumnShapeOutput,\n ColumnsShapeBase,\n ColumnTypeBase,\n EmptyObject,\n Expression,\n QueryCatch,\n QueryThen,\n Spread,\n StringKey,\n} from 'orchid-core';\nimport { QueryBase } from './queryBase';\n\nexport type SelectableBase = Record<\n PropertyKey,\n { as: string; column: ColumnTypeBase }\n>;\n\nexport type SelectableFromShape<\n Shape extends ColumnsShapeBase,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape as `${Table}.${StringKey<K>}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport type WithDataItem = { table: string; shape: ColumnsShapeBase };\nexport type WithDataBase = Record<never, WithDataItem>;\n\nexport type Query = QueryBase &\n QueryMethods<unknown> & {\n queryBuilder: Db;\n columnTypes: unknown;\n onQueryBuilder: typeof OnQueryBuilder;\n table?: string;\n shape: ColumnsShapeBase;\n singlePrimaryKey: string;\n primaryKeys: string[];\n inputType: Record<string, unknown>;\n q: QueryData;\n result: ColumnsShapeBase;\n selectable: SelectableBase;\n then: QueryThen<unknown>;\n catch: QueryCatch<unknown>;\n windows: EmptyObject;\n defaultSelectColumns: string[];\n relations: RelationsBase;\n withData: WithDataBase;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n };\n\nexport type SelectableOfType<T extends QueryBase, Type> = StringKey<\n {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['type'] extends Type | null\n ? K\n : never;\n }[keyof T['selectable']]\n>;\n\nexport type SelectableOrExpressionOfType<\n T extends Query,\n C extends ColumnTypeBase,\n> =\n | SelectableOfType<T, C['type']>\n | Expression<ColumnTypeBase<C['type'] | null>>;\n\nexport type QueryWithTable = Query & { table: string };\n\nexport type QueryReturnType =\n | 'all'\n | 'one'\n | 'oneOrThrow'\n | 'rows'\n | 'pluck'\n | 'value'\n | 'valueOrThrow'\n | 'rowCount'\n | 'void';\n\nexport const queryTypeWithLimitOne = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n} as Record<QueryReturnType, true | undefined>;\n\nexport const isQueryReturnsAll = (q: Query) =>\n !q.q.returnType || q.q.returnType === 'all';\n\nexport type QueryReturnsAll<T extends QueryReturnType> = (\n QueryReturnType extends T ? 'all' : T\n) extends 'all'\n ? true\n : false;\n\nexport type GetQueryResult<\n ReturnType extends QueryReturnType,\n Result extends ColumnsShapeBase,\n> = QueryReturnsAll<ReturnType> extends true\n ? ColumnShapeOutput<Result>[]\n : ReturnType extends 'one'\n ? ColumnShapeOutput<Result> | undefined\n : ReturnType extends 'oneOrThrow'\n ? ColumnShapeOutput<Result>\n : ReturnType extends 'value'\n ? Result extends { value: ColumnType }\n ? Result['value']['outputType'] | undefined\n : never\n : ReturnType extends 'valueOrThrow'\n ? Result extends { value: ColumnType }\n ? Result['value']['outputType']\n : never\n : ReturnType extends 'rows'\n ? ColumnShapeOutput<Result>[keyof Result][][]\n : ReturnType extends 'pluck'\n ? Result extends { pluck: ColumnType }\n ? Result['pluck']['outputType'][]\n : never\n : ReturnType extends 'rowCount'\n ? number\n : ReturnType extends 'void'\n ? void\n : never;\n\nexport type AddQuerySelect<\n T extends Pick<Query, 'result' | 'meta' | 'returnType'>,\n Result extends ColumnsShapeBase,\n Data = GetQueryResult<T['returnType'], Result>,\n> = T['meta']['hasSelect'] extends true\n ? MergeSelect<T, Result, Data>\n : SetSelect<T, Result, Data>;\n\ntype MergeSelect<\n T extends Pick<Query, 'result'>,\n Result extends ColumnsShapeBase,\n Data,\n Merged extends ColumnsShapeBase = {\n [K in keyof T['result']]: K extends keyof Result ? unknown : T['result'][K];\n } & Result,\n> = {\n [K in keyof T]: K extends 'result'\n ? Merged\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\ntype SetSelect<\n T extends Pick<Query, 'result' | 'meta'>,\n Result extends ColumnsShapeBase,\n Data,\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & { hasSelect: true }\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport type SetQueryReturns<\n T extends Query,\n R extends QueryReturnType,\n Data = GetQueryResult<R, T['result']>,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? R\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n// Change the query type to return multiple object records.\n// It wraps the query with `WhereResult` to allow updating and deleting all records when the `all` method is used.\nexport type SetQueryReturnsAll<T extends Query> = SetQueryReturns<\n WhereResult<T>,\n 'all'\n>;\n\nexport type SetQueryReturnsOneOptional<T extends Query> = SetQueryReturns<\n T,\n 'one'\n>;\n\nexport type SetQueryReturnsOne<T extends Query> = SetQueryReturns<\n T,\n 'oneOrThrow'\n>;\n\nexport type SetQueryReturnsRows<T extends Query> = SetQueryReturns<T, 'rows'>;\n\nexport type SetQueryReturnsPluck<\n T extends Query,\n S extends keyof T['selectable'] | Expression,\n> = SetQueryReturnsPluckColumn<\n T,\n S extends keyof T['selectable']\n ? T['selectable'][S]['column']\n : S extends Expression\n ? S['_type']\n : never\n>;\n\nexport type SetQueryReturnsPluckColumn<\n T extends Query,\n C extends ColumnTypeBase,\n> = Omit<T, 'result' | 'returnType' | 'then' | 'catch'> & {\n meta: {\n hasSelect: true;\n };\n result: { pluck: C };\n returnType: 'pluck';\n then: QueryThen<C['outputType'][]>;\n catch: QueryCatch<C['outputType'][]>;\n};\n\nexport type SetQueryReturnsValueOptional<\n T extends Query,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsValue<T, Arg, 'value'>;\n\nexport type SetQueryReturnsValue<\n T extends Query,\n Arg extends GetStringArg<T>,\n ReturnType extends 'value' | 'valueOrThrow' = 'valueOrThrow',\n Column extends ColumnTypeBase = Arg extends keyof T['selectable']\n ? T['selectable'][Arg]['column']\n : Arg extends Query\n ? Arg['result']['value']\n : never,\n> = SetQueryReturnsColumn<T, Column, ReturnType> & Column['operators'];\n\nexport type SetQueryReturnsColumnOptional<\n T extends QueryBase,\n Column extends ColumnTypeBase,\n> = SetQueryReturnsColumn<T, Column, 'value'>;\n\nexport type SetQueryReturnsColumn<\n T extends QueryBase,\n Column extends ColumnTypeBase,\n ReturnType extends 'value' | 'valueOrThrow' = 'valueOrThrow',\n Data = ReturnType extends 'value'\n ? Column['outputType'] | undefined\n : Column['outputType'],\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & { hasSelect: true }\n : K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? ReturnType\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport type SetQueryReturnsRowCount<T extends Query> = SetQueryReturns<\n T,\n 'rowCount'\n>;\n\nexport type SetQueryReturnsVoid<T extends Query> = SetQueryReturns<T, 'void'>;\n\n// Set the kind of the query, can be 'select', 'update', 'create', etc.\n// `update` method is using the kind of query to allow only 'select' as a callback return for a column.\nexport type SetQueryKind<T extends Query, Kind extends string> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : T[K];\n};\n\nexport type SetQueryTableAlias<\n T extends Pick<Query, 'selectable' | 'table' | 'meta'> & {\n shape: ColumnsShapeBase;\n },\n As extends string,\n> = {\n [K in keyof T]: K extends 'selectable'\n ? Omit<\n T['selectable'],\n `${AliasOrTable<T>}.${StringKey<keyof T['shape']>}`\n > & {\n [K in keyof T['shape'] as `${As}.${StringKey<keyof T['shape']>}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : K extends 'meta'\n ? Omit<T['meta'], 'as'> & {\n as: As;\n }\n : T[K];\n};\n\nexport type SetQueryWith<\n T extends Query,\n WithData extends Record<string, WithDataItem>,\n> = { [K in keyof T]: K extends 'withData' ? WithData : T[K] };\n\nexport type AddQueryWith<\n T extends Query,\n With extends WithDataItem,\n> = SetQueryWith<T, Spread<[T['withData'], { [K in With['table']]: With }]>>;\n","import { rawOrColumnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: QueryBase,\n distinct: Exclude<SelectQueryData['distinct'], undefined>,\n quotedAs?: string,\n) => {\n ctx.sql.push('DISTINCT');\n\n if (distinct.length) {\n const columns = distinct?.map((item) =>\n rawOrColumnToSql(ctx, table.q, item, quotedAs),\n );\n ctx.sql.push(`ON (${columns?.join(', ') || ''})`);\n }\n};\n","import { JsonItem, SelectItem } from './types';\nimport { RawSQL } from './rawSql';\nimport { Query } from '../query/query';\nimport { addValue, columnToSql, columnToSqlWithAs } from './common';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../errors';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { SelectableOrExpression } from '../common/utils';\nimport { Expression, isExpression } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nconst jsonColumnOrMethodToSql = (\n ctx: ToSQLCtx,\n table: Query,\n column: string | JsonItem,\n values: unknown[],\n quotedAs?: string,\n) => {\n return typeof column === 'string'\n ? columnToSql(ctx, table.q, table.q.shape, column, quotedAs)\n : jsonToSql(ctx, table, column, values, quotedAs);\n};\n\nexport const jsonToSql = (\n ctx: ToSQLCtx,\n table: Query,\n item: JsonItem,\n values: unknown[],\n quotedAs?: string,\n): string => {\n const json = item.__json;\n if (json[0] === 'pathQuery') {\n const [, , , column, path, options] = json;\n return `jsonb_path_query(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, ${addValue(values, path)}${\n options?.vars ? `, ${addValue(values, options.vars)}` : ''\n }${options?.silent ? ', true' : ''})`;\n } else if (json[0] === 'set') {\n const [, , , column, path, value, options] = json;\n return `jsonb_set(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, '{${path.join(', ')}}', ${addValue(values, JSON.stringify(value))}${\n options?.createIfMissing ? ', true' : ''\n })`;\n } else if (json[0] === 'insert') {\n const [, , , column, path, value, options] = json;\n return `jsonb_insert(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, '{${path.join(', ')}}', ${addValue(values, JSON.stringify(value))}${\n options?.insertAfter ? ', true' : ''\n })`;\n } else if (json[0] === 'remove') {\n const [, , , column, path] = json;\n return `${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )} #- '{${path.join(', ')}}'`;\n }\n return '';\n};\n\nexport const pushSelectSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs?: string,\n) => {\n ctx.sql.push(selectToSql(ctx, table, query, quotedAs));\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs?: string,\n): string => {\n if (query.select) {\n const list: string[] = [];\n for (const item of query.select) {\n if (typeof item === 'string') {\n list.push(selectedStringToSQL(ctx, table, query, quotedAs, item));\n } else if ('selectAs' in item) {\n const obj = item.selectAs as Record<\n string,\n SelectableOrExpression | Query\n >;\n for (const as in obj) {\n const value = obj[as];\n if (typeof value === 'object' || typeof value === 'function') {\n if (isExpression(value)) {\n list.push(`${value.toSQL(ctx, quotedAs)} AS \"${as}\"`);\n } else {\n pushSubQuerySql(ctx, value as Query, as, list, quotedAs);\n }\n } else {\n list.push(\n `${columnToSql(\n ctx,\n table.q,\n table.q.shape,\n value as string,\n quotedAs,\n true,\n )} AS \"${as}\"`,\n );\n }\n }\n } else {\n list.push(selectedObjectToSQL(ctx, table, quotedAs, item));\n }\n }\n return list.join(', ');\n }\n\n return selectAllSql(table, query, quotedAs);\n};\n\nexport const selectedStringToSQL = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs: string | undefined,\n item: string,\n) =>\n item === '*'\n ? selectAllSql(table, query, quotedAs)\n : columnToSqlWithAs(ctx, table.q, item, quotedAs, true);\n\nexport function selectedObjectToSQL(\n ctx: ToSQLCtx,\n table: Query,\n quotedAs: string | undefined,\n item: JsonItem | Expression,\n) {\n if ('__json' in item) {\n return `${jsonToSql(ctx, table, item, ctx.values, quotedAs)} \"${\n item.__json[1]\n }\"`;\n }\n\n const sql = item.toSQL(ctx, quotedAs);\n return ctx.aliasValue ? `${sql} r` : sql;\n}\n\nexport const selectAllSql = (\n table: QueryBase,\n query: Pick<SelectQueryData, 'join'>,\n quotedAs?: string,\n) => {\n return query.join?.length\n ? table.internal.columnsForSelectAll\n ?.map((item) => `${quotedAs}.${item}`)\n .join(', ') || `${quotedAs}.*`\n : table.internal.columnsForSelectAll?.join(', ') || '*';\n};\n\nconst pushSubQuerySql = (\n ctx: ToSQLCtx,\n query: Query,\n as: string,\n list: string[],\n quotedAs?: string,\n) => {\n const { returnType = 'all' } = query.q;\n\n if (query.q.joinedForSelect) {\n let sql;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n sql = `row_to_json(\"${query.q.joinedForSelect}\".*)`;\n break;\n case 'all':\n case 'pluck':\n case 'value':\n case 'valueOrThrow':\n case 'rows':\n sql = `\"${query.q.joinedForSelect}\".r`;\n break;\n case 'rowCount':\n case 'void':\n return;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n if (sql) list.push(`${coalesce(ctx, query, sql, quotedAs)} \"${as}\"`);\n return;\n }\n\n switch (returnType) {\n case 'all':\n case 'one':\n case 'oneOrThrow':\n query = query._json() as unknown as typeof query;\n break;\n case 'pluck': {\n const { select } = query.q;\n const first = select?.[0];\n if (!select || !first) {\n throw new OrchidOrmInternalError(\n query,\n `Nothing was selected for pluck`,\n );\n }\n\n const cloned = query.clone();\n cloned.q.select = [{ selectAs: { c: first } }] as SelectItem[];\n query = cloned._wrap(cloned.baseQuery.clone()) as unknown as typeof query;\n query._getOptional(new RawSQL(`COALESCE(json_agg(\"c\"), '[]')`));\n break;\n }\n case 'value':\n case 'valueOrThrow':\n case 'rows':\n case 'rowCount':\n case 'void':\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${makeSQL(query, ctx).text})`,\n quotedAs,\n )} AS \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: Query,\n sql: string,\n quotedAs?: string,\n) => {\n const { coalesceValue } = query.q;\n if (coalesceValue !== undefined) {\n const value = isExpression(coalesceValue)\n ? coalesceValue.toSQL(ctx, quotedAs)\n : addValue(ctx.values, coalesceValue);\n return `COALESCE(${sql}, ${value})`;\n }\n\n return sql;\n};\n","import { OrderItem, OrderTsQueryConfig, SortDir } from './types';\nimport { addValue, columnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { emptyObject } from 'orchid-core';\nimport { isExpression } from 'orchid-core';\n\nexport const pushOrderBySql = (\n ctx: ToSQLCtx,\n data: QueryData,\n quotedAs: string | undefined,\n order: Exclude<SelectQueryData['order'], undefined>,\n) => {\n ctx.sql.push(\n `ORDER BY ${order\n .map((item) => orderByToSql(ctx, data, item, quotedAs))\n .join(', ')}`,\n );\n};\n\nexport const orderByToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n order: OrderItem,\n quotedAs?: string,\n) => {\n if (typeof order === 'string') {\n return addOrder(ctx, data, order, quotedAs);\n }\n\n if (isExpression(order)) {\n return order.toSQL(ctx, quotedAs);\n }\n\n const sql: string[] = [];\n for (const key in order) {\n const value = order[key];\n sql.push(addOrder(ctx, data, key, quotedAs, value as SortDir));\n }\n return sql.join(', ');\n};\n\nconst addOrder = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n dir?: SortDir | OrderTsQueryConfig,\n): string => {\n if (data.sources?.[column]) {\n const search = data.sources[column];\n const order: OrderTsQueryConfig =\n dir ||\n (!search.order || search.order === true ? emptyObject : search.order);\n\n return `${order.coverDensity ? 'ts_rank_cd' : 'ts_rank'}(${\n order.weights ? `${addValue(ctx.values, `{${order.weights}}`)}, ` : ''\n }${search.vectorSQL}, \"${column}\"${\n order.normalization !== undefined\n ? `, ${addValue(ctx.values, order.normalization)}`\n : ''\n }) ${order.dir || 'DESC'}`;\n }\n\n return `${columnToSql(ctx, data, data.shape, column, quotedAs)} ${\n dir || 'ASC'\n }`;\n};\n","import { WindowDeclaration } from './types';\nimport { rawOrColumnToSql } from './common';\nimport { orderByToSql } from './orderBy';\nimport { QueryData } from './data';\nimport { Expression, isExpression } from 'orchid-core';\nimport { ToSQLCtx } from './toSQL';\n\nexport const windowToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n window: string | WindowDeclaration | Expression,\n quotedAs?: string,\n) => {\n if (typeof window === 'string') return `\"${window}\"`;\n\n if (isExpression(window)) return `(${window.toSQL(ctx, quotedAs)})`;\n\n const sql: string[] = [];\n if (window.partitionBy) {\n sql.push(\n `PARTITION BY ${\n Array.isArray(window.partitionBy)\n ? window.partitionBy\n .map((partitionBy) =>\n rawOrColumnToSql(ctx, data, partitionBy, quotedAs),\n )\n .join(', ')\n : rawOrColumnToSql(ctx, data, window.partitionBy, quotedAs)\n }`,\n );\n }\n\n if (window.order) {\n sql.push(`ORDER BY ${orderByToSql(ctx, data, window.order, quotedAs)}`);\n }\n\n return `(${sql.join(' ')})`;\n};\n","import { Query } from '../query/query';\nimport {\n SimpleJoinItem,\n WhereInItem,\n WhereItem,\n WhereJsonPathEqualsItem,\n WhereOnItem,\n WhereOnJoinItem,\n WhereSearchItem,\n} from './types';\nimport {\n addValue,\n columnToSql,\n simpleColumnToSQL,\n simpleExistingColumnToSQL,\n} from './common';\nimport { getClonedQueryData, getQueryAs } from '../common/utils';\nimport { processJoinItem } from './join';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { JoinedShapes, QueryData } from './data';\nimport { Expression, isExpression, MaybeArray, toArray } from 'orchid-core';\nimport { Operator } from '../columns/operators';\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, false);\n if (res) {\n ctx.sql.push('WHERE', res);\n }\n};\n\nexport const pushWhereToSql = (\n sql: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, not);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n): string | undefined => {\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n return ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs, not))\n .join(' OR ');\n } else if (query.and) {\n return processAnds(query.and, ctx, table, query, quotedAs, not);\n } else {\n return undefined;\n }\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n): string => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs, not);\n }\n return ands.join(' AND ');\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes' | 'language'>,\n data: WhereItem,\n quotedAs?: string,\n not?: boolean,\n) => {\n const prefix = not ? 'NOT ' : '';\n\n if (typeof data === 'function') {\n const qb = Object.create(table);\n qb.q = getClonedQueryData(query as QueryData);\n qb.q.and = qb.q.or = undefined;\n qb.q.isSubQuery = true;\n\n const res = data(qb);\n const expr = res instanceof Expression ? res : res.q.expr;\n if (!(res instanceof Expression) && res.q.expr) {\n const q =\n 'relationConfig' in res\n ? res.relationConfig.joinQuery(table, res)\n : res.clone();\n\n q.q.select = [expr as Expression];\n ands.push(`${prefix}(${makeSQL(q as Query, ctx).text})`);\n } else {\n pushWhereToSql(ands, ctx, res as Query, (res as Query).q, quotedAs, not);\n }\n\n return;\n }\n\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n const sql = whereToSql(\n ctx,\n query,\n query.q,\n query.table && `\"${query.table}\"`,\n );\n if (sql) {\n ands.push(`${prefix}(${sql})`);\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`${prefix}(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as Record<string, unknown>)[key];\n if (value === undefined) continue;\n\n if (key === 'AND') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(processAnds(arr, ctx, table, query, quotedAs, not));\n } else if (key === 'OR') {\n const arr = (value as MaybeArray<WhereItem>[]).map(toArray);\n ands.push(\n arr\n .map((and) => processAnds(and, ctx, table, query, quotedAs, not))\n .join(' OR '),\n );\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(processAnds(arr, ctx, table, query, quotedAs, !not));\n } else if (key === 'ON') {\n if (Array.isArray(value)) {\n const item = value as WhereJsonPathEqualsItem;\n const leftColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[0],\n quotedAs,\n );\n\n const leftPath = item[1];\n const rightColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[2],\n quotedAs,\n );\n\n const rightPath = item[3];\n\n ands.push(\n `${prefix}jsonb_path_query_first(${leftColumn}, ${addValue(\n ctx.values,\n leftPath,\n )}) = jsonb_path_query_first(${rightColumn}, ${addValue(\n ctx.values,\n rightPath,\n )})`,\n );\n } else {\n const item = value as WhereOnItem;\n const leftColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item.on[0],\n `\"${getJoinItemSource(item.joinFrom)}\"`,\n );\n\n const joinTo = getJoinItemSource(item.joinTo);\n const joinedShape = (query.joinedShapes as JoinedShapes)[joinTo];\n\n let op;\n let rightColumn;\n if (item.on.length === 2) {\n op = '=';\n rightColumn = columnToSql(\n ctx,\n query,\n joinedShape,\n item.on[1],\n `\"${joinTo}\"`,\n );\n } else {\n op = item.on[1];\n rightColumn = columnToSql(\n ctx,\n query,\n joinedShape,\n item.on[2],\n `\"${joinTo}\"`,\n );\n }\n\n ands.push(`${prefix}${leftColumn} ${op} ${rightColumn}`);\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, prefix, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as { args: SimpleJoinItem['args']; isSubQuery: boolean }[];\n\n for (const args of joinItems) {\n const { target, conditions } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n ands.push(\n `${prefix}EXISTS (SELECT 1 FROM ${target} WHERE ${conditions})`,\n );\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${prefix}${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (typeof value === 'object' && value && !(value instanceof Date)) {\n if (isExpression(value)) {\n ands.push(\n `${prefix}${columnToSql(\n ctx,\n query,\n query.shape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column = query.shape[key];\n let quotedColumn: string | undefined;\n if (column) {\n quotedColumn = simpleExistingColumnToSQL(ctx, key, column, quotedAs);\n } else if (!column) {\n const index = key.indexOf('.');\n if (index !== -1) {\n const table = key.slice(0, index);\n const quoted = `\"${table}\"`;\n const name = key.slice(index + 1);\n\n column = (\n quotedAs === quoted\n ? query.shape[name]\n : query.joinedShapes?.[table]?.[name]\n ) as typeof column;\n\n quotedColumn = simpleColumnToSQL(ctx, name, column, quoted);\n } else {\n quotedColumn = undefined;\n }\n\n if (!column || !quotedColumn) {\n // TODO: custom error classes\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n }\n\n if (value instanceof ctx.queryBuilder.constructor) {\n ands.push(\n `${prefix}${quotedColumn} = (${(value as Query).toSQL(ctx).text})`,\n );\n } else {\n for (const op in value) {\n const operator = column.operators[op];\n if (!operator) {\n // TODO: custom error classes\n throw new Error(`Unknown operator ${op} provided to condition`);\n }\n\n if (value[op as keyof typeof value] === undefined) continue;\n\n ands.push(\n `${prefix}${(operator as unknown as Operator<unknown>)._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n } else {\n ands.push(\n `${prefix}${columnToSql(ctx, query, query.shape, key, quotedAs)} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\n );\n }\n }\n};\n\nconst getJoinItemSource = (joinItem: WhereOnJoinItem) => {\n return typeof joinItem === 'string' ? joinItem : getQueryAs(joinItem);\n};\n\nconst pushIn = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n ands: string[],\n prefix: string,\n quotedAs: string | undefined,\n arg: {\n columns: string[];\n values: unknown[][] | Query | Expression;\n },\n) => {\n // if there are multiple columns, make `(col1, col2) IN ((1, 2), (3, 4))`,\n // otherwise, make `col IN (1, 2, 3)`\n const multiple = arg.columns.length > 1;\n\n let value: string;\n\n if (Array.isArray(arg.values)) {\n value = `${arg.values\n .map(\n multiple\n ? (arr) =>\n `(${arr.map((value) => addValue(ctx.values, value)).join(', ')})`\n : (arr) =>\n `${arr.map((value) => addValue(ctx.values, value)).join(', ')}`,\n )\n .join(', ')}`;\n\n value = `(${value})`;\n } else if (isExpression(arg.values)) {\n value = arg.values.toSQL(ctx, quotedAs);\n } else {\n const sql = makeSQL(arg.values, ctx);\n value = `(${sql.text})`;\n }\n\n const columnsSql = arg.columns\n .map((column) => columnToSql(ctx, query, query.shape, column, quotedAs))\n .join(', ');\n\n ands.push(\n `${prefix}${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`,\n );\n};\n","import { quoteSchemaAndTable, rawOrColumnToSql, columnToSql } from './common';\nimport { JoinItem, SimpleJoinItem } from './types';\nimport { Query, QueryWithTable } from '../query/query';\nimport { whereToSql } from './where';\nimport { ToSQLCtx } from './toSQL';\nimport { JoinedShapes, QueryData, SelectQueryData } from './data';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { QueryBase } from '../query/queryBase';\nimport { ColumnsShapeBase, Expression, isExpression } from 'orchid-core';\n\ntype ItemOf3Or4Length =\n | [\n _: unknown,\n leftColumn: string | Expression,\n rightColumn: string | Expression,\n ]\n | [\n _: unknown,\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n item: Pick<SimpleJoinItem, 'args' | 'isSubQuery'>,\n quotedAs: string | undefined,\n): { target: string; conditions?: string } => {\n let target: string;\n let conditions: string | undefined;\n\n const { args } = item;\n const [first] = args;\n if (typeof first === 'string') {\n if (first in table.relations) {\n const { query: toQuery, joinQuery } =\n table.relations[first].relationConfig;\n\n const jq = joinQuery(table, toQuery);\n const { q: j } = jq;\n\n const tableName = (\n typeof j.from === 'string' ? j.from : jq.table\n ) as string;\n\n target = quoteSchemaAndTable(j.schema, tableName);\n\n const as = j.as || first;\n const joinAs = `\"${as}\"`;\n if (as !== tableName) {\n target += ` AS ${joinAs}`;\n }\n\n const queryData = {\n shape: j.shape,\n joinedShapes: {\n ...query.joinedShapes,\n ...j.joinedShapes,\n [(table.q.as || table.table) as string]: table.shape,\n },\n and: j.and ? [...j.and] : [],\n or: j.or ? [...j.or] : [],\n };\n\n if (args[1]) {\n const arg = (args[1] as (q: unknown) => QueryBase)(\n new ctx.queryBuilder.onQueryBuilder(jq, j, table),\n ).q;\n\n if (arg.and) queryData.and.push(...arg.and);\n if (arg.or) queryData.or.push(...arg.or);\n }\n\n conditions = whereToSql(ctx, jq, queryData, joinAs);\n } else {\n target = `\"${first}\"`;\n const joinShape = (query.joinedShapes as JoinedShapes)[first];\n conditions = processArgs(\n args,\n ctx,\n table,\n query,\n first,\n target,\n joinShape,\n quotedAs,\n );\n }\n } else {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n target = quotedFrom || quoteSchemaAndTable(joinQuery.schema, first.table);\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const addAs = qAs && qAs !== joinAs;\n\n const joinedShape = first.shape;\n if (item.isSubQuery) {\n const subQuery = first.toSQL({\n values: ctx.values,\n });\n\n target = `(${subQuery.text}) ${qAs || joinAs}`;\n if (addAs) joinAs = qAs;\n } else {\n if (addAs) {\n joinAs = qAs;\n target += ` AS ${qAs}`;\n }\n }\n\n conditions = processArgs(\n args,\n ctx,\n table,\n query,\n first,\n joinAs,\n joinedShape,\n quotedAs,\n );\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!item.isSubQuery) {\n const whereSql = whereToSql(\n ctx,\n first,\n {\n ...joinQuery,\n joinedShapes: {\n ...query.joinedShapes,\n ...joinQuery.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.shape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (conditions) conditions += ` AND ${whereSql}`;\n else conditions = whereSql;\n }\n }\n }\n\n return { target, conditions };\n};\n\nconst processArgs = (\n args: SimpleJoinItem['args'],\n ctx: ToSQLCtx,\n table: QueryBase,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n first:\n | string\n | (QueryWithTable & {\n joinQueryAfterCallback?(fromQuery: Query, toQuery: Query): Query;\n }),\n joinAs: string,\n joinShape: ColumnsShapeBase,\n quotedAs?: string,\n) => {\n if (args.length === 2) {\n const arg = args[1];\n if (typeof arg === 'function') {\n const joinedShapes = {\n ...query.joinedShapes,\n [(table.q.as || table.table) as string]: table.shape,\n };\n\n let q: QueryBase;\n let data;\n if (typeof first === 'string') {\n const name = first;\n const query = table.q;\n const shape = query.withShapes?.[name];\n if (!shape) {\n throw new Error('Cannot get shape of `with` statement');\n }\n q = Object.create(table);\n q.q = {\n type: undefined,\n shape,\n adapter: query.adapter,\n handleResult: query.handleResult,\n returnType: 'all',\n logger: query.logger,\n } as SelectQueryData;\n data = { shape, joinedShapes };\n } else {\n q = first;\n\n if (first.joinQueryAfterCallback) {\n let base = q.baseQuery;\n if (q.q.as) {\n base = base.as(q.q.as);\n }\n\n const { q: query } = first.joinQueryAfterCallback(\n table as Query,\n base,\n );\n if (query.and) {\n pushQueryArray(q, 'and', query.and);\n }\n if (query.or) {\n pushQueryArray(q, 'or', query.or);\n }\n }\n\n data = {\n ...first.q,\n joinedShapes: { ...first.q.joinedShapes, ...joinedShapes },\n };\n }\n\n const jq = arg(new ctx.queryBuilder.onQueryBuilder(q, data, table));\n\n if (jq.q.joinedShapes !== joinedShapes) {\n jq.q.joinedShapes = {\n ...jq.q.joinedShapes,\n ...joinedShapes,\n };\n }\n\n return whereToSql(ctx, jq as Query, jq.q, joinAs);\n } else {\n return getObjectOrRawConditions(\n ctx,\n query,\n arg,\n quotedAs,\n joinAs,\n joinShape,\n );\n }\n } else if (args.length >= 3) {\n return getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf3Or4Length,\n joinShape,\n );\n }\n\n return undefined;\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n target: string,\n quotedAs: string | undefined,\n args: ItemOf3Or4Length,\n joinShape: ColumnsShapeBase,\n): string => {\n const [, leftColumn, opOrRightColumn, maybeRightColumn] = args;\n\n const op = maybeRightColumn ? opOrRightColumn : '=';\n const rightColumn = maybeRightColumn ? maybeRightColumn : opOrRightColumn;\n\n return `${rawOrColumnToSql(\n ctx,\n query,\n leftColumn,\n target,\n joinShape,\n )} ${op} ${rawOrColumnToSql(ctx, query, rightColumn, quotedAs, query.shape)}`;\n};\n\nconst getObjectOrRawConditions = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n data: Record<string, string | Expression> | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: ColumnsShapeBase,\n): string => {\n if (data === true) {\n return 'true';\n } else if (isExpression(data)) {\n return data.toSQL(ctx, quotedAs);\n } else {\n const pairs: string[] = [];\n const shape = query.shape;\n\n for (const key in data) {\n const value = data[key];\n\n pairs.push(\n `${columnToSql(\n ctx,\n query,\n joinShape,\n key,\n joinAs,\n )} = ${rawOrColumnToSql(ctx, query, value, quotedAs, shape)}`,\n );\n }\n\n return pairs.join(', ');\n }\n};\n\nexport const pushJoinSql = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n for (const item of query.join) {\n if (Array.isArray(item)) {\n const q = item[1];\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n const as = item[2];\n ctx.sql.push(\n `${item[0]} LATERAL (${q.toSQL(ctx).text}) \"${\n query.joinOverrides?.[as] || as\n }\" ON true`,\n );\n ctx.aliasValue = aliasValue;\n } else {\n const { target, conditions } = processJoinItem(\n ctx,\n table,\n query,\n item,\n quotedAs,\n );\n\n ctx.sql.push(item.type, target);\n if (conditions) ctx.sql.push('ON', conditions);\n }\n }\n};\n\nconst skipQueryKeysForSubQuery: Record<string, boolean> = {\n adapter: true,\n updateData: true,\n parsers: true,\n as: true,\n and: true,\n or: true,\n returnType: true,\n joinedShapes: true,\n returnsOne: true,\n};\n\nexport const getIsJoinSubQuery = (query: QueryData, baseQuery: QueryData) => {\n for (const key in query) {\n if (\n !skipQueryKeysForSubQuery[key] &&\n (query as Record<string, unknown>)[key] !==\n (baseQuery as Record<string, unknown>)[key]\n ) {\n return true;\n }\n }\n return false;\n};\n","import { ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { templateLiteralToSQL } from './rawSql';\nimport { Expression, TemplateLiteralArgs } from 'orchid-core';\n\nexport const pushHavingSql = (\n ctx: ToSQLCtx,\n query: SelectQueryData,\n quotedAs?: string,\n) => {\n const conditions = havingToSql(ctx, query, quotedAs);\n if (conditions?.length) ctx.sql.push('HAVING', conditions);\n};\n\nexport const havingToSql = (\n ctx: ToSQLCtx,\n query: SelectQueryData,\n quotedAs?: string,\n): string | undefined => {\n return query.having\n ?.map((it) =>\n 'raw' in it[0]\n ? templateLiteralToSQL(it as TemplateLiteralArgs, ctx, quotedAs)\n : it\n .map((item) => (item as Expression).toSQL(ctx, quotedAs))\n .join(' AND '),\n )\n .join(' AND ');\n};\n","import { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData } from './data';\nimport { isExpression } from 'orchid-core';\n\nexport const pushWithSql = (\n ctx: ToSQLCtx,\n withData: Exclude<QueryData['with'], undefined>,\n) => {\n if (!withData.length) return;\n\n ctx.sql.push(\n 'WITH',\n withData\n .map((withItem) => {\n const [name, options, query] = withItem;\n\n let inner: string;\n if (isExpression(query)) {\n inner = query.toSQL(ctx, `\"${name}\"`);\n } else {\n inner = makeSQL(query, ctx).text;\n }\n\n return `${options.recursive ? 'RECURSIVE ' : ''}\"${name}\"${\n options.columns\n ? `(${options.columns.map((x) => `\"${x}\"`).join(', ')})`\n : ''\n } AS ${\n options.materialized\n ? 'MATERIALIZED '\n : options.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`;\n })\n .join(', '),\n );\n};\n","import { Query, QueryWithTable, SelectableBase } from '../query/query';\nimport { RelationQuery } from '../relations';\nimport { SelectableOrExpression } from '../common/utils';\nimport { SelectQueryData } from './data';\nimport {\n ColumnTypeBase,\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\n// used in `from` logic to decide if convert query to sql or just write table name\nexport const checkIfASimpleQuery = (q: Query) => {\n if (\n (q.q.returnType && q.q.returnType !== 'all') ||\n q.internal.columnsForSelectAll ||\n q.q.and?.length ||\n q.q.or?.length\n )\n return false;\n\n const keys = Object.keys(q.q) as (keyof SelectQueryData)[];\n return !keys.some((key) => queryKeysOfNotSimpleQuery.includes(key));\n};\n\nconst queryKeysOfNotSimpleQuery: (keyof SelectQueryData)[] = [\n 'with',\n 'as',\n 'from',\n 'select',\n 'distinct',\n 'fromOnly',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n\nexport type WithItem = [\n as: string,\n options: WithOptions,\n query: Query | Expression,\n];\n\nexport type WithOptions = {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n};\n\nexport type JsonItem<\n As extends string = string,\n Type extends ColumnTypeBase = ColumnTypeBase,\n> = {\n __json:\n | [\n kind: 'set',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n value: unknown,\n options?: {\n createIfMissing?: boolean;\n },\n ]\n | [\n kind: 'insert',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n value: unknown,\n options?: {\n insertAfter?: boolean;\n },\n ]\n | [\n kind: 'remove',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n ]\n | [\n kind: 'pathQuery',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: string,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ];\n};\n\nexport type SelectItem = string | SelectAs | JsonItem | Expression;\n\nexport type SelectAs = {\n selectAs: Record<string, string | Query | Expression>;\n};\n\nexport type OrderTsQueryConfig =\n | true\n | {\n coverDensity?: boolean;\n weights?: number[];\n normalization?: number;\n dir?: SortDir;\n };\n\nexport type QuerySourceItem = {\n queryAs: string;\n as?: string;\n textSQL?: MaybeArray<string>;\n langSQL?: string;\n vectorSQL?: string;\n order?: OrderTsQueryConfig;\n} & (\n | {\n language?: string;\n }\n | {\n languageColumn: string;\n }\n) &\n (\n | {\n text: string | Expression;\n }\n | {\n in: MaybeArray<string> | Record<string, SearchWeight>;\n }\n | {\n vector: string;\n }\n ) &\n (\n | {\n query: string | Expression;\n }\n | {\n plainQuery: string | Expression;\n }\n | {\n phraseQuery: string | Expression;\n }\n | {\n tsQuery: string | Expression;\n }\n );\n\nexport type JoinItem = SimpleJoinItem | JoinLateralItem;\n\nexport type SimpleJoinItem = {\n type: string;\n args:\n | [relation: string]\n | [\n arg: string | QueryWithTable,\n conditions:\n | Record<string, string | Expression>\n | Expression\n | ((q: unknown) => QueryBase)\n | true,\n ]\n | [\n arg: string | QueryWithTable,\n leftColumn: string | Expression,\n rightColumn: string | Expression,\n ]\n | [\n arg: string | QueryWithTable,\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n // available only for QueryWithTable as first argument\n isSubQuery: boolean;\n};\n\nexport type JoinLateralItem = [type: string, joined: Query, as: string];\n\nexport type WhereItem =\n | (Omit<\n Record<\n string,\n unknown | Record<string, unknown | Query | Expression> | Expression\n >,\n 'NOT' | 'AND' | 'OR' | 'IN' | 'EXISTS' | 'ON' | 'ON_JSON_PATH_EQUALS'\n > & {\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<SimpleJoinItem['args']>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n })\n | ((q: unknown) => QueryBase | RelationQuery | Expression)\n | Query\n | Expression;\n\nexport type WhereInItem = {\n columns: string[];\n values: unknown[][] | Query | Expression;\n};\n\nexport type WhereJsonPathEqualsItem = [\n leftColumn: string,\n leftPath: string,\n rightColumn: string,\n rightPath: string,\n];\n\nexport type WhereOnItem = {\n joinFrom: WhereOnJoinItem;\n joinTo: WhereOnJoinItem;\n on:\n | [leftFullColumn: string, rightFullColumn: string]\n | [leftFullColumn: string, op: string, rightFullColumn: string];\n};\n\nexport type WhereOnJoinItem = { table?: string; q: { as?: string } } | string;\n\nexport type SearchWeight = 'A' | 'B' | 'C' | 'D';\n\nexport type WhereSearchItem = {\n as: string;\n vectorSQL: string;\n};\n\nexport type SortDir = 'ASC' | 'DESC' | 'ASC NULLS FIRST' | 'DESC NULLS LAST';\n\nexport type OrderItem = string | Record<string, SortDir> | Expression;\n\nexport type ColumnOperators<\n S extends SelectableBase,\n Column extends keyof S,\n> = {\n [O in keyof S[Column]['column']['operators']]?:\n | S[Column]['column']['operators'][O]['_opType'];\n};\n\nexport type HavingItem = TemplateLiteralArgs | Expression[];\n\nexport type WindowItem = Record<string, WindowDeclaration | Expression>;\n\nexport type WindowDeclaration = {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n};\n\nexport type UnionItem = Query | Expression;\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport type OnConflictItem = string | string[] | Expression;\n\nexport type OnConflictMergeUpdate =\n | string\n | string[]\n | Record<string, unknown>\n | Expression;\n","import { addValue, columnToSql, quoteSchemaAndTable } from './common';\nimport { checkIfASimpleQuery, QuerySourceItem } from './types';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\nimport { isExpression, isRawSQL, MaybeArray } from 'orchid-core';\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n table: QueryBase,\n data: SelectQueryData,\n quotedAs?: string,\n) => {\n let sql = 'FROM ';\n if (data.fromOnly) sql += 'ONLY ';\n\n const from = getFrom(ctx, table, data, quotedAs);\n sql += from;\n\n if (data.as && quotedAs && quotedAs !== from) {\n sql += ` AS ${quotedAs}`;\n }\n\n for (const as in data.sources) {\n const source = data.sources[as];\n\n const lang = getSearchLang(ctx, data, source, quotedAs);\n source.vectorSQL = getTsVector(ctx, data, lang, source, quotedAs);\n\n let fn;\n let query;\n if ('query' in source) {\n fn = 'websearch_to_tsquery';\n query = source.query;\n } else if ('plainQuery' in source) {\n fn = 'plainto_tsquery';\n query = source.plainQuery;\n } else if ('phraseQuery' in source) {\n fn = 'phraseto_tsquery';\n query = source.phraseQuery;\n } else {\n fn = 'to_tsquery';\n query = source.tsQuery;\n }\n\n let querySql;\n if (typeof query === 'string') {\n ctx.values.push(query);\n querySql = `$${ctx.values.length}`;\n } else {\n querySql = `${query.toSQL(ctx, quotedAs)}`;\n }\n\n sql += `, ${fn}(${lang}, ${querySql}) \"${as}\"`;\n }\n\n ctx.sql.push(sql);\n};\n\nconst getFrom = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: SelectQueryData,\n quotedAs?: string,\n) => {\n if (query.from) {\n const { from } = query;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n return from.toSQL(ctx, quotedAs);\n }\n\n if (!from.table) {\n const sql = makeSQL(from, ctx);\n return `(${sql.text})`;\n }\n\n // if query contains more than just schema return (SELECT ...)\n if (!checkIfASimpleQuery(from)) {\n const sql = makeSQL(from, ctx);\n return `(${sql.text})`;\n }\n\n return quoteSchemaAndTable(from.q.schema, from.table);\n }\n\n return quoteSchemaAndTable(query.schema, from);\n }\n\n return quoteSchemaAndTable(query.schema, table.table as string);\n};\n\nexport const getSearchLang = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n return (source.langSQL ??=\n 'languageColumn' in source\n ? columnToSql(ctx, data, data.shape, source.languageColumn, quotedAs)\n : isRawSQL(source.language)\n ? source.language.toSQL(ctx)\n : addValue(ctx.values, source.language || data.language || 'english'));\n};\n\nexport const getSearchText = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n forHeadline?: boolean,\n): MaybeArray<string> => {\n let sql = source.textSQL;\n if (sql) return sql;\n\n if ('in' in source) {\n if (typeof source.in === 'string') {\n sql = columnToSql(ctx, data, data.shape, source.in, quotedAs);\n } else if (Array.isArray(source.in)) {\n sql = `concat_ws(' ', ${source.in\n .map((column) => columnToSql(ctx, data, data.shape, column, quotedAs))\n .join(', ')})`;\n } else {\n sql = [];\n for (const key in source.in) {\n sql.push(columnToSql(ctx, data, data.shape, key, quotedAs));\n }\n }\n } else if ('vector' in source) {\n if (forHeadline) {\n throw new Error(\n 'Cannot use a search based on a vector column for a search headline',\n );\n }\n\n sql = columnToSql(ctx, data, data.shape, source.vector, quotedAs);\n } else {\n if (typeof source.text === 'string') {\n sql = addValue(ctx.values, source.text);\n } else {\n sql = source.text.toSQL(ctx, quotedAs);\n }\n }\n\n return (source.textSQL = sql);\n};\n\nconst getTsVector = (\n ctx: ToSQLCtx,\n data: QueryData,\n lang: string,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n const text = getSearchText(ctx, data, source, quotedAs);\n\n if ('in' in source) {\n if (typeof source.in === 'string' || Array.isArray(source.in)) {\n return `to_tsvector(${lang}, ${text})`;\n } else {\n let tsVector = '';\n let i = 0;\n for (const key in source.in) {\n tsVector =\n (tsVector ? `${tsVector} || ` : '') +\n `setweight(to_tsvector(${lang}, ${text[i++]}), ${addValue(\n ctx.values,\n source.in[key],\n )})`;\n }\n return tsVector;\n }\n } else if ('vector' in source) {\n return text as string;\n } else {\n return `to_tsvector(${lang}, ${text})`;\n }\n};\n","import { addValue, ownColumnToSql } from './common';\nimport { pushWhereStatementSql } from './where';\nimport { Query } from '../query/query';\nimport { selectToSql } from './select';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { InsertQueryData, QueryData, QueryHookSelect } from './data';\nimport { emptyArray, Expression, isExpression } from 'orchid-core';\nimport { ColumnData } from '../columns';\nimport { joinSubQuery, resolveSubQueryCallback } from '../common/utils';\nimport { Db } from '../query/db';\nimport { RawSQL } from './rawSql';\n\n// reuse array for the columns list\nconst quotedColumns: string[] = [];\n\nexport const pushInsertSql = (\n ctx: ToSQLCtx,\n q: Query,\n query: InsertQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const { columns, shape } = query;\n quotedColumns.length = columns.length;\n for (let i = 0, len = columns.length; i < len; i++) {\n quotedColumns[i] = `\"${shape[columns[i]]?.data.name || columns[i]}\"`;\n }\n\n let runtimeDefaults: (() => unknown)[] | undefined;\n if (q.internal.runtimeDefaultColumns) {\n runtimeDefaults = [];\n for (const key of q.internal.runtimeDefaultColumns) {\n if (!columns.includes(key)) {\n const column = shape[key];\n quotedColumns.push(`\"${column.data.name || key}\"`);\n runtimeDefaults.push(column.data.runtimeDefault as () => unknown);\n }\n }\n }\n\n let values = query.values;\n if (quotedColumns.length === 0) {\n const key = Object.keys(q.shape)[0];\n const column = q.shape[key];\n quotedColumns[0] = `\"${column?.data.name || key}\"`;\n\n // for `create({})` case: `{}` is transformed into `[[]]`,\n // we replace it with `[[undefined]]`, and it generates SQL `VALUES (DEFAULT)`\n if (Array.isArray(values) && Array.isArray(values[0])) {\n values = [[undefined]];\n }\n }\n\n ctx.sql.push(`INSERT INTO ${quotedAs}(${quotedColumns.join(', ')})`);\n\n const QueryClass = ctx.queryBuilder.constructor as Db;\n\n if (query.kind === 'object') {\n let sql = '';\n for (let i = 0; i < (values as unknown[][]).length; i++) {\n if (i) sql += ', ';\n sql += `(${encodeRow(\n ctx,\n q,\n QueryClass,\n (values as unknown[][])[i],\n runtimeDefaults,\n quotedAs,\n )})`;\n }\n\n ctx.sql.push(`VALUES ${sql}`);\n } else if (query.kind === 'raw') {\n if (isExpression(values)) {\n let valuesSql = values.toSQL(ctx, quotedAs);\n\n if (runtimeDefaults) {\n valuesSql += `, ${runtimeDefaults\n .map((fn) => addValue(ctx.values, fn()))\n .join(', ')}`;\n }\n\n ctx.sql.push(`VALUES (${valuesSql})`);\n } else {\n let sql;\n\n if (runtimeDefaults) {\n const { values: v } = ctx;\n sql = (values as Expression[])\n .map(\n (raw) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n `(${raw.toSQL(ctx, quotedAs)}, ${runtimeDefaults!\n .map((fn) => addValue(v, fn()))\n .join(', ')})`,\n )\n .join(', ');\n } else {\n sql = (values as Expression[])\n .map((raw) => `(${raw.toSQL(ctx, quotedAs)})`)\n .join(', ');\n }\n\n ctx.sql.push(`VALUES ${sql}`);\n }\n } else {\n const { from, values: v } = values as { from: Query; values?: unknown[][] };\n const q = from.clone();\n\n if (v) {\n pushQueryValue(\n q,\n 'select',\n new RawSQL(\n encodeRow(ctx, q, QueryClass, v[0], runtimeDefaults, quotedAs),\n ),\n );\n }\n\n ctx.sql.push(makeSQL(q, { values: ctx.values }).text);\n }\n\n if (query.onConflict) {\n ctx.sql.push('ON CONFLICT');\n\n const { expr, type } = query.onConflict;\n if (expr) {\n if (typeof expr === 'string') {\n ctx.sql.push(`(\"${shape[expr]?.data.name || expr}\")`);\n } else if (Array.isArray(expr)) {\n ctx.sql.push(\n `(${expr.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else {\n ctx.sql.push(expr.toSQL(ctx, quotedAs));\n }\n } else if (type === 'merge') {\n // TODO: optimize, unique columns could be stored in Query.internal\n // consider saving a cache of columns for this case into Query.internal\n\n const { indexes } = q.internal;\n\n const quotedUniques = columns.reduce((arr: string[], key, i) => {\n const unique =\n // check column index\n (shape[key]?.data as ColumnData).indexes?.some(\n (index) => index.unique,\n ) ||\n // check table composite indexes\n indexes?.some((index) =>\n index.columns.some(\n (item) => 'column' in item && item.column === key,\n ),\n );\n\n if (unique) arr.push(quotedColumns[i]);\n return arr;\n }, []);\n\n ctx.sql.push(`(${quotedUniques.join(', ')})`);\n }\n\n if (type === 'ignore') {\n ctx.sql.push('DO NOTHING');\n } else if (type === 'merge') {\n let set: string;\n\n const { update } = query.onConflict;\n if (update) {\n if (typeof update === 'string') {\n const name = shape[update]?.data.name || update;\n set = `\"${name}\" = excluded.\"${name}\"`;\n } else if (Array.isArray(update)) {\n set = update.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '');\n } else if (isExpression(update)) {\n set = update.toSQL(ctx, quotedAs);\n } else {\n const arr: string[] = [];\n for (const key in update) {\n arr.push(\n `\"${shape[key]?.data.name || key}\" = ${addValue(\n ctx.values,\n update[key],\n )}`,\n );\n }\n set = arr.join(', ');\n }\n } else {\n set = quotedColumns\n .map((column) => `${column} = excluded.${column}`)\n .join(', ');\n }\n\n ctx.sql.push('DO UPDATE SET', set);\n }\n }\n\n pushWhereStatementSql(ctx, q, query, quotedAs);\n return pushReturningSql(ctx, q, query, quotedAs, query.afterCreateSelect);\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n q: Query,\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n) => {\n const arr = row.map((value) => {\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q, value as (q: Query) => Query);\n }\n\n if (value && typeof value === 'object') {\n if (value instanceof Expression) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof QueryClass) {\n return `(${joinSubQuery(q, value as Query).toSQL(ctx).text})`;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(ctx.values, value);\n });\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(ctx.values, fn()));\n }\n }\n\n return arr.join(', ');\n};\n\nexport const pushReturningSql = (\n ctx: ToSQLCtx,\n q: Query,\n data: QueryData,\n quotedAs: string,\n hookSelect?: QueryHookSelect,\n keyword = 'RETURNING', // noop update can use this function for `SELECT` list\n): QueryHookSelect | undefined => {\n const { select } = data;\n if (!hookSelect?.length && !select) return hookSelect;\n\n let selected: string | undefined;\n let hookFiltered: string[] | undefined;\n if (select) {\n selected = selectToSql(ctx, q, data, quotedAs);\n if (hookSelect) {\n if (select.includes('*')) {\n hookFiltered = emptyArray;\n } else {\n hookFiltered = [];\n for (const column of hookSelect) {\n if (\n !hookFiltered.includes(column) &&\n !select?.includes(column) &&\n !select?.includes(`${quotedAs}.${column}`)\n ) {\n hookFiltered.push(column);\n }\n }\n }\n }\n } else {\n hookFiltered = [];\n for (const column of hookSelect as string[]) {\n if (!hookFiltered.includes(column)) hookFiltered.push(column);\n }\n }\n\n ctx.sql.push(keyword);\n if (hookFiltered?.length) {\n if (selected) ctx.sql.push(`${selected},`);\n ctx.sql.push(\n hookFiltered\n .map((column) => ownColumnToSql(data, column, quotedAs))\n .join(', '),\n );\n } else {\n ctx.sql.push(selected as string);\n }\n\n return hookFiltered;\n};\n","import { Query } from '../query/query';\nimport { addValue, quoteSchemaAndTable } from './common';\nimport { pushReturningSql } from './insert';\nimport { pushWhereStatementSql } from './where';\nimport { pushLimitSQL, ToSQLCtx } from './toSQL';\nimport {\n QueryHookSelect,\n SelectQueryData,\n UpdateQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from './data';\nimport { isExpression, pushOrNewArray } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { joinSubQuery } from '../common/utils';\nimport { JsonItem } from './types';\nimport { jsonToSql } from './select';\nimport { countSelect } from './rawSql';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: UpdateQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const quotedTable = quoteSchemaAndTable(query.schema, table.table as string);\n\n const set: string[] = [];\n processData(ctx, table, set, query.updateData, quotedAs);\n\n // if no values to set, make an `SELECT` query\n if (!set.length) {\n if (!query.select) {\n query.select = countSelect;\n }\n\n const hookSelect = pushReturningSql(\n ctx,\n table,\n query,\n quotedAs,\n query.afterUpdateSelect,\n 'SELECT',\n );\n\n ctx.sql.push(`FROM ${quotedTable}`);\n pushWhereStatementSql(ctx, table, query, quotedAs);\n pushLimitSQL(ctx.sql, ctx.values, query as unknown as SelectQueryData);\n\n return hookSelect;\n }\n\n ctx.sql.push(`UPDATE ${quotedTable}`);\n\n if (quotedTable !== quotedAs) {\n ctx.sql.push(`AS ${quotedAs}`);\n }\n\n ctx.sql.push('SET');\n ctx.sql.push(set.join(', '));\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n return pushReturningSql(ctx, table, query, quotedAs, query.afterUpdateSelect);\n};\n\nconst processData = (\n ctx: ToSQLCtx,\n table: Query,\n set: string[],\n data: UpdateQueryDataItem[],\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n const QueryClass = ctx.queryBuilder.constructor as Db;\n\n for (const item of data) {\n if (typeof item === 'function') {\n const result = item(data);\n if (result) append = pushOrNewArray(append, result);\n } else if (isExpression(item)) {\n set.push(item.toSQL(ctx, quotedAs));\n } else {\n const shape = table.q.shape;\n for (const key in item) {\n const value = item[key];\n if (value === undefined) continue;\n\n set.push(\n `\"${shape[key].data.name || key}\" = ${processValue(\n ctx,\n table,\n QueryClass,\n key,\n value,\n quotedAs,\n )}`,\n );\n }\n }\n }\n\n if (append) processData(ctx, table, set, append, quotedAs);\n};\n\nconst processValue = (\n ctx: ToSQLCtx,\n table: Query,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if ((value as JsonItem).__json) {\n return jsonToSql(ctx, table, value as JsonItem, ctx.values, quotedAs);\n } else if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof QueryClass) {\n return `(${joinSubQuery(table, value as Query).toSQL(ctx).text})`;\n } else if ('op' in value && 'arg' in value) {\n return `\"${table.q.shape[key].data.name || key}\" ${\n (value as { op: string }).op\n } ${addValue(ctx.values, (value as { arg: unknown }).arg)}`;\n }\n }\n\n return addValue(ctx.values, value);\n};\n","import { Query } from '../query/query';\nimport { pushWhereStatementSql } from './where';\nimport { pushReturningSql } from './insert';\nimport { processJoinItem } from './join';\nimport { ToSQLCtx } from './toSQL';\nimport { DeleteQueryData, QueryHookSelect } from './data';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: DeleteQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const from = `\"${table.table}\"`;\n ctx.sql.push(`DELETE FROM ${from}`);\n\n if (from !== quotedAs) {\n ctx.sql.push(`AS ${quotedAs}`);\n }\n\n let conditions: string | undefined;\n if (query.join?.length) {\n const items: { target: string; conditions?: string }[] = [];\n for (const item of query.join) {\n // skip join lateral: it's not supported here, and it's not clean if it's supported in DELETE by the db\n if (!Array.isArray(item)) {\n items.push(processJoinItem(ctx, table, query, item, quotedAs));\n }\n }\n\n if (items.length) {\n ctx.sql.push(`USING ${items.map((item) => item.target).join(', ')}`);\n\n conditions = items\n .map((item) => item.conditions)\n .filter(Boolean)\n .join(' AND ');\n }\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n\n if (conditions?.length) {\n if (query.and?.length || query.or?.length) {\n ctx.sql.push('AND', conditions);\n } else {\n ctx.sql.push('WHERE', conditions);\n }\n }\n\n return pushReturningSql(ctx, table, query, quotedAs, query.afterDeleteSelect);\n};\n","import { quoteSchemaAndTable } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { TruncateQueryData } from './data';\n\nexport const pushTruncateSql = (\n ctx: ToSQLCtx,\n table: string,\n query: TruncateQueryData,\n) => {\n ctx.sql.push('TRUNCATE', quoteSchemaAndTable(query.schema, table));\n\n if (query.restartIdentity) ctx.sql.push('RESTART IDENTITY');\n if (query.cascade) ctx.sql.push('CASCADE');\n};\n","import { addValue } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { ColumnInfoQueryData } from './data';\nimport { Query } from '../query/query';\n\nexport const pushColumnInfoSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: ColumnInfoQueryData,\n) => {\n ctx.sql.push(\n `SELECT * FROM information_schema.columns WHERE table_name = ${addValue(\n ctx.values,\n table.table,\n )} AND table_catalog = current_database() AND table_schema = ${\n query.schema || 'current_schema()'\n }`,\n );\n\n if (query.column) {\n ctx.sql.push(\n `AND column_name = ${addValue(\n ctx.values,\n table.q.shape[query.column]?.data.name || query.column,\n )}`,\n );\n }\n};\n","const singleQuoteRegex = /'/g;\nconst doubleQuoteRegex = /\"/g;\n\n// eslint-disable-next-line\ntype Value = any;\n\nconst quoteValue = (value: Value): string => {\n const type = typeof value;\n if (type === 'number') return String(value);\n else if (type === 'string')\n return `\"${(value as string)\n .replace(doubleQuoteRegex, '\\\\\"')\n .replace(singleQuoteRegex, \"''\")}\"`;\n else if (type === 'boolean') return value ? 'true' : 'false';\n else if (value instanceof Date) return `\"${value.toISOString()}\"`;\n else if (Array.isArray(value)) return quoteArray(value);\n else if (value === null || value === undefined) return 'NULL';\n else\n return `\"${JSON.stringify(value)\n .replace(doubleQuoteRegex, '\\\\\"')\n .replace(singleQuoteRegex, \"''\")}\"`;\n};\n\nconst quoteArray = (array: Value[]) => `'{${array.map(quoteValue).join(',')}}'`;\n\nexport const quote = (value: Value): string => {\n const type = typeof value;\n if (type === 'number') return `${value}`;\n else if (type === 'string') return quoteString(value);\n else if (type === 'boolean') return value ? 'true' : 'false';\n else if (value instanceof Date) return `'${value.toISOString()}'`;\n else if (Array.isArray(value)) return quoteArray(value);\n else if (value === null || value === undefined) return 'NULL';\n else return `'${JSON.stringify(value).replace(singleQuoteRegex, \"''\")}'`;\n};\n\nexport const quoteString = (value: string) => {\n return `'${(value as string).replace(singleQuoteRegex, \"''\")}'`;\n};\n","import { ToSQLCtx } from './toSQL';\nimport { CopyQueryData } from './data';\nimport { Query } from '../query/query';\nimport { quoteString } from '../quote';\nimport { pushWhereStatementSql } from './where';\n\nexport const pushCopySql = (\n ctx: ToSQLCtx,\n table: Query,\n query: CopyQueryData,\n quotedAs?: string,\n) => {\n const { sql } = ctx;\n const { copy } = query;\n\n const columns = copy.columns\n ? `(${copy.columns\n .map((item) => `\"${query.shape[item]?.data.name || item}\"`)\n .join(', ')})`\n : '';\n\n const target = 'from' in copy ? copy.from : copy.to;\n\n sql.push(\n `COPY \"${table.table as string}\"${columns} ${\n 'from' in copy ? 'FROM' : 'TO'\n } ${\n typeof target === 'string'\n ? quoteString(target)\n : `PROGRAM ${quoteString(target.program)}`\n }`,\n );\n\n if (Object.keys(copy).length > (copy.columns ? 2 : 1)) {\n const options: string[] = [];\n\n if (copy.format) options.push(`FORMAT ${copy.format}`);\n if (copy.freeze) options.push(`FREEZE ${copy.freeze}`);\n if (copy.delimiter)\n options.push(`DELIMITER ${quoteString(copy.delimiter)}`);\n if (copy.null) options.push(`NULL ${quoteString(copy.null)}`);\n if (copy.header) options.push(`HEADER ${copy.header}`);\n if (copy.quote) options.push(`QUOTE ${quoteString(copy.quote)}`);\n if (copy.escape) options.push(`ESCAPE ${quoteString(copy.escape)}`);\n if (copy.forceQuote)\n options.push(\n `FORCE_QUOTE ${\n copy.forceQuote === '*'\n ? '*'\n : `(${copy.forceQuote.map((x) => `\"${x}\"`).join(', ')})`\n }`,\n );\n if (copy.forceNotNull)\n options.push(\n `FORCE_NOT_NULL (${copy.forceNotNull.map((x) => `\"${x}\"`).join(', ')})`,\n );\n if (copy.forceNull)\n options.push(\n `FORCE_NULL (${copy.forceNull.map((x) => `\"${x}\"`).join(', ')})`,\n );\n if (copy.encoding) options.push(`ENCODING ${quoteString(copy.encoding)}`);\n\n sql.push(`WITH (${options.join(', ')})`);\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n};\n","import { Query, queryTypeWithLimitOne } from '../query/query';\nimport { addValue, columnToSql } from './common';\nimport { JoinItem } from './types';\nimport { pushDistinctSql } from './distinct';\nimport { pushSelectSql } from './select';\nimport { windowToSql } from './window';\nimport { pushJoinSql } from './join';\nimport { pushWhereStatementSql } from './where';\nimport { pushHavingSql } from './having';\nimport { pushWithSql } from './with';\nimport { pushFromAndAs } from './fromAndAs';\nimport { pushInsertSql } from './insert';\nimport { pushUpdateSql } from './update';\nimport { pushDeleteSql } from './delete';\nimport { pushTruncateSql } from './truncate';\nimport { pushColumnInfoSql } from './columnInfo';\nimport { pushOrderBySql } from './orderBy';\nimport { QueryData, SelectQueryData } from './data';\nimport { pushCopySql } from './copy';\nimport { isExpression, Sql } from 'orchid-core';\nimport { Db } from '../query/db';\n\nexport type ToSQLCtx = {\n queryBuilder: Db;\n sql: string[];\n values: unknown[];\n // selected value in JOIN LATERAL will have an alias to reference it from SELECT\n aliasValue?: true;\n};\n\nexport type toSQLCacheKey = typeof toSQLCacheKey;\nexport const toSQLCacheKey = Symbol('toSQLCache');\n\nexport type ToSQLOptions = {\n clearCache?: boolean;\n values?: unknown[];\n};\n\ntype ToSqlOptionsInternal = ToSQLOptions & {\n aliasValue?: true;\n};\n\nexport const toSQL = (table: Query, options?: ToSQLOptions): Sql => {\n return (\n (!options?.clearCache && table.q[toSQLCacheKey]) ||\n (table.q[toSQLCacheKey] = makeSQL(table, options))\n );\n};\n\nexport const makeSQL = (table: Query, options?: ToSqlOptionsInternal): Sql => {\n const query = table.q;\n const sql: string[] = [];\n const values = options?.values || [];\n const ctx: ToSQLCtx = {\n queryBuilder: table.queryBuilder,\n sql,\n values,\n aliasValue: options?.aliasValue,\n };\n\n if (query.with) {\n pushWithSql(ctx, query.with);\n }\n\n if (query.type) {\n if (query.type === 'truncate') {\n if (!table.table) throw new Error('Table is missing for truncate');\n\n pushTruncateSql(ctx, table.table, query);\n return { text: sql.join(' '), values };\n }\n\n if (query.type === 'columnInfo') {\n if (!table.table) throw new Error('Table is missing for truncate');\n\n pushColumnInfoSql(ctx, table, query);\n return { text: sql.join(' '), values };\n }\n\n if (!table.table) throw new Error(`Table is missing for ${query.type}`);\n\n const quotedAs = `\"${query.as || table.table}\"`;\n\n if (query.type === 'insert') {\n return {\n hookSelect: pushInsertSql(ctx, table, query, `\"${table.table}\"`),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'update') {\n return {\n hookSelect: pushUpdateSql(ctx, table, query, quotedAs),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'delete') {\n return {\n hookSelect: pushDeleteSql(ctx, table, query, quotedAs),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'copy') {\n pushCopySql(ctx, table, query, quotedAs);\n return { text: sql.join(' '), values };\n }\n }\n\n const quotedAs = (query.as || table.table) && `\"${query.as || table.table}\"`;\n\n sql.push('SELECT');\n\n if (query.distinct) {\n pushDistinctSql(ctx, table, query.distinct, quotedAs);\n }\n\n pushSelectSql(ctx, table, query, quotedAs);\n\n if (table.table || query.from) {\n pushFromAndAs(ctx, table, query, quotedAs);\n }\n\n if (query.join) {\n pushJoinSql(\n ctx,\n table,\n query as QueryData & { join: JoinItem[] },\n quotedAs,\n );\n }\n\n if (query.and || query.or) {\n pushWhereStatementSql(ctx, table, query, quotedAs);\n }\n\n if (query.group) {\n const group = query.group.map((item) =>\n isExpression(item)\n ? item.toSQL(ctx, quotedAs)\n : columnToSql(ctx, table.q, table.q.shape, item as string, quotedAs),\n );\n sql.push(`GROUP BY ${group.join(', ')}`);\n }\n\n if (query.having) pushHavingSql(ctx, query, quotedAs);\n\n if (query.window) {\n const window: string[] = [];\n query.window.forEach((item) => {\n for (const key in item) {\n window.push(\n `\"${key}\" AS ${windowToSql(ctx, query, item[key], quotedAs)}`,\n );\n }\n });\n sql.push(`WINDOW ${window.join(', ')}`);\n }\n\n if (query.union) {\n query.union.forEach((item) => {\n let itemSql: string;\n if (isExpression(item.arg)) {\n itemSql = item.arg.toSQL(ctx, quotedAs);\n } else {\n const argSql = makeSQL(item.arg, { values });\n itemSql = argSql.text;\n }\n sql.push(`${item.kind} ${item.wrap ? `(${itemSql})` : itemSql}`);\n });\n }\n\n if (query.order) {\n pushOrderBySql(ctx, query, quotedAs, query.order);\n }\n\n pushLimitSQL(sql, values, query);\n\n if (query.offset) {\n sql.push(`OFFSET ${addValue(values, query.offset)}`);\n }\n\n if (query.for) {\n sql.push('FOR', query.for.type);\n const { tableNames } = query.for;\n if (tableNames) {\n sql.push(\n 'OF',\n isExpression(tableNames)\n ? tableNames.toSQL(ctx, quotedAs)\n : tableNames.map((x) => `\"${x}\"`).join(', '),\n );\n }\n if (query.for.mode) sql.push(query.for.mode);\n }\n\n return { text: sql.join(' '), values };\n};\n\nexport function pushLimitSQL(\n sql: string[],\n values: unknown[],\n q: SelectQueryData,\n) {\n if (!q.returnsOne) {\n if (queryTypeWithLimitOne[q.returnType]) {\n sql.push(`LIMIT 1`);\n } else if (q.limit) {\n sql.push(`LIMIT ${addValue(values, q.limit)}`);\n }\n }\n}\n","import { Query, QueryReturnType } from '../query/query';\nimport { QueryLogger, QueryLogObject } from '../queryMethods';\nimport { Adapter, QueryResult } from '../adapter';\nimport { toSQLCacheKey } from './toSQL';\nimport {\n HavingItem,\n JoinItem,\n OnConflictItem,\n OnConflictMergeUpdate,\n OrderItem,\n QuerySourceItem,\n SelectItem,\n UnionItem,\n UnionKind,\n WhereItem,\n WindowItem,\n WithItem,\n} from './types';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n ColumnsShapeBase,\n ColumnTypeBase,\n MaybeArray,\n Sql,\n getValueKey,\n ColumnsParsers,\n Expression,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { BaseOperators } from '../columns/operators';\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = Record<string, ColumnsShapeBase>;\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport type JoinedParsers = Record<string, ColumnsParsers>;\n// Keep track of joined table names.\n// When joining the same table second time, this allows to add a numeric suffix to avoid name collisions.\nexport type JoinOverrides = Record<string, string>;\n\nexport type QueryBeforeHook = (query: Query) => void | Promise<void>;\nexport type QueryAfterHook<Data = unknown> = (\n data: Data,\n query: Query,\n) => void | Promise<void>;\nexport type QueryHookSelect = string[];\n\nexport type CommonQueryData = {\n adapter: Adapter;\n shape: ColumnsShapeBase;\n patchResult?(q: Query, queryResult: QueryResult): Promise<void>;\n handleResult(\n q: Query,\n returnType: QueryReturnType,\n result: QueryResult,\n isSubQuery?: true,\n ): unknown;\n returnType: QueryReturnType;\n wrapInTransaction?: boolean;\n throwOnNotFound?: boolean;\n with?: WithItem[];\n withShapes?: Record<string, ColumnsShapeBase>;\n joinTo?: QueryBase;\n joinedShapes?: JoinedShapes;\n joinedParsers?: JoinedParsers;\n joinedForSelect?: string;\n innerJoinLateral?: true;\n joinOverrides?: JoinOverrides;\n schema?: string;\n select?: SelectItem[];\n // expr when a single value is returned from the query, when using `get`, or functions.\n expr?: Expression;\n as?: string;\n from?: string | Query | Expression;\n sources?: Record<string, QuerySourceItem>;\n and?: WhereItem[];\n or?: WhereItem[][];\n coalesceValue?: unknown | Expression;\n parsers?: ColumnsParsers;\n notFoundDefault?: unknown;\n defaults?: Record<string, unknown>;\n // run functions before any query\n before?: QueryBeforeHook[];\n // run functions after any query\n after?: QueryAfterHook[];\n // run functions before create\n beforeCreate?: QueryBeforeHook[];\n // run functions after create in transaction\n afterCreate?: QueryAfterHook[];\n // run functions after create commit\n afterCreateCommit?: QueryAfterHook[];\n // additional select for afterCreate hooks\n afterCreateSelect?: QueryHookSelect;\n // run functions before update\n beforeUpdate?: QueryBeforeHook[];\n // run functions after update in transaction\n afterUpdate?: QueryAfterHook[];\n // run functions after update commit\n afterUpdateCommit?: QueryAfterHook[];\n // additional select for afterUpdate hooks\n afterUpdateSelect?: QueryHookSelect;\n // run functions before delete\n beforeDelete?: QueryBeforeHook[];\n // run functions after delete in transaction\n afterDelete?: QueryAfterHook[];\n // run functions after delete commit\n afterDeleteCommit?: QueryAfterHook[];\n // additional select for afterDelete hooks\n afterDeleteSelect?: QueryHookSelect;\n // log settings\n log?: QueryLogObject;\n // logger with `log`, `warn`, `error`\n logger: QueryLogger;\n // convert query into prepared statement automatically as an optimization\n autoPreparedStatements?: boolean;\n // cache `toSQL` output\n [toSQLCacheKey]?: Sql;\n // functions to transform query result after loading data\n transform?: ((input: unknown) => unknown)[];\n // default language for the full text search\n language?: string;\n // Is true for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `isSubQuery` is true,\n // the join will be applied after callback is resolved.\n isSubQuery?: true;\n /**\n * Stores current operator functions available for the query.\n * Is needed to remove these operators from query object when changing the query type, see {@link setQueryOperators}.\n */\n operators?: BaseOperators;\n /**\n * Used by {@link setQueryOperators} to store the original `baseQuery` before extending it with operators.\n */\n originalQuery?: Query;\n};\n\nexport type SelectQueryData = CommonQueryData & {\n type: undefined;\n distinct?: SelectableOrExpression[];\n fromOnly?: boolean;\n join?: JoinItem[];\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: { arg: UnionItem; kind: UnionKind; wrap?: boolean }[];\n order?: OrderItem[];\n returnsOne?: true;\n limit?: number;\n offset?: number;\n for?: {\n type: 'UPDATE' | 'NO KEY UPDATE' | 'SHARE' | 'KEY SHARE';\n tableNames?: string[] | Expression;\n mode?: 'NO WAIT' | 'SKIP LOCKED';\n };\n // column type for query with 'value' or 'valueOrThrow' return type\n [getValueKey]?: ColumnTypeBase;\n};\n\nexport type CreateKind = 'object' | 'raw' | 'from';\n\nexport type InsertQueryData = CommonQueryData & {\n type: 'insert';\n kind: CreateKind;\n columns: string[];\n values:\n | unknown[][]\n | MaybeArray<Expression>\n | {\n from: Query;\n values?: unknown[][];\n };\n using?: JoinItem[];\n join?: JoinItem[];\n onConflict?:\n | {\n type: 'ignore';\n expr?: OnConflictItem;\n }\n | {\n type: 'merge';\n expr?: OnConflictItem;\n update?: OnConflictMergeUpdate;\n };\n};\n\nexport type UpdateQueryDataObject = Record<\n string,\n Expression | { op: string; arg: unknown } | unknown\n>;\n\nexport type UpdatedAtDataInjector = (\n data: UpdateQueryDataItem[],\n) => UpdateQueryDataItem | void;\n\nexport type UpdateQueryDataItem =\n | UpdateQueryDataObject\n | Expression\n | UpdatedAtDataInjector;\n\nexport type UpdateQueryData = CommonQueryData & {\n type: 'update';\n updateData: UpdateQueryDataItem[];\n};\n\nexport type DeleteQueryData = CommonQueryData & {\n type: 'delete';\n join?: JoinItem[];\n};\n\nexport type TruncateQueryData = CommonQueryData & {\n type: 'truncate';\n restartIdentity?: boolean;\n cascade?: boolean;\n};\n\nexport type ColumnInfoQueryData = CommonQueryData & {\n type: 'columnInfo';\n column?: string;\n};\n\nexport type CopyQueryData = CommonQueryData & {\n type: 'copy';\n copy: CopyOptions;\n};\n\nexport type CopyOptions<Column = string> = {\n columns?: Column[];\n format?: 'text' | 'csv' | 'binary';\n freeze?: boolean;\n delimiter?: string;\n null?: string;\n header?: boolean | 'match';\n quote?: string;\n escape?: string;\n forceQuote?: Column[] | '*';\n forceNotNull?: Column[];\n forceNull?: Column[];\n encoding?: string;\n} & (\n | {\n from: string | { program: string };\n }\n | {\n to: string | { program: string };\n }\n);\n\nexport type QueryData =\n | SelectQueryData\n | InsertQueryData\n | UpdateQueryData\n | DeleteQueryData\n | TruncateQueryData\n | ColumnInfoQueryData\n | CopyQueryData;\n\nexport const cloneQueryArrays = (q: QueryData) => {\n if (q.with) q.with = q.with.slice(0);\n if (q.select) q.select = q.select.slice(0);\n if (q.and) q.and = q.and.slice(0);\n if (q.or) q.or = q.or.slice(0);\n if (q.before) q.before = q.before.slice(0);\n if (q.after) q.after = q.after.slice(0);\n if (q.joinedShapes) q.joinedShapes = { ...q.joinedShapes };\n\n // may have data for updating timestamps on any kind of query\n if ((q as UpdateQueryData).updateData) {\n (q as UpdateQueryData).updateData = (q as UpdateQueryData).updateData.slice(\n 0,\n );\n }\n\n if (q.type === undefined) {\n if (q.distinct) q.distinct = q.distinct.slice(0);\n if (q.join) q.join = q.join.slice(0);\n if (q.group) q.group = q.group.slice(0);\n if (q.having) q.having = q.having.slice(0);\n if (q.window) q.window = q.window.slice(0);\n if (q.union) q.union = q.union.slice(0);\n if (q.order) q.order = q.order.slice(0);\n } else if (q.type === 'insert') {\n q.columns = q.columns.slice(0);\n q.values = Array.isArray(q.values) ? q.values.slice(0) : q.values;\n if (q.using) q.using = q.using.slice(0);\n if (q.join) q.join = q.join.slice(0);\n if (q.beforeCreate) q.beforeCreate = q.beforeCreate.slice(0);\n if (q.afterCreate) {\n q.afterCreate = q.afterCreate.slice(0);\n if (q.afterCreateSelect) {\n q.afterCreateSelect = q.afterCreateSelect.slice(0);\n }\n }\n } else if (q.type === 'update') {\n if (q.beforeUpdate) q.beforeUpdate = q.beforeUpdate.slice(0);\n if (q.afterUpdate) {\n q.afterUpdate = q.afterUpdate.slice(0);\n if (q.afterUpdateSelect) {\n q.afterUpdateSelect = q.afterUpdateSelect.slice(0);\n }\n }\n } else if (q.type === 'delete') {\n if (q.beforeDelete) q.beforeDelete = q.beforeDelete.slice(0);\n if (q.afterDelete) {\n q.afterDelete = q.afterDelete.slice(0);\n if (q.afterDeleteSelect) {\n q.afterDeleteSelect = q.afterDeleteSelect.slice(0);\n }\n }\n }\n};\n","import { cloneQueryArrays, QueryData, toSQLCacheKey } from '../sql';\nimport type { Query } from '../query/query';\nimport type { ColumnTypeBase, StringKey } from 'orchid-core';\nimport { RelationQuery } from '../relations';\nimport { Expression } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nexport type AliasOrTable<T extends Pick<Query, 'table' | 'meta'>> =\n T['meta']['as'] extends string\n ? T['meta']['as']\n : T['table'] extends string\n ? T['table']\n : never;\n\nexport type SelectableOrExpression<\n T extends QueryBase = QueryBase,\n C extends ColumnTypeBase = ColumnTypeBase,\n> = '*' | StringKey<keyof T['selectable']> | Expression<C>;\n\nexport type ExpressionOutput<\n T extends Query,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['selectable']\n ? T['selectable'][Expr]['column']\n : Expr extends Expression<infer ColumnTypeBase>\n ? ColumnTypeBase\n : never;\n\nexport const getClonedQueryData = (query: QueryData): QueryData => {\n const cloned = { ...query };\n delete cloned[toSQLCacheKey];\n if (cloned.parsers) cloned.parsers = { ...cloned.parsers };\n cloneQueryArrays(cloned);\n return cloned as QueryData;\n};\n\nexport const getQueryAs = (q: { table?: string; q: { as?: string } }) => {\n return q.q.as || (q.table as string);\n};\n\nexport const makeRegexToFindInSql = (value: string) => {\n return new RegExp(`${value}(?=(?:[^']*'[^']*')*[^']*$)`, 'g');\n};\n\n/**\n * In `select`, `update`, `create` it's possible to pass a callback with a sub-query.\n * This function resolves such sub-query.\n *\n * @param q - main query object to pass to a callback as argument\n * @param cb - sub-query callback\n */\nexport const resolveSubQueryCallback = (\n q: Query,\n cb: (q: Query) => Query,\n): Query => {\n const { isSubQuery } = q.q;\n q.q.isSubQuery = true;\n const result = cb(q);\n q.q.isSubQuery = isSubQuery;\n return result;\n};\n\n/**\n * After getting a query from a sub-query callback,\n * join it to the main query in case it's a relation query.\n *\n * If it's not a relation query, it will be returned as is.\n *\n * @param q - main query object\n * @param sub - sub-query query object\n */\nexport const joinSubQuery = (q: Query, sub: Query): Query => {\n if (!('relationConfig' in sub)) return sub;\n\n return (sub as unknown as RelationQuery).relationConfig.joinQuery(q, sub);\n};\n","import { QueryData } from '../sql';\nimport { emptyObject, pushOrNewArrayToObject } from 'orchid-core';\nimport { OrchidOrmInternalError } from '../errors';\nimport { Query } from './query';\nimport { QueryBase } from './queryBase';\nimport { getClonedQueryData } from '../common/utils';\n\n/**\n * Push all elements of given array into the array in the query data,\n * set given array if there is no array yet in the query data.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - array with values\n */\nexport const pushQueryArray = <T extends { q: QueryData }>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n if (!q.q[key as keyof typeof q.q])\n (q.q as Record<string, unknown>)[key] = value;\n else\n (q.q[key as keyof typeof q.q] as unknown[]).push(...(value as unknown[]));\n return q as T;\n};\n\n/**\n * Push new element into array in the query data, create the array if it doesn't yet exist.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - new element to push\n */\nexport const pushQueryValue = <T extends { q: QueryData }>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObject(\n q.q as unknown as Record<string, unknown[]>,\n key,\n value,\n );\n return q;\n};\n\n/**\n * Set value into the object in query data, create the object if it doesn't yet exist.\n *\n * @param q - query\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setQueryObjectValue = <T extends { q: QueryData }>(\n q: T,\n object: string,\n key: string,\n value: unknown,\n): T => {\n if (!q.q[object as keyof typeof q.q])\n (q.q as unknown as Record<string, Record<string, unknown>>)[object] = {\n [key]: value,\n };\n else\n (q.q as unknown as Record<string, Record<string, unknown>>)[object][key] =\n value;\n return q as unknown as T;\n};\n\n/**\n * Throw runtime error when delete or update has no where conditions\n *\n * @param q - query\n * @param method - 'update' or 'delete'\n */\nexport const throwIfNoWhere = (q: Query, method: string): void => {\n if (!q.q.or && !q.q.and) {\n throw new OrchidOrmInternalError(\n q,\n `Dangerous ${method} without conditions`,\n );\n }\n};\n\n// Pick an alias for a search query to reference it later in WHERE, in ORDER BY, in headline.\n// If the alias is taken, it tries \"@q\", \"@q1\", \"@q2\" and so on.\nexport const saveSearchAlias = (\n q: QueryBase,\n as: string,\n key: 'joinedShapes' | 'withShapes',\n): string => {\n const shapes = q.q[key];\n if (shapes?.[as]) {\n let suffix = 2;\n while (shapes[(as = `${as}${suffix}`)]) {\n suffix++;\n }\n }\n\n setQueryObjectValue(q, key, as, emptyObject);\n\n return as;\n};\n\n/**\n * Extend query prototype with new methods.\n * The query and its data are cloned (with Object.create).\n *\n * @param q - query object to extend from\n * @param methods - methods to add\n */\nexport const extendQuery = <\n T extends Query,\n Methods extends Record<string, unknown>,\n>(\n q: T,\n methods: Methods,\n): T & Methods => {\n const base = Object.create(q.baseQuery);\n base.baseQuery = base;\n\n Object.assign(base, methods);\n\n const cloned = Object.create(base);\n cloned.q = getClonedQueryData(q.q);\n\n return cloned as T & Methods;\n};\n","import { Query, SetQueryReturnsColumn } from '../query/query';\nimport { ToSQLCtx } from '../sql';\nimport { addValue } from '../sql/common';\nimport {\n ColumnTypeBase,\n Expression,\n getValueKey,\n isExpression,\n OperatorToSQL,\n} from 'orchid-core';\nimport { BooleanColumn } from './boolean';\nimport { extendQuery } from '../query/queryUtils';\n\n// Operator function type.\n// Table.count().gt(10) <- here `.gt(10)` is this operator function.\n// It discards previously defined column type operators and applies new ones,\n// for a case when operator gives a different column type.\nexport type Operator<Value, Column extends ColumnTypeBase = ColumnTypeBase> = {\n <T extends Query>(this: T, arg: Value): Omit<\n SetQueryReturnsColumn<T, Column>,\n keyof T['result']['value']['operators']\n > &\n Column['operators'];\n // argument type of the function\n _opType: Value;\n // function to turn the operator expression into SQL\n _op: OperatorToSQL<Value, ToSQLCtx>;\n};\n\n// any column has 'operators' record that implements this type\nexport type BaseOperators = Record<string, Operator<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Extend query object with given operator methods, so that user can call `gt` after calling `count`.\n// If query already has the same operators, nothing is changed.\n// Previously defined operators, if any, are dropped form the query.\n// Adds new operators, saves `Query.baseQuery` into `QueryData.originalQuery`, saves operators to `QueryData.operators`.\nexport function setQueryOperators(q: Query, operators: BaseOperators) {\n if (q.q.operators) {\n if (q.q.operators === operators) return q;\n\n q.baseQuery = q.q.originalQuery as Query;\n } else {\n q.q.originalQuery = q.baseQuery;\n }\n\n q.q.operators = operators;\n return extendQuery(q, operators);\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst make = <Value = any>(\n _op: (key: string, value: Value, ctx: ToSQLCtx, quotedAs?: string) => string,\n): Operator<Value> => {\n return Object.assign(\n function (this: Query, value: Value) {\n const expr = this.q.expr as Expression;\n (expr._chain ??= []).push(_op, value);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (this.q.parsers?.[getValueKey]) {\n this.q.parsers[getValueKey] = undefined;\n }\n\n return setQueryOperators(this, boolean);\n },\n {\n _op,\n },\n ) as unknown as Operator<Value>;\n};\n\n// Handles array, expression object, query object to insert into sql.\n// Saves values to `ctx.values`.\nconst quoteValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n jsonArray?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (!jsonArray && Array.isArray(arg)) {\n return `(${arg.map((value) => addValue(ctx.values, value)).join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `(${(arg as Query).toSQL({ values: ctx.values }).text})`;\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\n// common operators that exist for any types\ntype Base<Value> = {\n equals: Operator<Value | Query | Expression, BooleanColumn>;\n not: Operator<Value | Query | Expression, BooleanColumn>;\n in: Operator<Value[] | Query | Expression, BooleanColumn>;\n notIn: Operator<Value[] | Query | Expression, BooleanColumn>;\n};\n\nconst base = {\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NULL`\n : `${key} = ${quoteValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NOT NULL`\n : `${key} <> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n in: make(\n (key, value, ctx, quotedAs) =>\n `${key} IN ${quoteValue(value, ctx, quotedAs)}`,\n ),\n notIn: make(\n (key, value, ctx, quotedAs) =>\n `NOT ${key} IN ${quoteValue(value, ctx, quotedAs)}`,\n ),\n} as Base<unknown>;\n\n// Boolean type operators\ntype Bool = Base<boolean> & {\n and: Operator<\n SetQueryReturnsColumn<Query, BooleanColumn> & BooleanColumn['operators'],\n BooleanColumn\n >;\n or: Operator<\n SetQueryReturnsColumn<Query, BooleanColumn> & BooleanColumn['operators'],\n BooleanColumn\n >;\n};\n\nconst boolean = {\n ...base,\n and: make(\n (key, value, ctx, quotedAs) =>\n `${key} AND ${value.q.expr.toSQL(ctx, quotedAs)}`,\n ),\n or: make(\n (key, value, ctx, quotedAs) =>\n `(${key}) OR (${value.q.expr.toSQL(ctx, quotedAs)})`,\n ),\n} as unknown as Bool;\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\ntype Ord<Value> = Base<Value> & {\n lt: Operator<Value | Query | Expression, BooleanColumn>;\n lte: Operator<Value | Query | Expression, BooleanColumn>;\n gt: Operator<Value | Query | Expression, BooleanColumn>;\n gte: Operator<Value | Query | Expression, BooleanColumn>;\n between: Operator<\n [Value | Query | Expression, Value | Query | Expression],\n BooleanColumn\n >;\n};\n\ntype Numeric = Ord<number>;\n\nconst numeric = {\n ...base,\n lt: make(\n (key, value, ctx, quotedAs) =>\n `${key} < ${quoteValue(value, ctx, quotedAs)}`,\n ),\n lte: make(\n (key, value, ctx, quotedAs) =>\n `${key} <= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gt: make(\n (key, value, ctx, quotedAs) =>\n `${key} > ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gte: make(\n (key, value, ctx, quotedAs) =>\n `${key} >= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n between: make<[unknown, unknown]>(\n (key, [from, to], ctx, quotedAs) =>\n `${key} BETWEEN ${quoteValue(from, ctx, quotedAs)} AND ${quoteValue(\n to,\n ctx,\n quotedAs,\n )}`,\n ),\n} as Numeric;\n\n// Text type operators\ntype Text = Base<string> & {\n contains: Operator<string | Query | Expression, BooleanColumn>;\n containsSensitive: Operator<string | Query | Expression, BooleanColumn>;\n startsWith: Operator<string | Query | Expression, BooleanColumn>;\n startsWithSensitive: Operator<string | Query | Expression, BooleanColumn>;\n endsWith: Operator<string | Query | Expression, BooleanColumn>;\n endsWithSensitive: Operator<string | Query | Expression, BooleanColumn>;\n};\n\nconst text = {\n ...base,\n contains: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n containsSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n endsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteValue(value, ctx, quotedAs)}`,\n ),\n endsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteValue(value, ctx, quotedAs)}`,\n ),\n} as Text;\n\n// JSON type operators\ntype Json = Base<unknown> & {\n jsonPath: Operator<\n [path: string, op: string, value: unknown | Query | Expression],\n BooleanColumn\n >;\n jsonSupersetOf: Operator<unknown | Query | Expression, BooleanColumn>;\n jsonSubsetOf: Operator<unknown | Query | Expression, BooleanColumn>;\n};\n\nconst json = {\n ...base,\n jsonPath: make<[string, string, unknown]>(\n (key, [path, op, value], ctx, quotedAs) =>\n `jsonb_path_query_first(${key}, '${path}') #>> '{}' ${op} ${quoteValue(\n value,\n ctx,\n quotedAs,\n true,\n )}`,\n ),\n jsonSupersetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n jsonSubsetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n} as Json;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators = {\n any: base,\n boolean,\n number: numeric,\n date: numeric,\n time: numeric,\n text,\n json,\n array: base,\n} as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any: Base<any>;\n boolean: Bool;\n number: Numeric;\n date: Ord<Date | string>;\n time: Numeric;\n text: Text;\n json: Json;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n array: Base<any>;\n};\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n numberTypeMethods,\n Code,\n Expression,\n joinTruthy,\n BaseNumberData,\n numberDataToCode,\n setColumnData,\n addCode,\n ColumnWithDefault,\n ColumnTypeBase,\n NumberTypeMethods,\n assignMethodsToClass,\n} from 'orchid-core';\nimport { columnCode, identityToCode } from './code';\nimport type { TableData } from './columnTypes';\nimport { Operators } from './operators';\n\nexport type NumberColumn = ColumnType<number, typeof Operators.number>;\n\nexport type NumberColumnData = BaseNumberData & {\n identity: TableData.Identity;\n};\n\nexport type SerialColumnData = NumberColumnData & {\n default: Expression;\n};\n\nexport interface NumberBaseColumn\n extends ColumnType<number, typeof Operators.number>,\n NumberTypeMethods {}\n\nexport abstract class NumberBaseColumn extends ColumnType<\n number,\n typeof Operators.number\n> {\n declare data: NumberColumnData;\n operators = Operators.number;\n}\n\nassignMethodsToClass(NumberBaseColumn, numberTypeMethods);\n\nexport abstract class IntegerBaseColumn extends NumberBaseColumn {\n declare data: NumberColumnData;\n constructor() {\n super();\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn extends ColumnType<\n string,\n typeof Operators.number\n> {\n operators = Operators.number;\n declare data: ColumnData;\n}\n\nexport class DecimalBaseColumn<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n> extends ColumnType<string, typeof Operators.number> {\n declare data: ColumnData & {\n numericPrecision: Precision;\n numericScale: Scale;\n };\n operators = Operators.number;\n dataType = 'decimal' as const;\n\n constructor(numericPrecision?: Precision, numericScale?: Scale) {\n super();\n this.data.numericPrecision = numericPrecision as Precision;\n this.data.numericScale = numericScale as Scale;\n }\n\n toCode(t: string): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n t,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n );\n }\n\n toSQL() {\n const { numericPrecision, numericScale } = this.data;\n\n return joinTruthy(\n this.dataType,\n numericPrecision\n ? numericScale\n ? `(${numericPrecision}, ${numericScale})`\n : `(${numericPrecision})`\n : undefined,\n );\n }\n}\n\nconst skipNumberMethods = { int: true } as const;\n\nconst intToCode = (column: ColumnType, t: string): Code => {\n let code: Code[];\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, column.dataType);\n } else {\n code = [`${column.dataType}()`];\n }\n\n addCode(code, numberDataToCode(column.data, skipNumberMethods));\n\n return columnCode(column, t, code);\n};\n\nexport type IdentityColumn<T extends ColumnTypeBase> = ColumnWithDefault<\n T,\n Expression\n>;\n\n// signed two-byte integer\nexport class SmallIntColumn extends IntegerBaseColumn {\n dataType = 'smallint' as const;\n parseItem = parseInt;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed four-byte integer\nexport class IntegerColumn extends IntegerBaseColumn {\n dataType = 'integer' as const;\n parseItem = parseInt;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed eight-byte integer\nexport class BigIntColumn extends NumberAsStringBaseColumn {\n dataType = 'bigint' as const;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n> extends DecimalBaseColumn<Precision, Scale> {}\n\n// single precision floating-point number (4 bytes)\nexport class RealColumn extends NumberBaseColumn {\n dataType = 'real' as const;\n parseItem = parseFloat;\n toCode(t: string): Code {\n return columnCode(this, t, `real()${numberDataToCode(this.data)}`);\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn extends NumberAsStringBaseColumn {\n dataType = 'double precision' as const;\n toCode(t: string): Code {\n return columnCode(this, t, `doublePrecision()`);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn extends IntegerBaseColumn {\n dataType = 'smallint' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor() {\n super();\n this.data.int = true;\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `smallSerial()${numberDataToCode(this.data, skipNumberMethods)}`,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn extends IntegerBaseColumn {\n dataType = 'integer' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor() {\n super();\n this.data.int = true;\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `serial()${numberDataToCode(this.data, skipNumberMethods)}`,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn extends NumberAsStringBaseColumn {\n dataType = 'bigint' as const;\n declare data: SerialColumnData;\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `bigSerial()`);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport { NumberBaseColumn } from './number';\nimport {\n stringTypeMethods,\n Code,\n joinTruthy,\n StringTypeData,\n stringDataToCode,\n PrimaryKeyColumn,\n TemplateLiteralArgs,\n getDefaultLanguage,\n RawSQLBase,\n assignMethodsToClass,\n ColumnTypeBase,\n StaticSQLArgs,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { RawSQL } from '../sql/rawSql';\nimport { SearchWeight } from '../sql';\nimport { Operators } from './operators';\n\nexport type StringColumn = ColumnType<string, typeof Operators.text>;\n\nexport type TextColumnData = StringTypeData;\n\ntype TextMethods = typeof stringTypeMethods;\n\nexport interface TextBaseColumn\n extends ColumnType<string, typeof Operators.text>,\n TextMethods {}\n\nexport abstract class TextBaseColumn extends ColumnType<\n string,\n typeof Operators.text\n> {\n declare data: TextColumnData;\n operators = Operators.text;\n}\n\nassignMethodsToClass(TextBaseColumn, stringTypeMethods);\n\nexport abstract class LimitedTextBaseColumn<\n Limit extends number | undefined = undefined,\n> extends TextBaseColumn {\n declare data: TextColumnData & { maxChars: Limit };\n\n constructor(limit?: Limit) {\n super();\n this.data.maxChars = limit as Limit;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.maxChars !== undefined && `(${this.data.maxChars})`,\n );\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Limit extends number | undefined = undefined,\n> extends LimitedTextBaseColumn<Limit> {\n dataType = 'varchar' as const;\n toCode(t: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data)}`,\n );\n }\n}\n\n// character(n), char(n) fixed-length, blank padded\nexport class CharColumn<\n Limit extends number | undefined = undefined,\n> extends LimitedTextBaseColumn<Limit> {\n dataType = 'char' as const;\n toCode(t: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `char(${maxChars ?? ''})${stringDataToCode(this.data)}`,\n );\n }\n}\n\nconst setTextColumnData = (\n column: { data: TextColumnData & { minArg?: number; maxArg?: number } },\n minArg?: number,\n maxArg?: number,\n) => {\n if (minArg !== undefined) {\n column.data.min = column.data.minArg = minArg;\n if (maxArg !== undefined) {\n column.data.max = column.data.maxArg = maxArg;\n }\n }\n};\n\nconst textColumnToCode = (\n column: TextBaseColumn & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n t: string,\n) => {\n const data = { ...column.data };\n let args = '';\n if (data.minArg !== undefined && data.min === data.minArg) {\n args += data.minArg;\n delete data.min;\n if (data.maxArg !== undefined && data.max === data.maxArg) {\n args += `, ${data.maxArg}`;\n delete data.max;\n }\n }\n return columnCode(\n column,\n t,\n `${column.dataType}(${args})${stringDataToCode(data)}`,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn extends TextBaseColumn {\n static instance = new TextColumn();\n\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(minArg?: number, maxArg?: number) {\n super();\n setTextColumnData(this, minArg, maxArg);\n }\n\n toCode(t: string): Code {\n return textColumnToCode(this, t);\n }\n}\n\n// To store binary strings\nexport class ByteaColumn extends ColumnType<Buffer, typeof Operators.text> {\n dataType = 'bytea' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `bytea()`);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'point' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `point()`);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'line' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `line()`);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'lseg' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `lseg()`);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'box' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `box()`);\n }\n}\n\n// path\t16+16n bytes\tClosed path (similar to polygon)\t((x1,y1),...)\n// path\t16+16n bytes\tOpen path\t[(x1,y1),...]\nexport class PathColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'path' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `path()`);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'polygon' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `polygon()`);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'circle' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `circle()`);\n }\n}\n\nexport class MoneyColumn extends NumberBaseColumn {\n dataType = 'money' as const;\n\n toCode(t: string): Code {\n return columnCode(this, t, `money()`);\n }\n\n parseFn = Object.assign(\n function (input: unknown) {\n return parseFloat((input as string).replace(/,/g, '').replace(/\\$/g, ''));\n },\n {\n hideFromCode: true,\n },\n );\n}\n\n// cidr\t7 or 19 bytes\tIPv4 and IPv6 networks\nexport class CidrColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'cidr' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `cidr()`);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'inet' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `inet()`);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'macaddr' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `macaddr()`);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column extends ColumnType<string, typeof Operators.text> {\n dataType = 'macaddr8' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `macaddr8()`);\n }\n}\n\n// Bit strings are strings of 1's and 0's.\n// They can be used to store or visualize bit masks.\n// There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.\nexport class BitColumn<Length extends number> extends ColumnType<\n string,\n typeof Operators.text\n> {\n dataType = 'bit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: Length };\n\n constructor(length: Length) {\n super();\n this.data.length = length;\n }\n\n toCode(t: string): Code {\n const { length } = this.data;\n return columnCode(this, t, `bit(${length})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Length extends number | undefined = undefined,\n> extends ColumnType<string, typeof Operators.text> {\n dataType = 'bit varying' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: Length };\n\n constructor(length?: Length) {\n super();\n this.data.length = length as Length;\n }\n\n toCode(t: string): Code {\n const { length } = this.data;\n return columnCode(this, t, `bitVarying(${length ?? ''})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | Record<string, SearchWeight>;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'tsvector' as const;\n operators = Operators.text;\n\n constructor(public defaultLanguage = getDefaultLanguage()) {\n super();\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `tsvector()`);\n }\n\n /**\n * For `tsvector` column type, it can also accept language (optional) and columns:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('post', (t) => ({\n * id: t.id(),\n * title: t.text(),\n * body: t.text(),\n * // join title and body into a single ts_vector\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * // with language:\n * spanishTsVector: t\n * .tsvector()\n * .generated('spanish', ['title', 'body'])\n * .searchIndex(),\n * }));\n * });\n * ```\n *\n * @param args\n */\n generated<T extends ColumnType>(\n this: T,\n ...args:\n | StaticSQLArgs\n | [language: string, columns: TsVectorGeneratedColumns]\n | [columns: TsVectorGeneratedColumns]\n ): T {\n const first = args[0];\n if (typeof first === 'string' || !('raw' in first)) {\n const target = typeof first === 'string' ? (args[1] as string[]) : first;\n\n let sql;\n if (Array.isArray(target)) {\n const columns =\n target.length === 1\n ? `\"${target[0]}\"`\n : target\n .map((column) => `coalesce(\"${column}\", '')`)\n .join(` || ' ' || `);\n\n sql = `to_tsvector('${\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn).defaultLanguage\n }', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '') +\n `setweight(to_tsvector(coalesce(\"${key}\", '')), '${target[key]}')`;\n }\n }\n\n const arr = [sql] as string[] & { raw: string[] };\n arr.raw = arr;\n args = [arr] as unknown as TemplateLiteralArgs;\n }\n\n return super.generated(...(args as TemplateLiteralArgs)) as unknown as T;\n }\n}\n\n// A tsquery value stores lexemes that are to be searched for\nexport class TsQueryColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'tsquery' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `tsquery()`);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSQL(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'uuid' as const;\n operators = Operators.text;\n\n primaryKey<T extends ColumnTypeBase>(\n this: T,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n PrimaryKeyColumn<T> & { data: { default: RawSQLBase } } {\n const column = super.primaryKey();\n if (!column.data.default) column.data.default = uuidDefault;\n return column as unknown as PrimaryKeyColumn<T> & {\n data: { default: RawSQLBase };\n };\n }\n\n toCode(t: string): Code {\n const { data } = this;\n return columnCode(\n this,\n t,\n `uuid()`,\n // don't output the default default\n data.default instanceof RawSQLBase && data.default._sql === uuidDefaultSQL\n ? { ...data, default: undefined }\n : data,\n );\n }\n}\n\n// xml data type can be used to store XML data\nexport class XMLColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'xml' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `xml()`);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn extends TextBaseColumn {\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(minArg?: number, maxArg?: number) {\n super();\n setTextColumnData(this, minArg, maxArg);\n }\n\n toCode(t: string): Code {\n return textColumnToCode(this, t);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n assignMethodsToClass,\n Code,\n DateColumnData,\n dateDataToCode,\n DateTypeMethods,\n dateTypeMethods,\n EncodeColumn,\n joinTruthy,\n ParseColumn,\n} from 'orchid-core';\nimport { IntegerColumn } from './number';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\n// common interface for Date and DateTime columns\nexport interface DateBaseColumn\n extends ColumnType<\n string,\n typeof Operators.date,\n string | number | Date,\n string,\n string | number | Date\n >,\n DateTypeMethods {}\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (input: string | number | Date) => {\n return typeof input === 'object' ? input : new Date(input);\n};\n\n// when generating code, don't output `encodeFn` because it is a default\nconst skipDateMethodsFromToCode = { encodeFn: dateTimeEncode };\n\n// parse a date string to number, with respect to null\nconst parseToNumber = (value: unknown) =>\n value ? Date.parse(value as string) : value;\n\n// parse a date string to date object, with respect to null\nconst parseToDate = (value: unknown) =>\n value ? new Date(value as string) : value;\n\n// common class for Date and DateTime columns\nexport abstract class DateBaseColumn extends ColumnType<\n string,\n typeof Operators.date,\n string | number | Date,\n string,\n string | number | Date\n> {\n declare data: DateColumnData;\n operators = Operators.date;\n encodeFn = dateTimeEncode;\n\n asNumber() {\n return this.parse(parseToNumber).as(\n new IntegerColumn() as never,\n ) as unknown as EncodeColumn<IntegerColumn, string | number | Date>;\n }\n\n asDate<T extends ColumnType>(this: T): ParseColumn<T, Date> {\n return this.parse(parseToDate) as ParseColumn<T, Date>;\n }\n}\n\nassignMethodsToClass(DateBaseColumn, dateTypeMethods);\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn extends DateBaseColumn {\n dataType = 'date' as const;\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `date()${dateDataToCode(this.data)}`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Precision extends number | undefined = undefined,\n> extends DateBaseColumn {\n declare data: DateColumnData & { dateTimePrecision: Precision };\n\n constructor(dateTimePrecision?: Precision) {\n super();\n this.data.dateTimePrecision = dateTimePrecision as Precision;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n );\n }\n}\n\nexport abstract class DateTimeTzBaseClass<\n Precision extends number | undefined = undefined,\n> extends DateTimeBaseClass<Precision> {\n abstract baseDataType: string;\n\n toSQL() {\n return joinTruthy(\n this.baseDataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n ' with time zone',\n );\n }\n}\n\nconst timestampToCode = <P extends number | undefined>(\n self: TimestampColumn<P> | TimestampTZColumn<P>,\n t: string,\n) => {\n const { dateTimePrecision: p } = self.data;\n return columnCode(\n self,\n t,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data)}`,\n self.data,\n skipDateMethodsFromToCode,\n );\n};\n\n// timestamp [ (p) ] [ without time zone ]\t8 bytes\tboth date and time (no time zone)\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampColumn<\n Precision extends number | undefined,\n> extends DateTimeBaseClass<Precision> {\n dataType = 'timestamp' as const;\n toCode(t: string): Code {\n return timestampToCode(this, t);\n }\n}\n\n// timestamp [ (p) ] with time zone\t8 bytes\tboth date and time, with time zone\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampTZColumn<\n Precision extends number | undefined,\n> extends DateTimeTzBaseClass<Precision> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(t: string): Code {\n return timestampToCode(this, t);\n }\n}\n\n// time [ (p) ] [ without time zone ]\t8 bytes\ttime of day (no date)\t00:00:00\t24:00:00\t1 microsecond\nexport class TimeColumn<\n Precision extends number | undefined = undefined,\n> extends DateTimeBaseClass<Precision> {\n dataType = 'time' as const;\n toCode(t: string): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n t,\n `time(${dateTimePrecision || ''})${dateDataToCode(this.data)}`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nexport type TimeInterval = {\n years?: number;\n months?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n};\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<\n Fields extends string | undefined = undefined,\n Precision extends number | undefined = undefined,\n> extends ColumnType<TimeInterval, typeof Operators.date> {\n dataType = 'interval' as const;\n declare data: ColumnData & { fields: Fields; precision: Precision };\n operators = Operators.date;\n\n constructor(fields?: Fields, precision?: Precision) {\n super();\n this.data.fields = fields as Fields;\n this.data.precision = precision as Precision;\n }\n\n toCode(t: string): Code {\n const { fields, precision } = this.data;\n return columnCode(\n this,\n t,\n `interval(${[fields && `'${fields}'`, precision && String(precision)]\n .filter((part) => part)\n .join(', ')})`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.fields && ` ${this.data.fields}`,\n this.data.precision !== undefined && ` (${this.data.precision})`,\n );\n }\n}\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code, NullableColumn } from 'orchid-core';\nimport { Operators } from './operators';\n\n// 1 byte, true or false\nexport class BooleanColumn extends ColumnType<\n boolean,\n typeof Operators.boolean\n> {\n static instance = new BooleanColumn();\n\n dataType = 'boolean' as const;\n operators = Operators.boolean;\n\n toCode(t: string): Code {\n return columnCode(this, t, 'boolean()');\n }\n\n parseItem = (input: string) => input[0] === 't';\n}\n\nexport type BooleanNullable = NullableColumn<BooleanColumn>;\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code } from 'orchid-core';\nimport { Operators } from './operators';\n\nexport class EnumColumn<\n U extends string = string,\n T extends [U, ...U[]] = [U],\n> extends ColumnType<T[number], typeof Operators.any> {\n operators = Operators.any;\n dataType = 'enum';\n\n constructor(public enumName: string, public options: T) {\n super();\n }\n\n toCode(t: string, migration?: boolean): Code {\n const options = migration\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, t, `enum('${this.enumName}'${options})`);\n }\n\n toSQL() {\n const name = this.enumName;\n const index = name.indexOf('.');\n return `\"${\n index === -1 ? name : `${name.slice(0, index)}\".\"${name.slice(index + 1)}`\n }\"`;\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\nimport {\n addCode,\n Code,\n JSONType,\n JSONTypes,\n jsonTypes,\n JSONUnknown,\n toArray,\n} from 'orchid-core';\n\n// skip adding the default `encode` function to code\nconst toCodeSkip = { encodeFn: JSON.stringify };\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<Type extends JSONType = JSONUnknown> extends ColumnType<\n Type['type'],\n typeof Operators.json\n> {\n dataType = 'jsonb' as const;\n operators = Operators.json;\n declare data: ColumnData & { schema: Type };\n\n constructor(\n schemaOrFn:\n | Type\n | ((j: JSONTypes) => Type) = new JSONUnknown() as unknown as Type,\n ) {\n super();\n\n this.data.schema =\n typeof schemaOrFn === 'function' ? schemaOrFn(jsonTypes) : schemaOrFn;\n }\n\n toCode(t: string): Code {\n const { schema } = this.data;\n\n let schemaCode;\n if (!(schema instanceof JSONUnknown)) {\n schemaCode = toArray(schema.toCode(t));\n addCode(schemaCode, ',');\n }\n\n return columnCode(\n this,\n t,\n schemaCode ? [`json((${t}) =>`, schemaCode, ')'] : [`json()`],\n this.data,\n toCodeSkip,\n );\n }\n}\n\n// Encode data of both types with JSON.stringify\nJSONColumn.prototype.encodeFn = JSON.stringify;\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'json' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `jsonText()`, this.data, toCodeSkip);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n arrayTypeMethods,\n addCode,\n Code,\n ColumnTypeBase,\n ArrayMethodsData,\n arrayDataToCode,\n assignMethodsToClass,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\nexport type ArrayData<Item extends ColumnTypeBase> = ColumnData &\n ArrayMethodsData & {\n item: Item;\n };\n\ntype ArrayMethods = typeof arrayTypeMethods;\n\nexport interface ArrayColumn<Item extends ColumnTypeBase>\n extends ColumnType<\n Item['type'][],\n typeof Operators.array,\n Item['inputType'][],\n Item['outputType'][],\n Item['queryType'][]\n >,\n ArrayMethods {}\n\nexport class ArrayColumn<Item extends ColumnTypeBase> extends ColumnType<\n Item['type'][],\n typeof Operators.array,\n Item['inputType'][],\n Item['outputType'][],\n Item['queryType'][]\n> {\n dataType = 'array' as const;\n operators = Operators.array;\n declare data: ArrayData<Item>;\n\n constructor(item: Item) {\n super();\n this.data.item = item;\n }\n\n toSQL() {\n return `${this.data.item.toSQL()}[]`;\n }\n\n toCode(this: ArrayColumn<Item>, t: string): Code {\n const code: Code[] = ['array('];\n addCode(code, this.data.item.toCode(t));\n addCode(code, `)${arrayDataToCode(this.data)}`);\n return columnCode(this, t, code);\n }\n\n parseFn = Object.assign(\n (input: unknown) => {\n const entries: unknown[] = [];\n parseArray(\n input as string,\n 0,\n (input as string).length,\n entries,\n false,\n this.data.item,\n );\n return entries;\n },\n {\n hideFromCode: true,\n },\n );\n}\n\nconst parseArray = (\n input: string,\n pos: number,\n len: number,\n entries: unknown[],\n nested: boolean,\n item: ColumnTypeBase,\n): number => {\n if (input[0] === '[') {\n while (pos < len) {\n let char = input[pos++];\n if (char === '\\\\') {\n char = input[pos++];\n }\n if (char === '=') break;\n }\n }\n\n let quote = false;\n let start = pos;\n while (pos < len) {\n let char = input[pos++];\n const escaped = char === '\\\\';\n if (escaped) {\n char = input[pos++];\n }\n\n if (char === '\"' && !escaped) {\n if (quote) {\n pushEntry(input, start, pos, entries, item);\n } else {\n start = pos;\n }\n quote = !quote;\n } else if (char === ',' && !quote) {\n if (start !== pos) {\n pushEntry(input, start, pos, entries, item);\n }\n start = pos;\n } else if (char === '{' && !quote) {\n let array: unknown[];\n let nestedItem = item;\n if (nested) {\n array = [];\n entries.push(array);\n if ('item' in item.data) {\n nestedItem = (item as ArrayColumn<ColumnType>).data\n .item as ColumnType;\n }\n } else {\n array = entries;\n }\n pos = parseArray(input, pos, len, array, true, nestedItem);\n start = pos + 1;\n } else if (char === '}' && !quote) {\n if (start !== pos) {\n pushEntry(input, start, pos, entries, item);\n }\n start = pos + 1;\n break;\n }\n }\n\n return pos;\n};\n\nassignMethodsToClass(ArrayColumn, arrayTypeMethods);\n\nconst pushEntry = (\n input: string,\n start: number,\n pos: number,\n entries: unknown[],\n item: ColumnTypeBase,\n) => {\n let entry: unknown = input.slice(start, pos - 1);\n if (entry === 'NULL') {\n entry = null;\n } else if (item.parseItem) {\n entry = item.parseItem(entry as string);\n }\n entries.push(entry);\n};\n","import { ColumnType } from './columnType';\nimport { Code, singleQuote } from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\n// for a user-defined type, or for unsupported yet type from some module\nexport class CustomTypeColumn extends ColumnType<\n unknown,\n typeof Operators.any\n> {\n operators = Operators.any;\n\n constructor(public dataType: string) {\n super();\n this.data.isOfCustomType = true;\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `type(${singleQuote(this.dataType)})`);\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn extends CustomTypeColumn {\n toCode(t: string): Code {\n return columnCode(this, t, `domain(${singleQuote(this.dataType)})`);\n }\n}\n","import {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IdentityColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CharColumn,\n CidrColumn,\n CircleColumn,\n CitextColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n MoneyColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TextColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n VarCharColumn,\n XMLColumn,\n} from './string';\nimport {\n DateColumn,\n IntervalColumn,\n TimeColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\nimport { BooleanColumn } from './boolean';\nimport { EnumColumn } from './enum';\nimport { JSONColumn, JSONTextColumn } from './json';\nimport {\n ColumnNameOfTable,\n EmptyObject,\n emptyObject,\n ForeignKeyTable,\n makeTimestampsHelpers,\n MaybeArray,\n name,\n setDefaultLanguage,\n setDefaultNowFn,\n TemplateLiteralArgs,\n toArray,\n RawSQLBase,\n JSONType,\n JSONTypes,\n JSONUnknown,\n ColumnTypesBase,\n TimestampHelpers,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { ArrayColumn } from './array';\nimport {\n ColumnType,\n DropMode,\n IndexColumnOptions,\n IndexOptions,\n ForeignKeyOptions,\n} from './columnType';\nimport { makeRegexToFindInSql } from '../common/utils';\nimport { CustomTypeColumn, DomainColumn } from './customType';\nimport { RawSQL } from '../sql/rawSql';\n\nexport type TableData = {\n primaryKey?: TableData.PrimaryKey;\n indexes?: TableData.Index[];\n constraints?: TableData.Constraint[];\n};\n\nexport namespace TableData {\n export type PrimaryKey = {\n columns: string[];\n options?: { name?: string };\n };\n\n export type Index = {\n columns: IndexColumnOptions[];\n options: IndexOptions;\n };\n\n export type Constraint = {\n name?: string;\n check?: Check;\n identity?: Identity;\n references?: References;\n dropMode?: DropMode;\n };\n\n export type Check = RawSQLBase;\n\n export type References = {\n columns: string[];\n fnOrTable: (() => ForeignKeyTable) | string;\n foreignColumns: string[];\n options?: ForeignKeyOptions;\n };\n\n export type Identity = {\n always?: boolean;\n } & Omit<SequenceOptions, 'dataType' | 'ownedBy'>;\n\n export type SequenceOptions = {\n dataType?: 'smallint' | 'integer' | 'bigint';\n incrementBy?: number;\n startWith?: number;\n min?: number;\n max?: number;\n cache?: number;\n cycle?: boolean;\n ownedBy?: string;\n };\n}\n\nexport const getConstraintKind = (\n it: TableData.Constraint,\n): 'constraint' | 'foreignKey' | 'check' => {\n let num = 0;\n for (const key in it) {\n if (\n (key === 'references' || key === 'check') &&\n it[key as keyof typeof it] !== undefined\n ) {\n num++;\n }\n }\n return num === 1 ? (it.references ? 'foreignKey' : 'check') : 'constraint';\n};\n\nexport const newTableData = (): TableData => ({});\n\nlet tableData: TableData = newTableData();\n\nexport const getTableData = () => tableData;\n\nexport const resetTableData = (data: TableData = newTableData()) => {\n tableData = data;\n};\n\nexport const getColumnTypes = <ColumnTypes, Shape extends ColumnsShapeBase>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n data: TableData = newTableData(),\n) => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n\n resetTableData(data);\n return fn(types);\n};\n\nexport type DefaultColumnTypes = TimestampHelpers & {\n name<T extends ColumnTypesBase>(this: T, name: string): T;\n\n sql<T extends ColumnTypesBase>(\n this: T,\n sql: TemplateStringsArray,\n ...values: unknown[]\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n sql: string,\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n values: Record<string, unknown>,\n sql: string,\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n values: Record<string, unknown>,\n ): (...sql: TemplateLiteralArgs) => RawSQLBase<ColumnType, T>;\n sql(\n ...args:\n | [sql: TemplateStringsArray, ...values: unknown[]]\n | [sql: string]\n | [values: Record<string, unknown>, sql?: string]\n ): ((...sql: TemplateLiteralArgs) => RawSQLBase) | RawSQLBase;\n\n smallint(): SmallIntColumn;\n integer(): IntegerColumn;\n bigint(): BigIntColumn;\n numeric<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n >(\n precision?: Precision,\n scale?: Scale,\n ): DecimalColumn<Precision, Scale>;\n decimal<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n >(\n precision?: Precision,\n scale?: Scale,\n ): DecimalColumn<Precision, Scale>;\n real(): RealColumn;\n doublePrecision(): DoublePrecisionColumn;\n identity(options?: TableData.Identity): IdentityColumn<IntegerColumn>;\n smallSerial(): IdentityColumn<SmallSerialColumn>;\n serial(): SerialColumn;\n bigSerial(): BigSerialColumn;\n money(): MoneyColumn;\n varchar<Limit extends number | undefined = undefined>(\n limit?: Limit,\n ): VarCharColumn<Limit>;\n char<Limit extends number | undefined = undefined>(\n limit?: Limit,\n ): CharColumn<Limit>;\n text(min: number, max: number): TextColumn;\n // `varchar` column with optional limit defaulting to 255.\n string<Limit extends number = 255>(limit?: Limit): VarCharColumn<Limit>;\n citext(min: number, max: number): CitextColumn;\n bytea(): ByteaColumn;\n date(): DateColumn;\n timestampNoTZ<Precision extends number>(\n precision?: Precision,\n ): TimestampColumn<Precision>;\n timestamp<Precision extends number | undefined = undefined>(\n precision?: Precision,\n ): TimestampTZColumn<Precision>;\n time<Precision extends number | undefined = undefined>(\n precision?: Precision,\n ): TimeColumn<Precision>;\n interval<\n Fields extends string | undefined = undefined,\n Precision extends number | undefined = undefined,\n >(\n fields?: Fields,\n precision?: Precision,\n ): IntervalColumn<Fields, Precision>;\n boolean(): BooleanColumn;\n enum<U extends string, T extends [U, ...U[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<U, T>;\n point(): PointColumn;\n line(): LineColumn;\n lseg(): LsegColumn;\n box(): BoxColumn;\n path(): PathColumn;\n polygon(): PolygonColumn;\n circle(): CircleColumn;\n cidr(): CidrColumn;\n inet(): InetColumn;\n macaddr(): MacAddrColumn;\n macaddr8(): MacAddr8Column;\n bit<Length extends number>(length: Length): BitColumn<Length>;\n bitVarying<Length extends number | undefined = undefined>(\n length?: Length,\n ): BitVaryingColumn<Length>;\n tsvector(): TsVectorColumn;\n tsquery(): TsQueryColumn;\n uuid(): UUIDColumn;\n xml(): XMLColumn;\n json<Type extends JSONType = JSONUnknown>(\n schemaOrFn?: Type | ((j: JSONTypes) => Type),\n ): JSONColumn<Type>;\n jsonText(): JSONTextColumn;\n array<Item extends ColumnType>(item: Item): ArrayColumn<Item>;\n type(dataType: string): CustomTypeColumn;\n domain(dataType: string): DomainColumn;\n\n primaryKey(columns: string[], options?: { name?: string }): EmptyObject;\n\n index(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n unique(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n /**\n * See {@link ColumnType.searchIndex}\n */\n searchIndex(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n constraint<\n Table extends (() => ForeignKeyTable) | string,\n Columns extends Table extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<Table>>,\n ...ColumnNameOfTable<ReturnType<Table>>[],\n ]\n : [string, ...string[]],\n >({\n name,\n references,\n check,\n dropMode,\n }: {\n name?: string;\n references?: [\n columns: string[],\n fnOrTable: Table,\n foreignColumns: Columns,\n options?: ForeignKeyOptions,\n ];\n check?: RawSQLBase;\n dropMode?: DropMode;\n }): EmptyObject;\n\n foreignKey<\n Table extends (() => ForeignKeyTable) | string,\n Columns extends Table extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<Table>>,\n ...ColumnNameOfTable<ReturnType<Table>>[],\n ]\n : [string, ...string[]],\n >(\n columns: string[],\n fnOrTable: Table,\n foreignColumns: Columns,\n options?: ForeignKeyOptions & { name?: string; dropMode?: DropMode },\n ): EmptyObject;\n\n check(check: RawSQLBase): EmptyObject;\n};\n\nexport const columnTypes: DefaultColumnTypes = {\n name,\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sql(...args: any[]): any {\n const arg = args[0];\n if (Array.isArray(arg)) {\n return new RawSQL(args as TemplateLiteralArgs);\n }\n\n if (typeof args[0] === 'string') {\n return new RawSQL(args[0]);\n }\n\n if (args[1] !== undefined) {\n return new RawSQL(args[1], arg);\n }\n\n return (...args: TemplateLiteralArgs) =>\n new RawSQL(args, arg as Record<string, unknown>);\n },\n\n smallint() {\n return new SmallIntColumn();\n },\n integer() {\n return new IntegerColumn();\n },\n bigint() {\n return new BigIntColumn();\n },\n numeric(precision, scale) {\n return new DecimalColumn(precision, scale);\n },\n decimal(precision, scale) {\n return new DecimalColumn(precision, scale);\n },\n real() {\n return new RealColumn();\n },\n doublePrecision() {\n return new DoublePrecisionColumn();\n },\n identity(options) {\n return new IntegerColumn().identity(options);\n },\n smallSerial() {\n return new SmallSerialColumn();\n },\n serial() {\n return new SerialColumn();\n },\n bigSerial() {\n return new BigSerialColumn();\n },\n money() {\n return new MoneyColumn();\n },\n varchar(limit) {\n return new VarCharColumn(limit);\n },\n char(limit) {\n return new CharColumn(limit);\n },\n text(min, max) {\n return new TextColumn(min, max);\n },\n string<Limit extends number = 255>(limit = 255 as Limit) {\n return new VarCharColumn(limit);\n },\n citext(min, max) {\n return new CitextColumn(min, max);\n },\n bytea() {\n return new ByteaColumn();\n },\n date() {\n return new DateColumn();\n },\n timestampNoTZ(precision) {\n return new TimestampColumn(precision);\n },\n timestamp(precision) {\n return new TimestampTZColumn(precision);\n },\n time(precision) {\n return new TimeColumn(precision);\n },\n interval(fields, precision) {\n return new IntervalColumn(fields, precision);\n },\n boolean() {\n return new BooleanColumn();\n },\n enum(dataType, type) {\n return new EnumColumn(dataType, type);\n },\n point() {\n return new PointColumn();\n },\n line() {\n return new LineColumn();\n },\n lseg() {\n return new LsegColumn();\n },\n box() {\n return new BoxColumn();\n },\n path() {\n return new PathColumn();\n },\n polygon() {\n return new PolygonColumn();\n },\n circle() {\n return new CircleColumn();\n },\n cidr() {\n return new CidrColumn();\n },\n inet() {\n return new InetColumn();\n },\n macaddr() {\n return new MacAddrColumn();\n },\n macaddr8() {\n return new MacAddr8Column();\n },\n bit(length) {\n return new BitColumn(length);\n },\n bitVarying(length) {\n return new BitVaryingColumn(length);\n },\n tsvector() {\n return new TsVectorColumn();\n },\n tsquery() {\n return new TsQueryColumn();\n },\n uuid() {\n return new UUIDColumn();\n },\n xml() {\n return new XMLColumn();\n },\n json(schemaOrFn) {\n return new JSONColumn(schemaOrFn);\n },\n jsonText() {\n return new JSONTextColumn();\n },\n array(item) {\n return new ArrayColumn(item);\n },\n type(dataType) {\n return new CustomTypeColumn(dataType);\n },\n domain(dataType) {\n return new DomainColumn(dataType);\n },\n\n primaryKey(columns, options) {\n tableData.primaryKey = { columns, options };\n return emptyObject;\n },\n\n index(columns, options = {}) {\n const index = {\n columns: toArray(columns).map((column) =>\n typeof column === 'string' ? { column } : column,\n ),\n options,\n };\n\n (tableData.indexes ??= []).push(index);\n return emptyObject;\n },\n\n unique(columns, options) {\n return this.index(columns, { ...options, unique: true });\n },\n\n /**\n * See {@link ColumnType.searchIndex}\n */\n searchIndex(columns, options) {\n return this.index(columns, { ...options, tsVector: true });\n },\n\n constraint({ name, references, check, dropMode }) {\n (tableData.constraints ??= []).push({\n name,\n references: references\n ? {\n columns: references[0],\n fnOrTable: references[1],\n foreignColumns: references[2],\n options: references[3],\n }\n : undefined,\n check,\n dropMode,\n });\n return emptyObject;\n },\n\n foreignKey(columns, fnOrTable, foreignColumns, options) {\n (tableData.constraints ??= []).push({\n name: options?.name,\n references: {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n },\n dropMode: options?.dropMode,\n });\n return emptyObject;\n },\n\n check(check) {\n (tableData.constraints ??= []).push({\n check,\n });\n return emptyObject;\n },\n\n ...makeTimestampsHelpers(\n makeRegexToFindInSql('\\\\bupdatedAt\\\\b\"?\\\\s*='),\n '\"updatedAt\"',\n makeRegexToFindInSql('\\\\bupdated_at\\\\b\"?\\\\s*='),\n '\"updated_at\"',\n ),\n};\n\nRawSQL.prototype.columnTypes = columnTypes;\n","import { ColumnType } from './columnType';\nimport { ColumnsShapeBase, ColumnTypeBase } from 'orchid-core';\nimport { Operators } from './operators';\n\nexport type ColumnsShape = Record<string, ColumnType>;\n\nexport abstract class ColumnsObject<\n Shape extends ColumnsShapeBase,\n> extends ColumnType<\n { [K in keyof Shape]: Shape[K]['type'] },\n typeof Operators.any,\n { [K in keyof Shape]: Shape[K]['inputType'] },\n { [K in keyof Shape]: Shape[K]['outputType'] },\n { [K in keyof Shape]: Shape[K]['queryType'] }\n> {\n dataType = 'object' as const;\n operators = Operators.any;\n\n constructor(public shape: Shape) {\n super();\n }\n}\n\nexport abstract class ArrayOfColumnsObjects<\n Shape extends ColumnsShapeBase,\n> extends ColumnType<\n { [K in keyof Shape]: Shape[K]['type'] }[],\n typeof Operators.any,\n { [K in keyof Shape]: Shape[K]['inputType'] }[],\n { [K in keyof Shape]: Shape[K]['outputType'] }[],\n { [K in keyof Shape]: Shape[K]['queryType'] }[]\n> {\n dataType = 'array' as const;\n operators = Operators.any;\n\n constructor(public shape: Shape) {\n super();\n }\n}\n\nexport abstract class PluckResultColumnType<\n C extends ColumnTypeBase,\n> extends ColumnTypeBase<\n C['type'][],\n typeof Operators.any,\n C['inputType'][],\n C['outputType'][],\n C['queryType'][]\n> {}\n","import { ColumnType } from './columnType';\nimport { Query } from '../query/query';\nimport { CreateCtx, UpdateCtx } from '../queryMethods';\nimport { Operators } from './operators';\n\nexport abstract class VirtualColumn extends ColumnType<\n unknown,\n typeof Operators.any\n> {\n dataType = '';\n operators = Operators.any;\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ): void;\n\n update?(q: Query, ctx: UpdateCtx, set: Record<string, unknown>): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { RawSQL } from '../sql/rawSql';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn extends VirtualColumn {\n static instance = new UnknownColumn();\n}\n\nRawSQL.prototype._type = UnknownColumn.instance;\n","import { ColumnType } from './columnType';\nimport { BooleanColumn } from './boolean';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CharColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n MoneyColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TextColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n VarCharColumn,\n XMLColumn,\n} from './string';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport { JSONColumn, JSONTextColumn } from './json';\nimport {\n DateColumn,\n IntervalColumn,\n TimeColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\n\nexport const columnsByType: Record<\n string,\n new (...args: never[]) => ColumnType\n> = {\n bool: BooleanColumn,\n boolean: BooleanColumn,\n bytea: ByteaColumn,\n char: CharColumn,\n int8: BigIntColumn,\n bigint: BigIntColumn,\n int2: SmallIntColumn,\n smallint: SmallIntColumn,\n int4: IntegerColumn,\n integer: IntegerColumn,\n text: TextColumn,\n json: JSONTextColumn,\n xml: XMLColumn,\n point: PointColumn,\n lseg: LsegColumn,\n path: PathColumn,\n box: BoxColumn,\n polygon: PolygonColumn,\n line: LineColumn,\n cidr: CidrColumn,\n float4: RealColumn,\n real: RealColumn,\n float8: DoublePrecisionColumn,\n 'double precision': DoublePrecisionColumn,\n circle: CircleColumn,\n macaddr8: MacAddr8Column,\n money: MoneyColumn,\n macaddr: MacAddrColumn,\n inet: InetColumn,\n bpchar: CharColumn,\n character: CharColumn,\n varchar: VarCharColumn,\n 'character varying': VarCharColumn,\n date: DateColumn,\n time: TimeColumn,\n 'time without time zone': TimeColumn,\n timestamp: TimestampColumn,\n 'timestamp without time zone': TimestampColumn,\n timestamptz: TimestampTZColumn,\n 'timestamp with time zone': TimestampTZColumn,\n interval: IntervalColumn,\n bit: BitColumn,\n varbit: BitVaryingColumn,\n 'bit varying': BitVaryingColumn,\n numeric: DecimalColumn,\n decimal: DecimalColumn,\n uuid: UUIDColumn,\n tsvector: TsVectorColumn,\n tsquery: TsQueryColumn,\n jsonb: JSONColumn,\n smallserial: SmallSerialColumn,\n serial: SerialColumn,\n bigserial: BigSerialColumn,\n};\n","import pg, { Pool, PoolClient, PoolConfig } from 'pg';\nimport { AdapterBase, QueryInput, QueryResultRow, Sql } from 'orchid-core';\nconst { types } = pg;\n\nexport type TypeParsers = Record<number, (input: string) => unknown>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type QueryResult<T extends QueryResultRow = any> = {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type QueryArraysResult<R extends any[] = any[]> = {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n};\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.TIME,\n types.builtins.CIRCLE,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nconst returnArg = (arg: unknown) => arg;\n\nexport type AdapterConfig = Omit<PoolConfig, 'types' | 'connectionString'> & {\n schema?: string;\n databaseURL?: string;\n};\n\nexport type AdapterOptions = AdapterConfig & {\n types?: TypeParsers;\n};\n\nexport class Adapter implements AdapterBase {\n types: TypeParsers;\n pool: Pool;\n config: PoolConfig;\n schema?: string;\n\n constructor({ types = defaultTypeParsers, ...config }: AdapterOptions) {\n this.types = types;\n\n let schema = config.schema;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!schema) {\n schema = url.searchParams.get('schema') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (schema) this.schema = schema === 'public' ? undefined : schema;\n\n this.config = config;\n this.pool = new pg.Pool(config);\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return performQuery(\n this.pool,\n query,\n types,\n this.schema,\n ) as unknown as Promise<QueryResult<T>>;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryArraysResult<R>> {\n return performQuery(\n this.pool,\n query,\n types,\n this.schema,\n 'array',\n ) as unknown as Promise<QueryArraysResult<R>>;\n }\n\n async transaction<Result>(\n begin: Sql,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n const client = await this.pool.connect();\n try {\n await setSearchPath(client, this.schema);\n await performQueryOnClient(client, begin, this.types);\n let result;\n try {\n result = await cb(new TransactionAdapter(this, client, this.types));\n } catch (err) {\n await performQueryOnClient(client, { text: 'ROLLBACK' }, this.types);\n throw err;\n }\n await performQueryOnClient(client, { text: 'COMMIT' }, this.types);\n return result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ntype ConnectionSchema = { connection: { schema?: string } };\n\nconst setSearchPath = (client: PoolClient, schema?: string) => {\n if ((client as unknown as ConnectionSchema).connection.schema !== schema) {\n (client as unknown as ConnectionSchema).connection.schema = schema;\n return client.query(`SET search_path = ${schema || 'public'}`);\n }\n return;\n};\n\nconst performQuery = async (\n pool: Pool,\n query: QueryInput,\n types?: TypeParsers,\n schema?: string,\n rowMode?: 'array',\n) => {\n const client = await pool.connect();\n try {\n await setSearchPath(client, schema);\n return await performQueryOnClient(client, query, types, rowMode);\n } finally {\n client.release();\n }\n};\n\nconst performQueryOnClient = (\n client: PoolClient,\n query: QueryInput,\n types?: TypeParsers,\n rowMode?: 'array',\n) => {\n const params = {\n text: typeof query === 'string' ? query : query.text,\n values: typeof query === 'string' ? undefined : query.values,\n rowMode,\n types: types\n ? {\n getTypeParser(id: number) {\n return types[id] || returnArg;\n },\n }\n : defaultTypesConfig,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return client.query(params as any);\n};\n\nexport class TransactionAdapter implements Adapter {\n pool: Pool;\n config: PoolConfig;\n\n constructor(\n public adapter: Adapter,\n public client: PoolClient,\n public types: TypeParsers,\n ) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async query<T extends QueryResultRow = any>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return await performQueryOnClient(this.client, query, types);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryArraysResult<R>> {\n return await performQueryOnClient(this.client, query, types, 'array');\n }\n\n async transaction<Result>(\n _: Sql,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close() {\n return this.adapter.close();\n }\n}\n","import { Query, SetQueryReturnsColumn } from '../query/query';\nimport {\n ColumnTypeBase,\n emptyObject,\n Expression,\n getValueKey,\n setParserToQuery,\n toArray,\n} from 'orchid-core';\nimport { SelectableOrExpression } from './utils';\nimport { OrderItem, SelectQueryData, ToSQLCtx, WhereItem } from '../sql';\nimport { addValue, columnToSql, rawOrColumnToSql } from '../sql/common';\nimport { pushOrderBySql } from '../sql/orderBy';\nimport { whereToSql } from '../sql/where';\nimport { windowToSql } from '../sql/window';\nimport { OrderArg, WhereArg, WindowArgDeclaration } from '../queryMethods';\nimport { BooleanNullable } from '../columns';\nimport { BaseOperators, setQueryOperators } from '../columns/operators';\n\n// Additional SQL options that can be accepted by any aggregate function.\nexport type AggregateOptions<T extends Query> = {\n // Add DISTINCT inside of function call.\n distinct?: boolean;\n // The same argument as in .order() to be set inside of function call.\n order?: OrderArg<T> | OrderArg<T>[];\n // The same argument as in .where() to be set inside of function call.\n filter?: WhereArg<T>;\n // The same argument as in .orWhere() to support OR logic of the filter clause.\n filterOr?: WhereArg<T>[];\n // Adds WITHIN GROUP SQL statement.\n withinGroup?: boolean;\n // defines OVER clause.\n // Can be the name of a window defined by calling the .window() method,\n // or object the same as the .window() method takes to define a window.\n over?: Over<T>;\n};\n\n// Window definition or name.\nexport type Over<T extends Query> =\n | keyof T['windows']\n | WindowArgDeclaration<T>;\n\n// Arguments of function.\n// It can be a column name, expression,\n// `pairs` is for { key: value } which is translated to ('key', value) (used by `jsonObjectAgg`),\n// `value` is for a query variable (used by `stringAgg` for a delimiter).\nexport type FnExpressionArgs<Q extends Query> = (\n | SelectableOrExpression<Q>\n | { pairs: Record<string, SelectableOrExpression<Q>> }\n | { value: unknown }\n)[];\n\n// Expression for SQL function calls.\nexport class FnExpression<\n Q extends Query = Query,\n T extends ColumnTypeBase = ColumnTypeBase,\n> extends Expression<T> {\n /**\n * @param q - query object.\n * @param fn - SQL function name.\n * @param args - arguments of the function.\n * @param options - aggregate options.\n * @param _type - column type of the function result.\n */\n constructor(\n public q: Q,\n public fn: string,\n public args: FnExpressionArgs<Q>,\n public options: AggregateOptions<Q> = emptyObject,\n public _type: T,\n ) {\n super();\n }\n\n // Builds function SQL.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const sql: string[] = [`${this.fn}(`];\n\n const { values } = ctx;\n const { options } = this;\n\n if (options.distinct && !options.withinGroup) sql.push('DISTINCT ');\n\n sql.push(\n this.args\n .map((arg) => {\n if (typeof arg === 'string') {\n return arg === '*'\n ? '*'\n : columnToSql(ctx, this.q.q, this.q.q.shape, arg, quotedAs, true);\n } else if (arg instanceof Expression) {\n return arg.toSQL(ctx, quotedAs);\n } else if ('pairs' in arg) {\n const args: string[] = [];\n const { pairs } = arg;\n for (const key in pairs) {\n args.push(\n // ::text is needed to bypass \"could not determine data type of parameter\" postgres error\n `${addValue(values, key)}::text, ${rawOrColumnToSql(\n ctx,\n this.q.q,\n pairs[\n key as keyof typeof pairs\n ] as unknown as SelectableOrExpression,\n quotedAs,\n )}`,\n );\n }\n return args.join(', ');\n } else {\n return addValue(values, arg.value);\n }\n })\n .join(', '),\n );\n\n if (options.withinGroup) sql.push(') WITHIN GROUP (');\n else if (options.order) sql.push(' ');\n\n if (options.order) {\n pushOrderBySql(\n { ...ctx, sql },\n this.q.q,\n quotedAs,\n toArray(options.order) as OrderItem[],\n );\n }\n\n sql.push(')');\n\n if (options.filter || options.filterOr) {\n const whereSql = whereToSql(\n ctx,\n this.q,\n {\n and: options.filter ? ([options.filter] as WhereItem[]) : undefined,\n or: options.filterOr?.map((item) => [item]) as WhereItem[][],\n shape: this.q.q.shape,\n joinedShapes: this.q.q.joinedShapes,\n },\n quotedAs,\n );\n if (whereSql) {\n sql.push(` FILTER (WHERE ${whereSql})`);\n }\n }\n\n if (options.over) {\n sql.push(\n ` OVER ${windowToSql(ctx, this.q.q, options.over as string, quotedAs)}`,\n );\n }\n\n return sql.join('');\n }\n}\n\n// Adds column operator functions to the expression.\nexport type ColumnExpression<\n C extends ColumnTypeBase,\n Ops extends BaseOperators = C['operators'],\n> = Expression<C> & {\n [K in keyof Ops]: (\n arg: Ops[K]['_opType'],\n ) => ColumnExpression<BooleanNullable>;\n};\n\n// Applies Expression to the query.\n// The query returns a column of Expression type, and has column operators of this type.\nexport const makeExpression = <T extends Query, C extends ColumnTypeBase>(\n self: T,\n expr: Expression,\n): SetQueryReturnsColumn<T, C> & C['operators'] => {\n const { _type: type } = expr;\n const q = setQueryOperators(self, type.operators);\n\n // Throw happens only on `undefined`, which is not the case for `sum` and other functions that can return `null`.\n q.q.returnType = 'valueOrThrow';\n (q.q as SelectQueryData).returnsOne = true;\n (q.q as SelectQueryData)[getValueKey] = type;\n q.q.expr = expr;\n q.q.select = [expr];\n\n if (type.parseFn) {\n setParserToQuery(q.q, getValueKey, type.parseFn);\n }\n\n return q as SetQueryReturnsColumn<T, C> & C['operators'];\n};\n\n// Applies a function expression to the query.\nexport function makeFnExpression<T extends Query, C extends ColumnTypeBase>(\n self: T,\n type: C,\n fn: string,\n args: FnExpressionArgs<Query>,\n options?: AggregateOptions<T>,\n): SetQueryReturnsColumn<T, C> & C['operators'] {\n return makeExpression(\n self.clone(),\n new FnExpression<Query, ColumnTypeBase>(\n self,\n fn,\n args,\n options as AggregateOptions<Query> | undefined,\n type,\n ),\n ) as SetQueryReturnsColumn<T, C> & C['operators'];\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumn,\n} from '../query/query';\nimport {\n ArrayColumn,\n BooleanColumn,\n BooleanNullable,\n ColumnType,\n IntegerColumn,\n JSONColumn,\n JSONTextColumn,\n NumberBaseColumn,\n NumberColumn,\n TextBaseColumn,\n TextColumn,\n UnknownColumn,\n XMLColumn,\n} from '../columns';\nimport { ExpressionOutput, SelectableOrExpression } from '../common/utils';\nimport { ColumnTypeBase, emptyArray, NullableColumn } from 'orchid-core';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../common/fn';\nimport { Operators } from '../columns/operators';\nimport { RawSQL } from '../sql/rawSql';\n\n// Helper function to check if we're selecting a count on this query.\n// Used in `create` to not return a full record after `count()` method.\nexport const isSelectingCount = (q: Query) => {\n const { expr } = q.q;\n return (\n expr instanceof FnExpression && expr.fn === 'count' && expr.args[0] === '*'\n );\n};\n\n// `count` returns `bigint` type that is represented by a string.\n// This is needed to parse the value back to a number.\nconst int = new IntegerColumn().parse((input) =>\n parseInt(input as unknown as string),\n);\n\ntype NullableInteger = NullableColumn<IntegerColumn>;\n\n// Parse nullable string to int, the nullable string may happen because of `bigint` db type.\nconst nullableInt = new IntegerColumn().parse((input) =>\n input === null ? null : parseInt(input as unknown as string),\n) as NullableInteger;\n\ntype NullableNumber = NullableColumn<NumberColumn>;\n\n// double-precision is represented by string in JS, parse it to float.\nconst nullableFloat = new IntegerColumn().parse((input) =>\n input === null ? null : parseFloat(input as unknown as string),\n) as NullableNumber;\n\nconst nullableBoolean: BooleanNullable = new BooleanColumn().nullable();\n\ntype NullableJSONAgg<\n T extends Query,\n Arg extends SelectableOrExpression<T>,\n> = NullableColumn<ArrayColumn<ExpressionOutput<T, Arg>>>;\n\ntype NullableJSONObject<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n Outputs extends Record<string, ColumnTypeBase> = {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>;\n },\n> = NullableColumn<\n ColumnType<\n { [K in keyof Outputs]: Outputs[K]['type'] },\n typeof Operators.any,\n { [K in keyof Outputs]: Outputs[K]['inputType'] },\n { [K in keyof Outputs]: Outputs[K]['outputType'] }\n >\n>;\n\nconst jsonColumn = new JSONTextColumn().nullable();\nconst jsonbColumn = new JSONColumn().nullable();\n\ntype NullableText = NullableColumn<TextColumn>;\nconst nullableText = new TextColumn().nullable();\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\n /**\n * `fn` allows to call an arbitrary SQL function.\n *\n * For example, calling `sqrt` function to get a square root from some numeric column:\n *\n * ```ts\n * const q = await User.select({\n * sqrt: (q) => q.fn<number>('sqrt', ['numericColumn']),\n * }).take();\n *\n * q.sqrt; // has type `number` just as provided\n * ```\n *\n * If this is an aggregate function, you can specify aggregation options via third parameter.\n *\n * Forth parameter is for runtime column type. When specified, allows to chain the function with the column operators:\n *\n * ```ts\n * const q = await User.select({\n * // chain `sqrt(\"numericColumn\")` with the \"greater than 5\"\n * sqrtIsGreaterThan5: (q) => q.fn('sqrt', ['numericColumn'], {}, (t) => t.float()).gt(5),\n * }).take();\n *\n * // Return type is boolean | null\n * // todo: it should be just boolean if the column is not nullable, but for now it's always nullable\n * q.sqrtIsGreaterThan5\n * ```\n *\n * @param fn\n * @param args\n * @param options\n * @param type\n */\n fn<T extends Query, Type = unknown, C extends ColumnType = ColumnType<Type>>(\n this: T,\n fn: string,\n args: SelectableOrExpression<T>[],\n options?: AggregateOptions<T>,\n type?: (t: T['columnTypes']) => C,\n ): SetQueryReturnsColumn<T, C> & C['operators'] {\n return makeFnExpression(\n this,\n (type?.(this.columnTypes) || UnknownColumn.instance) as C,\n fn,\n args,\n options,\n );\n }\n\n /**\n * Use `exists()` to check if there is at least one record-matching condition.\n *\n * It will discard previous `select` statements if any. Returns a boolean.\n *\n * ```ts\n * const exists: boolean = await db.table.where(...conditions).exists();\n * ```\n */\n exists<T extends Query>(this: T): SetQueryReturnsColumn<T, BooleanColumn> {\n return this.clone()._exists();\n }\n _exists<T extends Query>(this: T): SetQueryReturnsColumn<T, BooleanColumn> {\n const q = this._getOptional(new RawSQL('true'));\n q.q.notFoundDefault = false;\n q.q.coalesceValue = new RawSQL('false');\n return q as unknown as SetQueryReturnsColumn<T, BooleanColumn>;\n }\n\n /**\n * Count records with the `count` function:\n *\n * ```ts\n * // count all records:\n * const result: number = await db.table.count();\n *\n * // count records where a column is not NULL:\n * db.table.count('name');\n *\n * // see options above:\n * db.table.count('*', aggregateOptions);\n *\n * // select counts of people grouped by city\n * db.people\n * .select('city', {\n * population: (q) => q.count(),\n * })\n * .group('city');\n * ```\n *\n * @param arg - optionally, provide a column or a raw SQL for the `count` argument\n * @param options - aggregation options\n */\n count<T extends Query>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NumberColumn> & {\n isCount: true;\n } & NumberColumn['operators'] {\n return makeFnExpression(\n this,\n int,\n 'count',\n [arg],\n options,\n ) as SetQueryReturnsColumn<T, NumberColumn> & {\n isCount: true;\n } & NumberColumn['operators'];\n }\n\n /**\n * Get the minimum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.min(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select min product price grouped by product category\n * db.product\n * .select('category', {\n * minPrice: (q) => q.min('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n min<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'min', [arg], options);\n }\n\n /**\n * Gets the maximum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.max(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select max product price grouped by product category\n * db.product\n * .select('category', {\n * maxPrice: (q) => q.max('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n max<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'max', [arg], options);\n }\n\n /**\n * Retrieve the sum of the values of a given numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.sum(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select sum of employee salaries grouped by years\n * db.employee\n * .select('year', {\n * yearlySalaries: (q) => q.sum('salary'),\n * })\n * .group('year');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n sum<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'sum', [arg], options);\n }\n\n /**\n * Retrieve the average value of a numeric column, it returns a number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.avg('numericColumn', aggregateOptions);\n *\n * // select average movies ratings\n * db.movie\n * .select('title', {\n * averageRating: (q) => q.avg('rating'),\n * })\n * .group('title');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n avg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'avg', [arg], options);\n }\n\n /**\n * Bitwise `and` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitAnd(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `bitAnd`\n * db.table\n * .select('someColumn', {\n * bitAnd: (q) => q.bitAnd('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitAnd<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'bit_and', [arg], options);\n }\n\n /**\n * Bitwise `or` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitOr('numericColumn', aggregateOptions);\n *\n * // select grouped `bitOr`\n * db.table\n * .select('someColumn', {\n * bitOr: (q) => q.bitOr('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitOr<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'bit_or', [arg], options);\n }\n\n /**\n * Aggregate booleans with `and` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolAnd(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolAnd`\n * db.table\n * .select('someColumn', {\n * boolAnd: (q) => q.boolAnd('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolAnd<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'bool_and', [arg], options);\n }\n\n /**\n * Aggregate booleans with `or` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolOr(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolOr`\n * db.table\n * .select('someColumn', {\n * boolOr: (q) => q.boolOr('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolOr<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'bool_or', [arg], options);\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'every', [arg], options);\n }\n\n /**\n * Aggregate values into an array by using `json_agg`. Returns array of values or `null` if there are no records.\n *\n * `jsonAgg` is working a bit faster, `jsonbAgg` is better only when applying JSON operations in SQL.\n *\n * ```ts\n * const idsOrNull: number[] | null = db.table.jsonAgg('id', aggregateOptions);\n *\n * const namesOrNull: string[] | null = db.table.jsonbAgg(\n * 'name',\n * aggregateOptions,\n * );\n *\n * // select grouped `jsonAgg`\n * db.table\n * .select('someColumn', {\n * jsonAgg: (q) => q.jsonAgg('anyColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - any column or raw SQL\n * @param options - aggregation options\n */\n jsonAgg<T extends Query, Arg extends SelectableOrExpression<T>>(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONAgg<T, Arg>> &\n ArrayColumn<ColumnTypeBase>['operators'] {\n return makeFnExpression(\n this,\n jsonColumn as unknown as NullableJSONAgg<T, Arg>,\n 'json_agg',\n [arg],\n options,\n );\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<T extends Query, Arg extends SelectableOrExpression<T>>(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONAgg<T, Arg>> &\n ArrayColumn<ColumnTypeBase>['operators'] {\n return makeFnExpression(\n this,\n jsonbColumn as unknown as NullableJSONAgg<T, Arg>,\n 'jsonb_agg',\n [arg],\n options,\n );\n }\n\n /**\n * It does the construction of JSON objects, keys are provided strings and values can be table columns or raw SQL expressions, and returns `object` or `null` if no records.\n *\n * `jsonObjectAgg` is different from `jsonbObjectAgg` by internal representation in the database, `jsonObjectAgg` is a bit faster as it constructs a simple string.\n *\n * ```ts\n * import { TextColumn } from './string';\n *\n * // object has type { nameAlias: string, foo: string } | null\n * const object = await db.table.jsonObjectAgg(\n * {\n * // select a column with alias\n * nameAlias: 'name',\n * // select raw SQL with alias\n * foo: db.table.sql<string>`\"bar\" || \"baz\"`,\n * },\n * aggregateOptions,\n * );\n *\n * // select aggregated object\n * db.table.select('id', {\n * object: (q) =>\n * q.jsonObjectAgg({\n * nameAlias: 'name',\n * foo: db.table.sql<string>`\"bar\" || \"baz\"`,\n * }),\n * });\n * ```\n *\n * @param arg - object where values are column names or SQL\n * @param options - aggregation options\n */\n jsonObjectAgg<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONObject<T, Obj>> &\n typeof Operators.any {\n return makeFnExpression(\n this,\n jsonColumn as NullableJSONObject<T, Obj>,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONObject<T, Obj>> &\n typeof Operators.any {\n return makeFnExpression(\n this,\n jsonbColumn as NullableJSONObject<T, Obj>,\n 'jsonb_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * Select joined strings, it returns a string or `null` if no records.\n *\n * ```ts\n * const result: string | null = db.table.stringAgg(\n * 'name',\n * ', ',\n * aggregateOptions,\n * );\n *\n * // select joined strings grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedNames: (q) => q.stringAgg('name', ', '),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - string column or SQL\n * @param delimiter - string to join with\n * @param options - aggration options\n */\n stringAgg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, TextBaseColumn>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableText> & NullableText['operators'] {\n return makeFnExpression(\n this,\n nullableText,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n );\n }\n\n /**\n * Concatenates `xml` columns, returns a `string` or `null` if no records.\n *\n * ```ts\n * const xml: string | null = await db.table.xmlAgg('xmlColumn', aggregateOptions);\n *\n * // select joined XMLs grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedXMLs: (q) => q.xmlAgg('xml'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - column or SQL with XML\n * @param options - aggregation options\n */\n xmlAgg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, XMLColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableText> & NullableText['operators'] {\n return makeFnExpression(this, nullableText, 'xmlagg', [arg], options);\n }\n\n /**\n * Selects the` row_number` window function.\n *\n * Returns the number of the current row within its partition, counting from 1.\n *\n * ```ts\n * // result is of type Array<{ rowNumber: number }>\n * const result = await db.table.select({\n * rowNumber: (q) =>\n * q.rowNumber({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rowNumber<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'row_number', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the` rank` window function.\n *\n * Returns the rank of the current row, with gaps; that is, the row_number of the first row in its peer group.\n *\n * ```ts\n * // result is of type Array<{ rank: number }>\n * const result = await db.table.select({\n * rank: (q) =>\n * q.rank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'rank', emptyArray, { over });\n }\n\n /**\n * Selects the` dense_rank` window function.\n *\n * Returns the rank of the current row, without gaps; this function effectively counts peer groups.\n *\n * ```ts\n * // result is of type Array<{ denseRank: number }>\n * const result = await db.table.select({\n * denseRank: (q) =>\n * q.denseRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n denseRank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'dense_rank', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the `percent_rank` window function.\n *\n * Returns the relative rank of the current row, that is (rank - 1) / (total partition rows - 1). The value thus ranges from 0 to 1 inclusive.\n *\n * ```ts\n * // result is of type Array<{ percentRank: number }>\n * const result = await db.table.select({\n * percentRank: (q) =>\n * q.percentRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n percentRank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'percent_rank', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the `cume_dist` window function.\n *\n * Returns the cumulative distribution, that is (number of partition rows preceding or peers with current row) / (total partition rows). The value thus ranges from 1/N to 1.\n *\n * ```ts\n * // result is of type Array<{ cumeDist: number }>\n * const result = await db.table.select({\n * cumeDist: (q) =>\n * q.cumeDist({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n cumeDist<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'cume_dist', emptyArray, {\n over,\n });\n }\n}\n","import { Query, QueryReturnType, SelectableBase, WithDataBase } from './query';\nimport { QueryData } from '../sql';\nimport {\n ColumnsShapeBase,\n QueryBaseCommon,\n QueryInternal,\n QueryMetaBase,\n} from 'orchid-core';\nimport { RelationsBase } from '../relations';\nimport { getClonedQueryData } from '../common/utils';\n\nexport abstract class QueryBase implements QueryBaseCommon {\n /**\n * Clones the current query chain, useful for re-using partial query snippets in other queries without mutating the original.\n *\n * Used under the hood, and not really needed on the app side.\n */\n clone<T extends QueryBase>(this: T): T {\n const cloned = Object.create(this.baseQuery);\n cloned.q = getClonedQueryData(this.q);\n return cloned;\n }\n abstract result: ColumnsShapeBase;\n q = {} as QueryData;\n table?: string;\n selectable!: SelectableBase;\n shape!: ColumnsShapeBase;\n relations!: RelationsBase;\n withData!: WithDataBase;\n baseQuery!: Query;\n internal!: QueryInternal;\n meta!: QueryMetaBase;\n returnType!: QueryReturnType;\n}\n","import { SetQueryTableAlias } from '../query/query';\nimport { QueryBase } from '../query/queryBase';\n\nexport abstract class AsMethods extends QueryBase {\n /**\n * Sets table alias:\n *\n * ```ts\n * db.table.as('u').select('u.name');\n *\n * // Can be used in the join:\n * db.table.join(Profile.as('p'), 'p.userId', 'user.id');\n * ```\n *\n * @param as - alias for the table of this query\n */\n as<T extends AsMethods, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return this.clone()._as(as) as unknown as SetQueryTableAlias<T, As>;\n }\n _as<T extends AsMethods, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n this.q.as = as;\n return this as unknown as SetQueryTableAlias<T, As>;\n }\n}\n","import { Query } from '../query/query';\nimport { isExpression } from 'orchid-core';\n\nexport type ClearStatement =\n | 'with'\n | 'select'\n | 'where'\n | 'union'\n | 'using'\n | 'join'\n | 'group'\n | 'order'\n | 'having'\n | 'limit'\n | 'offset'\n | 'counters';\n\nexport class Clear {\n clear<T extends Query>(this: T, ...clears: ClearStatement[]): T {\n return this.clone()._clear(...clears);\n }\n\n _clear<T extends Query>(this: T, ...clears: ClearStatement[]): T {\n clears.forEach((clear) => {\n if (clear === 'where') {\n delete this.q.and;\n delete this.q.or;\n } else if (clear === 'counters') {\n if ('type' in this.q && this.q.type === 'update') {\n this.q.updateData = this.q.updateData.filter((item) => {\n if (!isExpression(item) && typeof item !== 'function') {\n let removed = false;\n for (const key in item) {\n const value = item[key] as Record<string, unknown>;\n if (\n typeof value === 'object' &&\n (value.op === '+' || value.op === '-')\n ) {\n delete item[key];\n removed = true;\n }\n }\n if (removed && !Object.keys(item).length) {\n return false;\n }\n }\n\n return true;\n });\n }\n } else {\n delete (this.q as Record<string, unknown>)[clear];\n }\n });\n return this;\n }\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { ColumnInfoQueryData } from '../sql';\nimport { ColumnType } from '../columns';\nimport { QueryCatch, QueryThen } from 'orchid-core';\n\n/**\n * Result type for `columnInfo` method.\n * Sets query kind to 'columnInfo', returns a single value (may return undefined),\n * the value is a {@link ColumnInfo} object or a Record with keys for column names and ColumnInfo objects as values.\n **/\nexport type SetQueryReturnsColumnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined,\n Result = Column extends keyof T['shape']\n ? ColumnInfo\n : Record<keyof T['shape'], ColumnInfo>,\n> = Omit<\n SetQueryKind<T, 'columnInfo'>,\n 'result' | 'returnType' | 'then' | 'catch'\n> & {\n result: { value: ColumnType<Result> };\n returnType: 'value';\n then: QueryThen<Result>;\n catch: QueryCatch<Result>;\n};\n\n// column info pulled from a database\nexport type ColumnInfo = {\n // default value of a column\n defaultValue: unknown;\n // column type\n type: string;\n // max length for the text types such as varchar\n maxLength: number | null;\n // is column nullable\n nullable: boolean;\n};\n\n// map database response for a column into a ColumnInfo\nconst rowToColumnInfo = (row: unknown): ColumnInfo => {\n const typed = row as {\n column_default: string | null;\n is_nullable: 'YES' | 'NO';\n data_type: string;\n character_maximum_length: number | null;\n };\n\n return {\n defaultValue: typed.column_default,\n type: typed.data_type,\n maxLength: typed.character_maximum_length,\n nullable: typed.is_nullable === 'YES',\n };\n};\n\nexport class ColumnInfoMethods {\n /**\n * Returns an object with the column info about the current table, or an individual column if one is passed, returning an object with the following keys:\n *\n * ```ts\n * type ColumnInfo = {\n * defaultValue: unknown; // the default value for the column\n * type: string; // the column type\n * maxLength: number | null; // the max length set for the column, present on string types\n * nullable: boolean; // whether the column may be null\n * };\n *\n * // columnInfo has type Record<string, ColumnInfo>, where string is name of columns\n * const columnInfo = await db.table.columnInfo();\n *\n * // singleColumnInfo has the type ColumnInfo\n * const singleColumnInfo = await db.table.columnInfo('name');\n * ```\n *\n * @param column - optional: select info for only a single column if provided, or for all table columns if not\n */\n columnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined = undefined,\n >(this: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n return this.clone()._columnInfo(column);\n }\n _columnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined = undefined,\n >(this: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n this.q.type = 'columnInfo';\n this.q.returnType = 'all';\n\n if (column) {\n (this.q as ColumnInfoQueryData).column = column as string;\n }\n\n this.q.handleResult = (_, _t, result) => {\n if (column) {\n return rowToColumnInfo(result.rows[0]);\n } else {\n const info: Record<string, ColumnInfo> = {};\n result.rows.forEach((row) => {\n info[(row as { column_name: string }).column_name] =\n rowToColumnInfo(row);\n });\n return info;\n }\n };\n\n return this as unknown as SetQueryReturnsColumnInfo<T, Column>;\n }\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { CopyOptions } from '../sql';\n\n// argument of the `copy` function can accept various options\ntype CopyArg<T extends Query> = CopyOptions<keyof T['shape']>;\n\n// Result type for the `copy` method, simply setting a query kind.\ntype CopyResult<T extends Query> = SetQueryKind<T, 'copy'>;\n\nexport class CopyMethods {\n /**\n * `copy` is a method to invoke a `COPY` SQL statement, it can copy from or to a file or a program.\n *\n * Copying from `STDIN` or to `STDOUT` is not supported.\n *\n * It supports all the options of the `COPY` statement of Postgres. See details in [Postgres document](https://www.postgresql.org/docs/current/sql-copy.html).\n *\n * The copying is performed by the Postgres database server, and it must have access to the file.\n *\n * Type of copy argument:\n *\n * ```ts\n * export type CopyOptions<Column = string> = {\n * columns?: Column[];\n * format?: 'text' | 'csv' | 'binary';\n * freeze?: boolean;\n * delimiter?: string;\n * null?: string;\n * header?: boolean | 'match';\n * quote?: string;\n * escape?: string;\n * forceQuote?: Column[] | '*';\n * forceNotNull?: Column[];\n * forceNull?: Column[];\n * encoding?: string;\n * } & (\n * | {\n * from: string | { program: string };\n * }\n * | {\n * to: string | { program: string };\n * }\n * );\n * ```\n *\n * Example usage:\n *\n * ```ts\n * await db.table.copy({\n * columns: ['id', 'title', 'description'],\n * from: 'path-to-file',\n * });\n * ```\n * @param arg - object with copy options\n */\n copy<T extends Query>(this: T, arg: CopyArg<T>): CopyResult<T> {\n return this.clone()._copy(arg);\n }\n _copy<T extends Query>(this: T, arg: CopyArg<T>): CopyResult<T> {\n Object.assign(this.q, {\n type: 'copy',\n copy: arg,\n });\n return this as CopyResult<T>;\n }\n}\n","import {\n Query,\n QueryReturnsAll,\n queryTypeWithLimitOne,\n SetQueryKind,\n SetQueryReturns,\n SetQueryReturnsAll,\n SetQueryReturnsColumn,\n SetQueryReturnsOne,\n SetQueryReturnsPluckColumn,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n RelationConfigBase,\n RelationConfigDataForCreate,\n RelationsBase,\n} from '../relations';\nimport {\n CreateKind,\n InsertQueryData,\n OnConflictItem,\n OnConflictMergeUpdate,\n} from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape } from '../query/db';\nimport { Expression, StringKey, QueryThen, SetOptional } from 'orchid-core';\nimport { isSelectingCount } from './aggregate';\n\n// Type of argument for `create`, `createMany`, optional argument for `createFrom`,\n// `defaults` use a Partial of it.\n//\n// It maps `inputType` of the table into object to accept a corresponding type,\n// or raw SQL per column, or a sub-query for a column.\n//\n// It allows to omit `belongsTo` foreign keys when a `belongsTo` record is provided by a relation name.\n// For example, it allows to create with `db.book.create({ authorId: 123 })`\n// or with `db.book.create({ author: authorData })`\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type CreateData<\n T extends Query,\n Data = SetOptional<\n { [K in keyof T['inputType']]: CreateColumn<T, K> },\n T['meta']['defaults']\n >,\n> = [keyof T['relations']] extends [never]\n ? // if no relations, don't load TS with extra calculations\n Data\n : CreateRelationsData<T, T['relations'], Data>;\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<T extends Query, Key extends keyof T['inputType']> =\n | Expression\n | T['inputType'][Key]\n | {\n [K in keyof Query]: K extends 'then'\n ? QueryThen<T['inputType'][Key]>\n : Query[K];\n };\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<\n T extends Query,\n Relations extends RelationsBase,\n Data,\n> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n Omit<\n Data,\n Relations[keyof Relations]['relationConfig']['omitForeignKeyInCreate']\n > &\n // Intersection of objects for `belongsTo` relations:\n // ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\n CreateRelationsDataOmittingFKeys<T, Relations> &\n // Union of the rest relations objects, intersection is not needed here because there are no required properties:\n // { foo: object } | { bar: object }\n Relations[keyof Relations]['relationConfig']['optionalDataForCreate'];\n\n// Intersection of relations that may omit foreign key (belongsTo):\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateRelationsDataOmittingFKeys<\n T extends Query,\n Relations extends RelationsBase,\n // Collect a union of `belongsTo` relation objects.\n // Tuple is needed to preserve the inner union type of the object.\n Union extends [Record<string, unknown>] = {\n [K in keyof Relations]: CreateRelationDataOmittingFKeys<\n Relations[K]['relationConfig'],\n T['meta']['defaults']\n >;\n }[keyof Relations],\n> =\n // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (Union extends any ? (u: Union) => void : never) extends (\n u: [infer Obj],\n ) => void\n ? Obj\n : never;\n\n// Makes type for a `belongsTo` relation:\n// [{ fooId: number } | { foo: object }]\nexport type CreateRelationDataOmittingFKeys<\n RelationConfig extends RelationConfigBase,\n Defaults extends PropertyKey,\n Data extends\n | RelationConfigDataForCreate\n | undefined = RelationConfig['dataForCreate'],\n> = Data extends RelationConfigDataForCreate\n ? [\n keyof Data['columns'] extends Defaults\n ? Omit<Data['columns'], Defaults> & {\n [P in Defaults & keyof Data['columns']]?: Data['columns'][P];\n } & Partial<Data['nested']>\n : Data['columns'] | Data['nested'],\n ]\n : never;\n\n// `create` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype CreateResult<T extends Query> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<SetQueryKind<T, 'create'>, T['result']['pluck']>\n : SetQueryKind<T, 'create'>;\n\n// `insert` method output type\n// - query returns inserted row count by default.\n// - returns a record with selected columns if the query has a select.\n// - if the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype InsertResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<SetQueryKind<T, 'create'>, T['result']['pluck']>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'create'>>;\n\n// `createMany` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns a single record, forces it to return multiple.\n// - otherwise, query result remains as is.\ntype CreateManyResult<T extends Query> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumn<SetQueryKind<T, 'create'>, T['result']['value']>\n : SetQueryKind<T, 'create'>;\n\n// `insertMany` method output type\n// - query returns inserted row count by default.\n// - returns records with selected columns if the query has a select.\n// - if the query returns a single record, forces it to return multiple records.\ntype InsertManyResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumn<\n SetQueryKind<T, 'create'>,\n T['result']['value']\n >\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'create'>>;\n\n// `onConflict().ignore()` method output type:\n// overrides query return type from 'oneOrThrow' to 'one', from 'valueOrThrow' to 'value',\n// because `ignore` won't return any data in case of a conflict.\ntype IgnoreResult<T extends Query> = T['returnType'] extends 'oneOrThrow'\n ? SetQueryReturns<T, 'one'>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturns<T, 'value'>\n : T;\n\n// `createRaw` method argument.\n// Contains array of columns and a raw SQL for values.\ntype CreateRawData<T extends Query> = {\n columns: (keyof T['shape'])[];\n values: Expression;\n};\n\n// `createManyRaw` method argument.\n// Contains array of columns and an array of raw SQL for values.\ntype CreateManyRawData<T extends Query> = {\n columns: (keyof T['shape'])[];\n values: Expression[];\n};\n\n// Record<(column name), true> where the column doesn't have a default, and it is not nullable.\ntype RawRequiredColumns<T extends Query> = {\n [K in keyof T['inputType'] as K extends T['meta']['defaults']\n ? never\n : null extends T['inputType'][K]\n ? never\n : undefined extends T['inputType'][K]\n ? never\n : K]: true;\n};\n\n// Arguments of `createRaw` and `createManyRaw`.\n// TS error if not all required columns are specified.\ntype CreateRawArgs<\n T extends Query,\n Arg extends { columns: (keyof T['shape'])[] },\n> = keyof RawRequiredColumns<T> extends Arg['columns'][number]\n ? [data: Arg]\n : [\n `Missing required columns: ${Exclude<\n StringKey<keyof RawRequiredColumns<T>>,\n Arg['columns'][number]\n >}`,\n ];\n\n// Argument of `onConflict`, can be:\n// - a column name\n// - an array of column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends Query> =\n | keyof T['shape']\n | (keyof T['shape'])[]\n | Expression;\n\nexport type AddQueryDefaults<T extends Query, Defaults extends PropertyKey> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'defaults'\n ? T['meta']['defaults'] | Defaults\n : T['meta'][K];\n }\n : T[K];\n};\n\n/**\n * Used by ORM to access the context of current create query.\n * Is passed to the `create` method of a {@link VirtualColumn}\n */\nexport type CreateCtx = {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: Record<string, unknown>[];\n};\n\n// Type of `encodeFn` of columns.\ntype Encoder = (input: unknown) => unknown;\n\n// Function called by all `create` methods to override query select.\n// Clears select if query returning nothing or a count.\n// Otherwise, selects all if query doesn't have select.\nconst createSelect = (q: Query) => {\n if (q.q.returnType === 'void' || isSelectingCount(q)) {\n q.q.select = undefined;\n } else if (!q.q.select) {\n q.q.select = ['*'];\n }\n};\n\n/**\n * Processes arguments of data to create.\n * If the passed key is for a {@link VirtualColumn}, calls `create` of the virtual column.\n * Otherwise, ignores keys that aren't relevant to the table shape,\n * collects columns to the `ctx.columns` set, collects columns encoders.\n *\n * @param q - query object.\n * @param item - argument of data to create.\n * @param rowIndex - index of record's data in `createMany` args array.\n * @param ctx - context of create query to be shared with a {@link VirtualColumn}.\n * @param encoders - to collect `encodeFn`s of columns.\n */\nconst processCreateItem = (\n q: Query,\n item: Record<string, unknown>,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: Record<string, Encoder>,\n) => {\n const { shape } = q.q;\n for (const key in item) {\n if (shape[key] instanceof VirtualColumn) {\n (shape[key] as VirtualColumn).create?.(q, ctx, item, rowIndex);\n } else if (\n !ctx.columns.has(key) &&\n ((shape[key] && !shape[key].data.computed) || shape === anyShape)\n ) {\n ctx.columns.set(key, ctx.columns.size);\n encoders[key] = shape[key]?.encodeFn as Encoder;\n }\n }\n};\n\n// Creates a new context of create query.\nconst createCtx = (): CreateCtx => ({\n columns: new Map(),\n resultAll: undefined as unknown as Record<string, unknown>[],\n});\n\n// Packs record values from the provided object into array of values.\n// Encode values when the column has an encoder.\nconst mapColumnValues = (\n columns: string[],\n encoders: Record<string, Encoder>,\n data: Record<string, unknown>,\n): unknown[] => {\n return columns.map((key) =>\n encoders[key] ? encoders[key](data[key]) : data[key],\n );\n};\n\n/**\n * Processes arguments of `create`, `insert`, `createFrom` and `insertFrom` when it has data.\n * Apply defaults that may be present on a query object to the data.\n * Maps data object into array of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - argument with data for create.\n * @param ctx - context of the create query.\n */\nconst handleOneData = (\n q: Query,\n data: Record<string, unknown>,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: Record<string, Encoder> = {};\n const defaults = q.q.defaults;\n\n if (defaults) {\n data = { ...defaults, ...data };\n }\n\n processCreateItem(q, data, 0, ctx, encoders);\n\n const columns = Array.from(ctx.columns.keys());\n const values = [mapColumnValues(columns, encoders, data)];\n\n return { columns, values };\n};\n\n/**\n * Processes arguments of `createMany`, `insertMany`.\n * Apply defaults that may be present on a query object to the data.\n * Maps data objects into array of arrays of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - arguments with data for create.\n * @param ctx - context of the create query.\n */\nconst handleManyData = (\n q: Query,\n data: Record<string, unknown>[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: Record<string, Encoder> = {};\n const defaults = q.q.defaults;\n\n if (defaults) {\n data = data.map((item) => ({ ...defaults, ...item }));\n }\n\n data.forEach((item, i) => {\n processCreateItem(q, item, i, ctx, encoders);\n });\n\n const values = Array(data.length);\n const columns = Array.from(ctx.columns.keys());\n\n data.forEach((item, i) => {\n (values as unknown[][])[i] = mapColumnValues(columns, encoders, item);\n });\n\n return { columns, values };\n};\n\n/**\n * Core function that is used by all `create` and `insert` methods.\n * Sets query `type` to `insert` for `toSQL` to know it's for inserting.\n * Sets query columns and values.\n * Sets query kind, which is checked by `update` method when returning a query from callback.\n * Overrides query return type according to what is current create method supposed to return.\n *\n * @param self - query object.\n * @param columns - columns list of all values.\n * @param values - array of arrays matching columns, or can be an array of SQL expressions, or is a special object for `createFrom`.\n * @param kind - the kind of create query, can be 'object', 'raw', 'from'.\n * @param many - whether it's for creating one or many.\n */\nconst insert = (\n self: Query,\n {\n columns,\n values,\n }: {\n columns: string[];\n values: InsertQueryData['values'];\n },\n kind: CreateKind,\n many?: boolean,\n) => {\n const { q } = self as { q: InsertQueryData };\n\n delete q.and;\n delete q.or;\n\n q.type = 'insert';\n q.columns = columns;\n q.values = values;\n\n // query kind may be already set by in the ORM\n // so that author.books.create(data) will actually perform the `from` kind of create\n if (!q.kind) q.kind = kind;\n\n const { select, returnType = 'all' } = q;\n\n if (!select) {\n if (returnType !== 'void') q.returnType = 'rowCount';\n } else if (many) {\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n q.returnType = 'all';\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n q.returnType = 'pluck';\n }\n } else if (returnType === 'all') {\n q.returnType = 'from' in values ? values.from.q.returnType : 'one';\n } else if (returnType === 'pluck') {\n q.returnType = 'valueOrThrow';\n }\n\n return self;\n};\n\n/**\n * Function to collect column names from the inner query of create `from` methods.\n *\n * @param from - inner query to grab the columns from.\n * @param obj - optionally passed object with specific data, only available when creating a single record.\n * @param many - whether it's for `createManyFrom`. If no, throws if the inner query returns multiple records.\n */\nconst getFromSelectColumns = (\n from: Query,\n obj?: { columns: string[] },\n many?: boolean,\n) => {\n if (!many && !queryTypeWithLimitOne[from.q.returnType]) {\n throw new Error(\n 'Cannot create based on a query which returns multiple records',\n );\n }\n\n const queryColumns: string[] = [];\n from.q.select?.forEach((item) => {\n if (typeof item === 'string') {\n const index = item.indexOf('.');\n queryColumns.push(index === -1 ? item : item.slice(index + 1));\n } else if ('selectAs' in item) {\n queryColumns.push(...Object.keys(item.selectAs));\n }\n });\n\n if (obj?.columns) {\n queryColumns.push(...obj.columns);\n }\n\n return queryColumns;\n};\n\n/**\n * Is used by all create from queries methods.\n * Collects columns and values from the inner query and optionally from the given data,\n * calls {@link insert} with a 'from' kind of create query.\n *\n * @param q - query object.\n * @param from - inner query from which to create new records.\n * @param many - whether creating many.\n * @param data - optionally passed custom data when creating a single record.\n */\nconst insertFromQuery = <\n T extends Query,\n Q extends Query,\n Many extends boolean,\n>(\n q: T,\n from: Q,\n many: Many,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n) => {\n const ctx = createCtx();\n\n const obj = data && handleOneData(q, data, ctx);\n\n const columns = getFromSelectColumns(from, obj, many);\n\n return insert(\n q,\n {\n columns,\n values: { from, values: obj?.values },\n },\n 'from',\n many,\n );\n};\n\n/**\n * Names of all create methods,\n * is used in {@link RelationQuery} to remove these methods if chained relation shouldn't have them,\n * for the case of has one/many through.\n */\nexport type CreateMethodsNames =\n | 'create'\n | '_create'\n | 'insert'\n | '_insert'\n | 'createMany'\n | '_createMany'\n | 'insertMany'\n | '_insertMany'\n | 'createRaw'\n | '_createRaw'\n | 'insertRaw'\n | '_insertRaw'\n | 'createFrom'\n | '_createFrom'\n | 'insertFrom'\n | '_insertFrom'\n | 'createManyFrom'\n | '_createManyFrom'\n | 'insertManyFrom'\n | '_insertManyFrom';\n\nexport class Create {\n /**\n * `create` and `insert` will create one record.\n *\n * Each column may accept a specific value, a raw SQL, or a query that returns a single value.\n *\n * ```ts\n * const oneRecord = await db.table.create({\n * name: 'John',\n * password: '1234',\n * });\n *\n * // When using `.onConflict().ignore()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflict().ignore();\n *\n * await db.table.create({\n * // raw SQL\n * column1: db.table.sql`'John' | 'Doe'`,\n *\n * // query that returns a single value\n * // returning multiple values will result in Postgres error\n * column2: db.otherTable.get('someColumn'),\n * });\n * ```\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n create<T extends Query>(this: T, data: CreateData<T>): CreateResult<T> {\n return this.clone()._create(data);\n }\n _create<T extends Query>(this: T, data: CreateData<T>): CreateResult<T> {\n createSelect(this);\n return this._insert(data) as unknown as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link create}, except that it returns inserted row count by default.\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n insert<T extends Query>(this: T, data: CreateData<T>): InsertResult<T> {\n return this.clone()._insert(data);\n }\n _insert<T extends Query>(this: T, data: CreateData<T>): InsertResult<T> {\n const ctx = createCtx();\n const obj = handleOneData(this, data, ctx) as {\n columns: string[];\n values: InsertQueryData['values'];\n };\n\n const values = (this.q as InsertQueryData).values;\n if (values && 'from' in values) {\n obj.columns = getFromSelectColumns(values.from, obj);\n values.values = obj.values as unknown[][];\n obj.values = values;\n }\n\n return insert(this, obj, 'object') as InsertResult<T>;\n }\n\n /**\n * `createMany` and `insertMany` will create a batch of records.\n *\n * Each column may be set with a specific value, a raw SQL, or a query, the same as in {@link create}.\n *\n * In case one of the objects has fewer fields, the `DEFAULT` SQL keyword will be placed in its place in the `VALUES` statement.\n *\n * ```ts\n * const manyRecords = await db.table.createMany([\n * { key: 'value', otherKey: 'other value' },\n * { key: 'value' }, // default will be used for `otherKey`\n * ]);\n *\n * // `createdCount` will be 3.\n * const createdCount = await db.table.insertMany([data, data, data]);\n * ```\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n return this.clone()._createMany(data);\n }\n _createMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n createSelect(this);\n return this._insertMany(data) as unknown as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createMany}, except that it returns inserted row count by default.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n insertMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n return this.clone()._insertMany(data);\n }\n _insertMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n const ctx = createCtx();\n return insert(\n this,\n handleManyData(this, data, ctx),\n 'object',\n true,\n ) as InsertManyResult<T>;\n }\n\n /**\n * `createRaw` and `insertRaw` are for creating one record with a raw SQL expression.\n *\n * Provided SQL will be wrapped into parens for a single `VALUES` record.\n *\n * If the table has a column with runtime defaults (defined with callbacks), the value will be appended to your SQL.\n *\n * `columns` are type-checked to contain all required columns.\n *\n * ```ts\n * const oneRecord = await db.table.createRaw({\n * columns: ['name', 'amount'],\n * values: db.table.sql`'name', random()`,\n * });\n * ```\n *\n * @param args - object with columns list and raw SQL for values\n */\n createRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._createRaw(args[0] as any);\n }\n _createRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateResult<T> {\n createSelect(this);\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link createRaw}, except that it returns inserted row count by default.\n *\n * @param args - object with columns list and raw SQL for values\n */\n insertRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._insertRaw(args[0] as any);\n }\n _insertRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertResult<T> {\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as InsertResult<T>;\n }\n\n /**\n * `createManyRaw` and `insertManyRaw` are for creating many record with raw SQL expressions.\n *\n * Takes array of SQL expressions, each of them will be wrapped into parens for `VALUES` records.\n *\n * If the table has a column with runtime defaults (defined with callbacks), function will be called for each SQL and the value will be appended.\n *\n * `columns` are type-checked to contain all required columns.\n *\n * ```ts\n * const manyRecords = await db.table.createManyRaw({\n * columns: ['name', 'amount'],\n * values: [db.table.sql`'one', 2`, db.table.sql`'three', 4`],\n * });\n * ```\n *\n * @param args - object with columns list and array of raw SQL for values\n */\n createManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateManyResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._createManyRaw(args[0] as any);\n }\n _createManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateManyResult<T> {\n createSelect(this);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._insertManyRaw(args[0] as any) as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createManyRaw}, except that it returns inserted row count by default.\n *\n * @param args - object with columns list and array of raw SQL for values\n */\n insertManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertManyResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._insertManyRaw(args[0] as any);\n }\n _insertManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertManyResult<T> {\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression[] },\n 'raw',\n true,\n ) as InsertManyResult<T>;\n }\n\n /**\n * These methods are for creating a single record, for batch creating see {@link createManyFrom}.\n *\n * `createFrom` is to perform the `INSERT ... SELECT ...` SQL statement, it does select and insert by performing a single query.\n *\n * The first argument is a query for a **single** record, it should have `find`, `take`, or similar.\n *\n * The second optional argument is a data which will be merged with columns returned from the select query.\n *\n * The data for the second argument is the same as in {@link create}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const oneRecord = await db.table.createFrom(\n * // In the select, key is a related table column, value is a column to insert as\n * RelatedTable.select({ relatedId: 'id' }).findBy({ key: 'value' }),\n * // optional argument:\n * {\n * key: 'value',\n * },\n * );\n * ```\n *\n * The query above will produce such SQL:\n *\n * ```sql\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n createFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): CreateResult<T> {\n return this.clone()._createFrom(query, data);\n }\n _createFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): CreateResult<T> {\n createSelect(this);\n return insertFromQuery(this, query, false, data) as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link createFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n insertFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): InsertResult<T> {\n return this.clone()._insertFrom(query, data);\n }\n _insertFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): InsertResult<T> {\n return insertFromQuery(this, query, false, data) as InsertResult<T>;\n }\n\n /**\n * Similar to `createFrom`, but intended to create many records.\n *\n * Unlike `createFrom`, it doesn't accept second argument with data, and runtime defaults cannot work with it.\n *\n * ```ts\n * const manyRecords = await db.table.createManyFrom(\n * RelatedTable.select({ relatedId: 'id' }).where({ key: 'value' }),\n * );\n * ```\n *\n * @param query - query to create new records from\n */\n createManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): CreateManyResult<T> {\n return this.clone()._createManyFrom(query);\n }\n _createManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): CreateManyResult<T> {\n createSelect(this);\n return insertFromQuery(this, query, true) as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createManyFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n */\n insertManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): InsertManyResult<T> {\n return this.clone()._insertManyFrom(query);\n }\n _insertManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): InsertManyResult<T> {\n return insertFromQuery(this, query, true) as InsertManyResult<T>;\n }\n\n /**\n * `defaults` allows setting values that will be used later in `create`.\n *\n * Columns provided in `defaults` are marked as optional in the following `create`.\n *\n * Default data is the same as in [create](#create) and [createMany](#createMany),\n * so you can provide a raw SQL, or a query with a query.\n *\n * ```ts\n * // Will use firstName from defaults and lastName from create argument:\n * db.table\n * .defaults({\n * firstName: 'first name',\n * lastName: 'last name',\n * })\n * .create({\n * lastName: 'override the last name',\n * });\n * ```\n *\n * @param data - default values for `create` and `createMany` which will follow `defaults`\n */\n defaults<T extends Query, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n return (this.clone() as T)._defaults(data);\n }\n _defaults<T extends Query, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n this.q.defaults = data;\n return this as AddQueryDefaults<T, keyof Data>;\n }\n\n /**\n * A modifier for creating queries that specify alternative behavior in the case of a conflict.\n * A conflict occurs when a table has a `PRIMARY KEY` or a `UNIQUE` index on a column\n * (or a composite index on a set of columns) and a row being created has the same value as a row\n * that already exists in the table in this column(s).\n * The default behavior in case of conflict is to raise an error and abort the query.\n *\n * Use `onConflict` to either ignore the error by using `.onConflict().ignore()`,\n * or to update the existing row with new data (perform an \"UPSERT\") by using `.onConflict().merge()`.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflict().ignore();\n *\n * // single column:\n * db.table.create(data).onConfict('email');\n *\n * // array of columns:\n * db.table.create(data).onConfict(['email', 'name']);\n *\n * // raw expression:\n * db.table.create(data).onConfict(db.table.sql`(email) where condition`);\n * ```\n *\n * ::: info\n * The column(s) given to the `onConflict` must either be the table's PRIMARY KEY or have a UNIQUE index on them, or the query will fail to execute.\n * When specifying multiple columns, they must be a composite PRIMARY KEY or have a composite UNIQUE index.\n *\n * You can use the db.table.sql function in onConflict.\n * It can be useful to specify a condition when you have a partial index:\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * active: true,\n * })\n * // ignore only when having conflicting email and when active is true.\n * .onConflict(db.table.sql`(email) where active`)\n * .ignore();\n * ```\n *\n * :::\n *\n * See the documentation on the .ignore() and .merge() methods for more details.\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends Query, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return this.clone()._onConflict(arg);\n }\n _onConflict<\n T extends Query,\n Arg extends OnConflictArg<T> | undefined = undefined,\n >(this: T, arg?: Arg): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as Arg);\n }\n}\n\nexport class OnConflictQueryBuilder<\n T extends Query,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(private query: T, private onConflict: Arg) {}\n\n /**\n * Available only after `onConflict`.\n *\n * `ignore` modifies a create query, and causes it to be silently dropped without an error if a conflict occurs.\n *\n * Adds the `ON CONFLICT (columns) DO NOTHING` clause to the insert statement.\n *\n * It produces `ON CONFLICT DO NOTHING` when no `onConflict` argument provided.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * .onConflict('email')\n * .ignore();\n * ```\n *\n *\n * When there is a conflict, nothing can be returned from the database, that's why `ignore` has to add `| undefined` part to the response type.\n *\n * `create` returns a full record by default, it becomes `RecordType | undefined` after applying `ignore`.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflict()\n * .ignore();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflict()\n * .ignore();\n * ```\n *\n * When creating many records, only the created records will be returned. If no records were created, array will be empty:\n *\n * ```ts\n * // array can be empty\n * const arr = await db.table.createMany([data, data, data]).onConflict().ignore();\n * ```\n */\n ignore(): IgnoreResult<T> {\n const q = this.query;\n (q.q as InsertQueryData).onConflict = {\n type: 'ignore',\n expr: this.onConflict as OnConflictItem,\n };\n\n if (q.q.returnType === 'oneOrThrow') {\n q.q.returnType = 'one';\n } else if (q.q.returnType === 'valueOrThrow') {\n q.q.returnType = 'value';\n }\n\n return q as IgnoreResult<T>;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Modifies a create query, to turn it into an 'upsert' operation.\n *\n * Adds an `ON CONFLICT (columns) DO UPDATE` clause to the insert statement.\n *\n * When no `onConflict` argument provided,\n * it will automatically collect all table columns that have unique index and use them as a conflict target.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * .onConflict('email')\n * .merge();\n * ```\n *\n * This also works with batch creates:\n *\n * ```ts\n * db.table\n * .createMany([\n * { email: 'john@example.com', name: 'John Doe' },\n * { email: 'jane@example.com', name: 'Jane Doe' },\n * { email: 'alex@example.com', name: 'Alex Doe' },\n * ])\n * .onConflict('email')\n * .merge();\n * ```\n *\n * It is also possible to specify a subset of the columns to merge when a conflict occurs.\n * For example, you may want to set a `createdAt` column when creating but would prefer not to update it if the row already exists:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * // string argument for a single column:\n * .merge('email')\n * // array of strings for multiple columns:\n * .merge(['email', 'name', 'updatedAt']);\n * ```\n *\n * It is also possible to specify data to update separately from the data to create.\n * This is useful if you want to make an update with different data than in creating.\n * For example, you may want to change a value if the row already exists:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * .merge({\n * name: 'John Doe The Second',\n * });\n * ```\n *\n * It is also possible to add a WHERE clause to conditionally update only the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * .merge({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * `merge` also accepts raw expression:\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict()\n * .merge(db.table.sql`raw SQL expression`);\n * ```\n *\n * @param update - column, or array of columns, or object for new column values, or raw SQL\n */\n merge(\n update?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | Partial<T['inputType']>\n | Expression,\n ): T {\n (this.query.q as InsertQueryData).onConflict = {\n type: 'merge',\n expr: this.onConflict as OnConflictItem,\n update: update as OnConflictMergeUpdate,\n };\n return this.query;\n }\n}\n","import { Query, SetQueryKind, SetQueryReturnsRowCount } from '../query/query';\nimport { throwIfNoWhere } from '../query/queryUtils';\n\nexport type DeleteMethodsNames = 'del' | '_del' | 'delete' | '_delete';\n\ntype DeleteArgs<T extends Query> = T['meta']['hasWhere'] extends true\n ? []\n : [never];\n\ntype DeleteResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'delete'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'delete'>>;\n\nconst del = <T extends Query>(self: T): DeleteResult<T> => {\n return _del(self.clone()) as unknown as DeleteResult<T>;\n};\n\nconst _del = <T extends Query>(q: T): DeleteResult<T> => {\n if (!q.q.select) {\n q.q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(q, 'delete');\n\n q.q.type = 'delete';\n return q as unknown as DeleteResult<T>;\n};\n\nexport class Delete {\n /**\n * Alias for `delete` method\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n del<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return del(this);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _del<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return _del(this);\n }\n\n /**\n * It is aliased to `del` because `delete` is a reserved word in JavaScript.\n *\n * This method deletes one or more rows, based on other conditions specified in the query.\n *\n * By default, `delete` will return a count of deleted records.\n *\n * Place `select`, `selectAll`, or `get` before `delete` to specify returning columns.\n *\n * Need to provide `where`, `findBy`, or `find` conditions before calling `delete`.\n * To prevent accidental deletion of all records, deleting without where will result in TypeScript and a runtime error.\n *\n * Use `all()` to delete ALL records without conditions:\n *\n * ```ts\n * await db.table.all().delete();\n * ```\n *\n * ```ts\n * // deletedCount is the number of deleted records\n * const deletedCount = await db.table.where(...conditions).delete();\n *\n * // returns a single value, throws if not found\n * const id: number | undefined = await db.table\n * .findBy(...conditions)\n * .get('id')\n * .delete();\n *\n * // returns an array of records with specified columns\n * const deletedRecord = await db.table\n * .select('id', 'name', 'age')\n * .where(...conditions)\n * .delete();\n *\n * // returns an array of fully deleted records\n * const deletedUsersFull = await db.table\n * .selectAll()\n * .where(...conditions)\n * .delete();\n * ```\n *\n * `delete` supports joining, under the hood the join is transformed to `USING` and `WHERE` statements:\n *\n * ```ts\n * // delete all users who have corresponding profile records:\n * db.table.join(Profile, 'profile.userId', 'user.id').all().delete();\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return del(this);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _delete<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return _del(this);\n }\n}\n","import { Query } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { Expression } from 'orchid-core';\nimport { extendQuery } from '../query/queryUtils';\n\ntype ForQueryBuilder<Q extends Query> = Q & {\n noWait<T extends ForQueryBuilder<Q>>(this: T): T;\n _noWait<T extends ForQueryBuilder<Q>>(this: T): T;\n skipLocked<T extends ForQueryBuilder<Q>>(this: T): T;\n _skipLocked<T extends ForQueryBuilder<Q>>(this: T): T;\n};\n\nconst forMethods = {\n noWait<T extends ForQueryBuilder<Query>>(this: T): T {\n return this.clone()._noWait();\n },\n _noWait<T extends ForQueryBuilder<Query>>(this: T): T {\n const q = this.q as SelectQueryData | undefined;\n if (q?.for) q.for.mode = 'NO WAIT';\n return this;\n },\n skipLocked<T extends ForQueryBuilder<Query>>(this: T): T {\n return this.clone()._skipLocked();\n },\n _skipLocked<T extends ForQueryBuilder<Query>>(this: T): T {\n const q = this.q as SelectQueryData | undefined;\n if (q?.for) q.for.mode = 'SKIP LOCKED';\n return this;\n },\n};\n\n// Extends the query with `for` methods, the query is cloned, and sets `for` data.\nconst forQueryBuilder = <T extends Query>(\n q: T,\n type: Exclude<SelectQueryData['for'], undefined>['type'],\n tableNames?: string[] | Expression,\n) => {\n q = extendQuery(q, forMethods);\n\n (q.q as SelectQueryData).for = {\n type,\n tableNames,\n };\n\n return q as ForQueryBuilder<T>;\n};\n\nexport class For {\n forUpdate<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'UPDATE', tableNames);\n }\n\n forNoKeyUpdate<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'NO KEY UPDATE', tableNames);\n }\n\n forShare<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'SHARE', tableNames);\n }\n\n forKeyShare<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'KEY SHARE', tableNames);\n }\n}\n","import { Query } from '../../query/query';\nimport { ColumnsParsers, ColumnsShapeBase } from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { RelationQueryBase } from '../../relations';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport {\n JoinArgs,\n JoinCallback,\n JoinFirstArg,\n JoinLateralCallback,\n JoinLateralResult,\n JoinResult,\n} from './join';\nimport { getQueryAs } from '../../common/utils';\nimport { QueryBase } from '../../query/queryBase';\n\n/**\n * Generic function to construct all JOIN queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param q - query object to join to\n * @param require - true for INNER kind of JOIN\n * @param type - SQL of the JOIN kind: JOIN, LEFT JOIN, RIGHT JOIN, etc.\n * @param args - join arguments to join a query, or `with` table, or a callback returning a query, etc.\n */\nexport const _join = <\n T extends Query,\n Arg extends JoinFirstArg<T>,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n Args extends JoinArgs<T, Arg>,\n>(\n q: T,\n require: RequireJoined,\n type: string,\n args: [arg: Arg, ...args: Args] | [arg: Arg, cb: JoinCallback<T, Arg>],\n): JoinResult<T, Arg, RequireJoined, RequireMain> => {\n let joinKey: string | undefined;\n let shape: ColumnsShapeBase | undefined;\n let parsers: ColumnsParsers | undefined;\n let isSubQuery = false;\n\n if (typeof args[0] === 'function') {\n args[0] = (args[0] as (q: Record<string, Query>) => Arg)(q.relations);\n (\n args[0] as unknown as { joinQueryAfterCallback: unknown }\n ).joinQueryAfterCallback = (\n args[0] as unknown as { joinQuery: unknown }\n ).joinQuery;\n }\n\n const first = args[0];\n\n if (typeof first === 'object') {\n isSubQuery = getIsJoinSubQuery(first.q, first.baseQuery.q);\n\n joinKey = first.q.as || first.table;\n if (joinKey) {\n shape = getShapeFromSelect(first, isSubQuery);\n parsers = first.q.parsers;\n\n if (isSubQuery) {\n args[0] = first.clone() as Arg;\n (args[0] as Query).shape = shape as ColumnsShapeBase;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = q.relations[joinKey];\n if (relation) {\n shape = getShapeFromSelect(relation.relationConfig.query);\n parsers = relation.relationConfig.query.q.parsers;\n } else {\n shape = q.q.withShapes?.[joinKey];\n if (shape) {\n // clone the shape to mutate it below, in other cases the shape is newly created\n if (!require) shape = { ...shape };\n\n parsers = {} as ColumnsParsers;\n for (const key in shape) {\n const parser = shape[key].parseFn;\n if (parser) {\n parsers[key] = parser;\n }\n }\n }\n }\n }\n\n if (joinKey) {\n setQueryObjectValue(q, 'joinedShapes', joinKey, shape);\n setQueryObjectValue(q, 'joinedParsers', joinKey, parsers);\n }\n\n return pushQueryValue(q, 'join', {\n type,\n args,\n isSubQuery,\n }) as unknown as JoinResult<T, Arg, RequireJoined, RequireMain>;\n};\n\n/**\n * Generic function to construct all JOIN LATERAL queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param q - query object to join to\n * @param type - SQL of the JOIN kind: JOIN or LEFT JOIN\n * @param arg - join target: a query, or a relation name, or a `with` table name, or a callback returning a query.\n * @param cb - callback where you can use `on` to join by columns, select needed data from the joined table, add where conditions, etc.\n * @param as - alias of the joined table, it is set the join lateral happens when selecting a relation in `select`\n */\nexport const _joinLateral = <\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n RequireJoined extends boolean,\n>(\n q: T,\n type: string,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n as?: string,\n): JoinLateralResult<T, R, RequireJoined> => {\n let relation: RelationQueryBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = relation.relationConfig.query as Arg;\n } else {\n const shape = q.q.withShapes?.[arg];\n if (shape) {\n const t = Object.create(q.queryBuilder);\n t.table = arg;\n t.shape = shape;\n t.q = {\n ...t.q,\n shape,\n };\n t.baseQuery = t;\n arg = t as Arg;\n }\n }\n }\n\n const query = arg as Query;\n query.q.joinTo = q;\n (query.q.joinedShapes ??= {})[getQueryAs(q)] = q.q.shape;\n let result = cb(query as never);\n\n if (relation) {\n result = relation.relationConfig.joinQuery(\n q,\n result as unknown as Query,\n ) as unknown as R;\n }\n\n const joinKey = as || result.q.as || result.table;\n if (joinKey) {\n const shape = getShapeFromSelect(result, true);\n setQueryObjectValue(q, 'joinedShapes', joinKey, shape);\n setQueryObjectValue(q, 'joinedParsers', joinKey, result.q.parsers);\n }\n\n return pushQueryValue(q, 'join', [\n type,\n result,\n as || getQueryAs(result),\n ]) as JoinLateralResult<T, R, RequireJoined>;\n};\n","import { GetQueryResult, Query, QueryReturnsAll } from '../query/query';\nimport {\n ArrayOfColumnsObjects,\n ColumnsObject,\n JSONTextColumn,\n PluckResultColumnType,\n} from '../columns';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { SelectItem, SelectQueryData } from '../sql';\nimport { QueryResult } from '../adapter';\nimport {\n applyTransforms,\n ColumnsShapeBase,\n ColumnTypeBase,\n emptyArray,\n Expression,\n getValueKey,\n isExpression,\n NullableColumn,\n QueryCatch,\n QueryThen,\n setColumnData,\n setParserToQuery,\n StringKey,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { _joinLateral } from './join/_join';\nimport {\n resolveSubQueryCallback,\n SelectableOrExpression,\n} from '../common/utils';\nimport { RawSQL } from '../sql/rawSql';\n\n// .select method argument.\nexport type SelectArg<T extends Query> = '*' | keyof T['selectable'];\n\n// .select method object argument.\n// Key is alias for selected item,\n// value can be a column, raw, or a function returning query or raw.\ntype SelectAsArg<T extends Query> = Record<string, SelectAsValue<T>>;\n\n// .select method object argument value.\n// Can be column, raw, or a function returning query or raw.\ntype SelectAsValue<T extends Query> =\n | StringKey<keyof T['selectable']>\n | Expression\n | ((q: SelectSubQueryArg<T>) => QueryBase | Expression);\n\ntype SelectSubQueryArg<T extends Query> = {\n [K in keyof T]: K extends keyof T['relations']\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T[K] extends (...args: any) => any\n ? ReturnType<T[K]>\n : T[K]\n : T[K];\n};\n\n// Result type of select without the ending object argument.\ntype SelectResult<\n T extends Query,\n Columns extends SelectArg<T>[],\n Result extends ColumnsShapeBase = {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | PrevResultKeys<T> as K extends keyof T['selectable']\n ? T['selectable'][K]['as']\n : K]: K extends keyof T['selectable']\n ? T['selectable'][K]['column']\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? SetMetaHasSelect<T>\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n// Result type of select with the ending object argument.\ntype SelectResultWithObj<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n Result extends ColumnsShapeBase = {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj\n | PrevResultKeys<T> as K extends keyof T['selectable']\n ? T['selectable'][K]['as']\n : K]: K extends keyof T['selectable']\n ? T['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? SetMetaHasSelect<T>\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : K extends 'selectable'\n ? SelectAsSelectable<T, Obj>\n : T[K];\n};\n\n// Previous result keys to preserve, if the query has select.\ntype PrevResultKeys<T extends Query> = T['meta']['hasSelect'] extends true\n ? keyof T['result']\n : never;\n\n// Merge { hasSelect: true } into 'meta' if it's not true yet.\ntype SetMetaHasSelect<T extends Query> = T['meta']['hasSelect'] extends true\n ? T['meta']\n : {\n [K in keyof T['meta'] | 'hasSelect']: K extends 'hasSelect'\n ? true\n : T['meta'][K];\n };\n\n// Add new 'selectable' types based on the select object argument.\ntype SelectAsSelectable<T extends Query, Arg extends SelectAsArg<T>> = {\n [K in keyof Arg]: Arg[K] extends ((q: never) => infer R extends QueryBase)\n ? // turn union of objects into intersection\n // https://stackoverflow.com/questions/66445084/intersection-of-an-objects-value-types-in-typescript\n (x: {\n [C in keyof R['result'] as `${StringKey<K>}.${StringKey<C>}`]: {\n as: C;\n column: R['result'][C];\n };\n }) => void\n : never;\n}[keyof Arg] extends (x: infer I) => void\n ? {\n [K in keyof T['selectable'] | keyof I]: K extends keyof I\n ? I[K]\n : T['selectable'][K];\n }\n : never;\n\n// map a single value of select object arg into a column\ntype SelectAsValueResult<\n T extends Query,\n Arg extends SelectAsValue<T>,\n> = Arg extends keyof T['selectable']\n ? T['selectable'][Arg]['column']\n : Arg extends Expression\n ? Arg['_type']\n : Arg extends (q: never) => infer R\n ? R extends QueryBase\n ? SelectSubQueryResult<R>\n : R extends Expression\n ? R['_type']\n : R extends QueryBase | Expression\n ?\n | SelectSubQueryResult<Exclude<R, Expression>>\n | Exclude<R, QueryBase>['_type']\n : never\n : never;\n\n// map a sub query result into a column\n// query that returns many becomes an array column\n// query that returns a single value becomes a column of that value\n// query that returns 'pluck' becomes a column with array type of specific value type\n// query that returns a single record becomes an object column, possibly nullable\nexport type SelectSubQueryResult<Arg extends QueryBase> = QueryReturnsAll<\n Arg['returnType']\n> extends true\n ? ArrayOfColumnsObjects<Arg['result']>\n : Arg['returnType'] extends 'valueOrThrow'\n ? Arg['result']['value']\n : Arg['returnType'] extends 'pluck'\n ? PluckResultColumnType<Arg['result']['pluck']>\n : Arg extends { relationConfig: { required: true } }\n ? ColumnsObject<Arg['result']>\n : NullableColumn<ColumnsObject<Arg['result']>>;\n\n// add a parser for a raw expression column\n// is used by .select and .get methods\nexport const addParserForRawExpression = (\n q: Query,\n key: string | getValueKey,\n raw: Expression,\n) => {\n if (raw._type.parseFn) setParserToQuery(q.q, key, raw._type.parseFn);\n};\n\n// these are used as a wrapper to pass sub query result to `parseRecord`\nconst subQueryResult: QueryResult = {\n // sub query can't return a rowCount, use -1 as for impossible case\n rowCount: -1,\n rows: emptyArray,\n fields: emptyArray,\n};\n\n// add parsers when selecting a full joined table by name or alias\nconst addParsersForSelectJoined = (\n q: Query,\n arg: string,\n as: string | getValueKey = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (item) => {\n subQueryResult.rows = [item];\n return q.q.handleResult(q, 'one', subQueryResult, true);\n });\n }\n};\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends Query>(\n q: T,\n as: string | getValueKey | undefined,\n key: string,\n arg: SelectableOrExpression<T> | Query,\n): string | Expression | Query => {\n if (typeof arg === 'object' || typeof arg === 'function') {\n if (isExpression(arg)) {\n addParserForRawExpression(q, key, arg);\n } else {\n const { q: query } = arg;\n if (query.parsers || query.transform) {\n setParserToQuery(q.q, key, (item) => {\n const t = query.returnType || 'all';\n subQueryResult.rows =\n t === 'value' || t === 'valueOrThrow'\n ? [[item]]\n : t === 'one' || t === 'oneOrThrow'\n ? [item]\n : (item as unknown[]);\n\n return applyTransforms(\n query.transform,\n query.handleResult(arg, t, subQueryResult, true),\n );\n });\n }\n }\n } else {\n setParserForSelectedString(q, arg, as, key);\n }\n\n return arg;\n};\n\n// reuse SQL for empty array for JSON agg expressions\nconst emptyArrSQL = new RawSQL(\"'[]'\");\n\n// process select argument: add parsers, join relations when needed\nexport const processSelectArg = <T extends Query>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string | getValueKey,\n): SelectItem => {\n if (typeof arg === 'string') {\n setParserForSelectedString(q, arg, as, columnAs);\n return arg;\n }\n\n const selectAs: Record<string, string | Query | Expression> = {};\n\n for (const key in arg as unknown as SelectAsArg<T>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let value = (arg as unknown as SelectAsArg<T>)[key] as any;\n\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q, value);\n\n if (!isExpression(value) && value.joinQuery) {\n value = value.joinQuery(q, value);\n\n let query;\n const returnType = value.q.returnType;\n if (!returnType || returnType === 'all') {\n query = value.json(false);\n value.q.coalesceValue = emptyArrSQL;\n } else if (returnType === 'pluck') {\n query = value\n .wrap(value.baseQuery.clone())\n .jsonAgg(value.q.select[0]);\n\n value.q.coalesceValue = emptyArrSQL;\n } else {\n if (\n (returnType === 'value' || returnType === 'valueOrThrow') &&\n value.q.select\n ) {\n // todo: investigate what is this for\n if (typeof value.q.select[0] === 'string') {\n value.q.select[0] = {\n selectAs: { r: value.q.select[0] },\n };\n }\n }\n\n query = value;\n }\n\n let asOverride = key;\n\n if (value.q.joinedShapes?.[key]) {\n let suffix = 2;\n const joinOverrides = (q.q.joinOverrides ??= {});\n while (joinOverrides[(asOverride = `${key}${suffix}`)]) {\n suffix++;\n }\n // aliases points to a table in a query\n joinOverrides[asOverride] = asOverride;\n // table name points to an alias\n joinOverrides[key] = asOverride;\n }\n\n value.q.joinedForSelect = asOverride;\n\n _joinLateral(\n q,\n value.q.innerJoinLateral ? 'JOIN' : 'LEFT JOIN',\n query,\n (q) => q,\n key,\n );\n } else if (value.q?.isSubQuery && value.q.expr) {\n value = value.q.expr;\n }\n }\n\n selectAs[key] = addParserForSelectItem(q, as, key, value);\n }\n\n return { selectAs };\n};\n\n// process string select arg\n// adds a column parser for a column\n// when table.* string is provided, sets a parser for a joined table\nexport const setParserForSelectedString = (\n q: Query,\n arg: string,\n as: string | getValueKey | undefined,\n columnAs?: string | getValueKey,\n): void => {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n\n // 'table.*' is selecting a full joined record\n if (column === '*') {\n addParsersForSelectJoined(q, table, columnAs);\n } else {\n if (table === as) {\n const parser = q.q.parsers?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n } else {\n const parser = q.q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n }\n }\n } else {\n const parser = q.q.parsers?.[arg];\n if (parser) setParserToQuery(q.q, columnAs || arg, parser);\n }\n};\n\n// is mapping result of a query into a columns shape\n// in this way, result of a sub query becomes available outside of it for using in WHERE and other methods\n//\n// when isSubQuery is true, it will remove data.name of columns,\n// so that outside of the sub-query the columns are named with app-side names,\n// while db column names are encapsulated inside the sub-query\nexport const getShapeFromSelect = (q: QueryBase, isSubQuery?: boolean) => {\n const query = q.q as SelectQueryData;\n const { select, shape } = query;\n let result: ColumnsShapeBase;\n if (!select) {\n // when no select, and it is a sub-query, return the table shape with unnamed columns\n if (isSubQuery) {\n result = {};\n for (const key in shape) {\n const column = shape[key];\n result[key] = column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n }\n } else {\n result = shape;\n }\n } else {\n result = {};\n for (const item of select) {\n if (typeof item === 'string') {\n addColumnToShapeFromSelect(q, item, shape, query, result, isSubQuery);\n } else if ('selectAs' in item) {\n for (const key in item.selectAs) {\n const it = item.selectAs[key];\n if (typeof it === 'string') {\n addColumnToShapeFromSelect(\n q,\n it,\n shape,\n query,\n result,\n isSubQuery,\n key,\n );\n } else if (isExpression(it)) {\n result[key] = it._type;\n } else {\n const { returnType } = it.q;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n const type = (it.q as SelectQueryData)[getValueKey];\n if (type) result[key] = type;\n } else {\n result[key] = new JSONTextColumn();\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\n// converts selected items into a shape of columns\n// when `isSubQuery` is true, it un-names named columns\nconst addColumnToShapeFromSelect = (\n q: QueryBase,\n arg: string,\n shape: ColumnsShapeBase,\n query: SelectQueryData,\n result: ColumnsShapeBase,\n isSubQuery?: boolean,\n key?: string,\n) => {\n if (q.relations[arg] as unknown as boolean) {\n result[key || arg] = new JSONTextColumn();\n return;\n }\n\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n if (table === (q.q.as || q.table)) {\n result[key || column] = shape[column];\n } else {\n const it = query.joinedShapes?.[table]?.[column];\n if (it) result[key || column] = maybeUnNameColumn(it, isSubQuery);\n }\n } else if (arg === '*') {\n for (const key in shape) {\n result[key] = maybeUnNameColumn(shape[key], isSubQuery);\n }\n } else {\n result[key || arg] = maybeUnNameColumn(shape[arg], isSubQuery);\n }\n};\n\n// un-name a column if `isSubQuery` is true\nconst maybeUnNameColumn = (column: ColumnTypeBase, isSubQuery?: boolean) => {\n return isSubQuery && column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n};\n\nexport class Select {\n /**\n * Takes a list of columns to be selected, and by default, the query builder will select all columns of the table.\n *\n * The last argument can be an object. Keys of the object are column aliases, value can be a column name, sub-query, or raw SQL expression.\n *\n * ```ts\n * // select columns of the table:\n * db.table.select('id', 'name', { idAlias: 'id' });\n *\n * // accepts columns with table names:\n * db.table.select('user.id', 'user.name', { nameAlias: 'user.name' });\n *\n * // table name may refer to the current table or a joined table:\n * db.table\n * .join(Message, 'authorId', 'id')\n * .select('user.name', 'message.text', { textAlias: 'message.text' });\n *\n * // select value from the sub-query,\n * // this sub-query should return a single record and a single column:\n * db.table.select({\n * subQueryResult: Otherdb.table.select('column').take(),\n * });\n *\n * // select raw SQL value, the first argument of `raw` is a column type, it is used for return type of the query\n * db.table.select({\n * raw: db.table.sql((t) => t.integer())`1 + 2`,\n * });\n *\n * // same raw SQL query as above, but raw value is returned from a callback\n * db.table.select({\n * raw: (q) => q.sql((t) => t.integer())`1 + 2`,\n * });\n * ```\n *\n * When you use the ORM and defined relations, `select` can also accept callbacks with related table queries:\n *\n * ```ts\n * await db.author.select({\n * allBooks: (q) => q.books,\n * firstBook: (q) => q.books.order({ createdAt: 'ASC' }).take(),\n * booksCount: (q) => q.books.count(),\n * });\n * ```\n *\n * When you're selecting a relation that's connected via `belongsTo` or `hasOne`, it becomes available to use in `order` or in `where`:\n *\n * ```ts\n * // select books with their authors included, order by author name and filter by author column:\n * await db.books\n * .select({\n * author: (q) => q.author,\n * })\n * .order('author.name')\n * .where({ 'author.isPopular': true });\n * ```\n */\n select<T extends Query, Columns extends SelectArg<T>[]>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n select<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultWithObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(this: Query, ...args: any[]) {\n return this.clone()._select(...args);\n }\n\n _select<T extends Query, Columns extends SelectArg<T>[]>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n _select<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultWithObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _select(this: Query, ...args: any[]) {\n if (!args.length) {\n return this;\n }\n\n const as = this.q.as || this.table;\n const selectArgs = args.map((item) => processSelectArg(this, as, item));\n\n return pushQueryArray(this, 'select', selectArgs);\n }\n\n /**\n * When querying the table or creating records, all columns are selected by default,\n * but updating and deleting queries are returning affected row counts by default.\n *\n * Use `selectAll` to select all columns. If the `.select` method was applied before it will be discarded.\n *\n * ```ts\n * const selectFull = await db.table\n * .select('id', 'name') // discarded by `selectAll`\n * .selectAll();\n *\n * const updatedFull = await db.table.selectAll().where(conditions).update(data);\n *\n * const deletedFull = await db.table.selectAll().where(conditions).delete();\n * ```\n */\n selectAll<T extends Query>(this: T): SelectResult<T, ['*']> {\n return this.clone()._selectAll();\n }\n\n _selectAll<T extends Query>(this: T): SelectResult<T, ['*']> {\n this.q.select = ['*'];\n return this as unknown as SelectResult<T, ['*']>;\n }\n}\n","import {\n Query,\n GetQueryResult,\n SelectableBase,\n SelectableFromShape,\n SetQueryTableAlias,\n WithDataItem,\n} from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport {\n QueryCatch,\n QueryThen,\n Expression,\n TemplateLiteralArgs,\n isExpression,\n} from 'orchid-core';\nimport { getShapeFromSelect } from './select';\nimport { RawSQL } from '../sql/rawSql';\n\nexport type FromArgs<T extends Query> =\n | [\n first: Query | Expression | Exclude<keyof T['withData'], symbol | number>,\n second?: { only?: boolean },\n ]\n | TemplateLiteralArgs;\n\nexport type FromResult<\n T extends Query,\n Args extends FromArgs<T>,\n> = Args extends TemplateStringsArray\n ? T\n : Args[0] extends string\n ? T['withData'] extends Record<string, WithDataItem>\n ? Args[0] extends keyof T['withData']\n ? Omit<T, 'meta' | 'selectable'> & {\n meta: Omit<T['meta'], 'as'> & {\n as?: string;\n };\n selectable: SelectableFromShape<\n T['withData'][Args[0]]['shape'],\n Args[0]\n >;\n }\n : SetQueryTableAlias<T, Args[0]>\n : SetQueryTableAlias<T, Args[0]>\n : Args[0] extends Query\n ? FromQueryResult<T, Args[0]>\n : T;\n\ntype FromQueryResult<\n T extends Query,\n Q extends Query,\n Selectable extends SelectableBase = {\n [K in keyof Q['result']]: K extends string\n ? {\n as: K;\n column: Q['result'][K];\n }\n : never;\n },\n Data = GetQueryResult<T['returnType'], Q['result']>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? Omit<T['meta'], 'hasSelect' | 'as'> & { as: AliasOrTable<Q> }\n : K extends 'selectable'\n ? Selectable\n : K extends 'result' | 'shape'\n ? Q['result']\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport class From {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(Otherdb.table.select('foo', 'bar'));\n *\n * // accepts raw sql by template literal:\n * const value = 123;\n * db.table.from`value = ${value}`;\n *\n * // accepts raw sql:\n * db.table.from(db.table.sql`value = ${value}`);\n *\n * // accepts alias of `WITH` expression:\n * q.with('foo', Otherdb.table.select('id', 'name')).from('foo');\n * ```\n *\n * Optionally takes a second argument of type `{ only?: boolean }`, (see `FROM ONLY` in Postgres docs, this is related to table inheritance).\n *\n * ```ts\n * db.table.from(Otherdb.table.select('foo', 'bar'), {\n * only: true,\n * });\n * ```\n *\n * @param args - query, raw SQL, name of CTE table, or a template string\n */\n from<T extends Query, Args extends FromArgs<T>>(\n this: T,\n ...args: Args\n ): FromResult<T, Args> {\n return this.clone()._from(...args) as FromResult<T, Args>;\n }\n _from<T extends Query, Args extends FromArgs<T>>(\n this: T,\n ...args: Args\n ): FromResult<T, Args> {\n if (Array.isArray(args[0])) {\n return this._from(new RawSQL(args as TemplateLiteralArgs)) as FromResult<\n T,\n Args\n >;\n }\n\n if (typeof args[0] === 'string') {\n this.q.as ||= args[0];\n } else if (!isExpression(args[0])) {\n const q = args[0] as Query;\n this.q.as ||= q.q.as || q.table || 't';\n this.q.shape = getShapeFromSelect(args[0] as Query, true);\n this.q.parsers = q.q.parsers;\n } else {\n this.q.as ||= 't';\n }\n\n const options = args[1] as { only?: boolean } | undefined;\n if (options?.only) {\n (this.q as SelectQueryData).fromOnly = options.only;\n }\n\n this.q.from = args[0] as Query;\n\n return this as unknown as FromResult<T, Args>;\n }\n}\n","import { ColumnTypeBase, Expression } from 'orchid-core';\nimport { SelectAs, SelectItem, SelectQueryData, ToSQLCtx } from '../sql';\nimport { selectAllSql, selectedObjectToSQL } from '../sql/select';\nimport { Query } from '../query/query';\nimport { columnToSql, columnToSqlWithAs } from '../sql/common';\n\n/**\n * Expression that can turn a {@link SelectItem} (except {@link SelectAs}) into SQL.\n * Used by `get` to have an expression that can be chained with operators.\n */\nexport class SelectItemExpression<\n T extends ColumnTypeBase = ColumnTypeBase,\n> extends Expression<T> {\n constructor(\n public q: Query,\n public item: Exclude<SelectItem, SelectAs>,\n public _type: T,\n ) {\n super();\n }\n\n // `makeSQL` acts similarly to how select args are handled,\n // except that it will use non-aliasing `columnToSql` when `ctx.aliasValue` is true,\n // it is needed for relation sub-queries that returns a single column.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return typeof this.item === 'string'\n ? this.item === '*'\n ? selectAllSql(this.q, this.q.q as SelectQueryData, quotedAs)\n : ctx.aliasValue\n ? columnToSql(ctx, this.q.q, this.q.q.shape, this.item, quotedAs, true)\n : columnToSqlWithAs(ctx, this.q.q, this.item, quotedAs, true)\n : selectedObjectToSQL(ctx, this.q, quotedAs, this.item);\n }\n}\n","import {\n Query,\n SetQueryReturnsColumn,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsValue,\n SetQueryReturnsValueOptional,\n} from '../query/query';\nimport {\n addParserForRawExpression,\n setParserForSelectedString,\n} from './select';\nimport {\n ColumnTypeBase,\n Expression,\n getValueKey,\n StringKey,\n} from 'orchid-core';\nimport { SelectQueryData } from '../sql';\nimport { QueryBase } from '../query/queryBase';\nimport { Operators, setQueryOperators } from '../columns/operators';\nimport { SelectItemExpression } from '../common/selectItemExpression';\nimport { UnknownColumn } from '../columns';\nimport { getQueryAs } from '../common/utils';\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryBase> = GetStringArg<T> | Expression;\n\nexport type GetStringArg<T extends QueryBase> = StringKey<\n keyof T['selectable']\n>;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\ntype GetResult<\n T extends Query,\n Arg extends GetArg<T>,\n> = Arg extends GetStringArg<T>\n ? SetQueryReturnsValue<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumn<T, Arg['_type']>\n : never;\n\ntype GetResultOptional<\n T extends Query,\n Arg extends GetArg<T>,\n> = Arg extends GetStringArg<T>\n ? SetQueryReturnsValueOptional<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOptional<T, Arg['_type']>\n : never;\n\n// mutate the query to get a single value\nconst _get = <\n T extends Query,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n q: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n q.q.returnType = returnType;\n\n let type: ColumnTypeBase | undefined;\n if (typeof arg === 'string') {\n type = q.q.shape[arg];\n if (!type) {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n\n if (table === (q.q.as || q.table)) {\n type = q.q.shape[column];\n } else {\n type = q.q.joinedShapes?.[table]?.[column];\n }\n }\n }\n\n (q.q as SelectQueryData)[getValueKey] = type;\n\n setParserForSelectedString(q, arg, getQueryAs(q), getValueKey);\n\n q.q.expr = new SelectItemExpression(q, arg, type || UnknownColumn.instance);\n } else {\n type = arg._type;\n (q.q as SelectQueryData)[getValueKey] = type;\n addParserForRawExpression(q, getValueKey, arg);\n q.q.expr = arg;\n }\n\n q.q.select = [q.q.expr];\n\n return setQueryOperators(\n q,\n type?.operators || Operators.any,\n ) as unknown as GetResult<T, Arg> & GetResultOptional<T, Arg>;\n};\n\nexport class QueryGet {\n /**\n * `.get` returns a single value, it will add `LIMIT 1` to the query, and accepts a column name or a raw expression.\n * It will throw `NotFoundError` when not found.\n *\n * ```ts\n * import { NumberColumn } from 'pqb';\n *\n * const firstName: string = await db.table.get('name');\n *\n * const rawResult: number = await db.table.get(\n * db.table.sql((t) => t.integer())`1 + 1`,\n * );\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n get<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return this.clone()._get(arg);\n }\n\n _get<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return _get(this, 'valueOrThrow', arg);\n }\n\n /**\n * `.getOptional` returns a single value or undefined when not found:\n *\n * ```ts\n * const firstName: string | undefined = await db.table.getOptional('name');\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n getOptional<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return this.clone()._getOptional(arg);\n }\n\n _getOptional<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return _get(this, 'value', arg);\n }\n}\n","import { Query } from '../query/query';\nimport { TemplateLiteralArgs } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { BooleanColumn, BooleanNullable } from '../columns';\n\n// Arguments of `having`:\n// can be a SQL template literal or one or multiple callbacks returning a boolean expression.\ntype HavingArgs<T extends Query> = TemplateLiteralArgs | HavingArgFn<T>[];\n\n// Function argument of `having`:\n// the same query builder as in `select` is passed in, boolean expression is expected to be returned.\ntype HavingArgFn<T extends Query> = (\n q: T,\n) => Query & { result: { value: BooleanColumn | BooleanNullable } };\n\nexport class Having {\n /**\n * Build a `HAVING` clause to the query to filter records by results of [aggregate functions](#aggregate-functions).\n *\n * The argument of `having` is a function where you call the aggregate function and compare it with some value by using [column operators](/guide/where.html#column-operators).\n *\n * ```ts\n * db.table.having((q) => q.count().gte(10));\n * // HAVING count(*) >= 10\n * ```\n *\n * Alternatively, it accepts a raw SQL template:\n *\n * ```ts\n * db.table.having`count(*) >= ${10}`;\n * ```\n *\n * Multiple having conditions will be combined with `AND`:\n *\n * ```ts\n * db.table.having(\n * (q) => q.sum('column').gt(5),\n * (q) => q.avg('column').lt(10),\n * );\n * // HAVING sum(column) > 5 AND avg(column) < 10\n * ```\n *\n * After applying a comparison, `or` and `and` methods become available:\n *\n * ```ts\n * db.table.having((q) =>\n * q.sum('column').equals(5).or(q.min('column').gt(1), q.max('column').lt(10)),\n * );\n * // HAVING (sum(column) = 5) OR (min(column) > 1 AND max(column) < 10)\n * ```\n *\n * Aggregate functions are exactly the same functions described in [aggregate functions](#aggregate-functions), they can accept aggregation options:\n *\n * ```ts\n * db.table.having((q) =>\n * q\n * .count('id', {\n * distinct: true,\n * order: { createdAt: 'DESC', filter: { someColumn: { not: null } } },\n * })\n * .gte(10),\n * );\n * ```\n *\n * Arguments of the aggregate function and of the comparison can be raw SQL:\n *\n * ```ts\n * db.table.having((q) => q.count(q.sql('coalesce(one, two)')).gte(q.sql`2 + 2`));\n * ```\n *\n * @param args - raw SQL template string or one or multiple callbacks returning a boolean expression\n */\n having<T extends Query>(this: T, ...args: HavingArgs<T>): T {\n return this.clone()._having(...args);\n }\n _having<T extends Query>(this: T, ...args: HavingArgs<T>): T {\n return pushQueryValue(\n this,\n 'having',\n 'raw' in args[0]\n ? args\n : args.map((arg) => (arg as HavingArgFn<T>)(this).q.expr),\n );\n }\n}\n","import { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { ColumnsShapeBase, StringKey } from 'orchid-core';\nimport { QueryAfterHook, QueryBeforeHook } from '../sql';\nimport { QueryBase } from '../query/queryBase';\n\n// A function type for after-hook. Constructs type of data argument based on selected columns.\nexport type AfterHook<\n Select extends PropertyKey[],\n Shape extends ColumnsShapeBase,\n Selected extends ColumnsShapeBase = Pick<Shape, StringKey<Select[number]>>,\n Item = { [K in keyof Selected]: Selected[K]['outputType'] },\n> = QueryAfterHook<Item[]>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelect<T extends QueryBase> = (keyof T['shape'])[];\n\n// Possible action types to attach hook for.\nexport type HookAction = 'Create' | 'Update' | 'Delete';\n\n// Save `before` hook into the query.\nconst before = <T extends QueryBase>(\n q: T,\n key: HookAction,\n cb: QueryBeforeHook,\n): T => pushQueryValue(q, `before${key}`, cb);\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends QueryBase, S extends HookSelect<T>>(\n q: T,\n key: HookAction,\n select: S,\n cb: AfterHook<S, T['shape']>,\n commit?: boolean,\n): T =>\n pushQueryArray(\n pushQueryValue(q, `after${key}${commit ? 'Commit' : ''}`, cb),\n `after${key}Select`,\n select,\n );\n\nexport abstract class QueryHooks extends QueryBase {\n /**\n * Run the function before any kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeQuery<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeQuery(cb);\n }\n _beforeQuery<T extends QueryBase>(this: T, cb: QueryBeforeHook): T {\n return pushQueryValue(this, 'before', cb);\n }\n\n /**\n * Run the function after any kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n *\n * @param cb - function to call, first argument is the query result of type `unknown`, second argument is a query object\n */\n afterQuery<T extends QueryHooks>(this: T, cb: QueryAfterHook): T {\n return this.clone()._afterQuery(cb);\n }\n _afterQuery<T extends QueryBase>(this: T, cb: QueryAfterHook): T {\n return pushQueryValue(this, 'after', cb);\n }\n\n /**\n * Run the function before a `create` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeCreate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeCreate(cb);\n }\n _beforeCreate<T extends QueryBase>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Create', cb);\n }\n\n /**\n * Run the function after a `create` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterCreate(select, cb);\n }\n _afterCreate<T extends QueryBase, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Create', select, cb);\n }\n\n /**\n * Run the function after transaction for a `create` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterCreateCommit(select, cb);\n }\n _afterCreateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Create', select, cb, true);\n }\n\n /**\n * Run the function before an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeUpdate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeUpdate(cb);\n }\n _beforeUpdate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Update', cb);\n }\n\n /**\n * Run the function after an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterUpdate(select, cb);\n }\n _afterUpdate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Update', select, cb);\n }\n\n /**\n * Run the function after transaction for an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterUpdateCommit(select, cb);\n }\n _afterUpdateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Update', select, cb, true);\n }\n\n /**\n * Run the function before a `create` or an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeSave<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeSave(cb);\n }\n _beforeSave<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(before(this, 'Create', cb), 'Update', cb);\n }\n\n /**\n * Run the function after a `create` or an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSave<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterSave(select, cb);\n }\n _afterSave<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(after(this, 'Create', select, cb), 'Update', select, cb);\n }\n\n /**\n * Run the function after transaction for a `create` or an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSaveCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterSaveCommit(select, cb);\n }\n _afterSaveCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(\n after(this, 'Create', select, cb, true),\n 'Update',\n select,\n cb,\n true,\n );\n }\n\n /**\n * Run the function before a `delete` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeDelete<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeDelete(cb);\n }\n _beforeDelete<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Delete', cb);\n }\n\n /**\n * Run the function after a `delete` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDelete<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterDelete(select, cb);\n }\n _afterDelete<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Delete', select, cb);\n }\n\n /**\n * Run the function after transaction for a `delete` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDeleteCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterDeleteCommit(select, cb);\n }\n _afterDeleteCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Delete', select, cb, true);\n }\n}\n","import { Query } from '../../query/query';\nimport { ColumnOperators } from '../../sql';\nimport { pushQueryArray, pushQueryValue } from '../../query/queryUtils';\nimport { JoinArgs, JoinCallback, JoinFirstArg } from '../join/join';\nimport {\n applyMixins,\n ColumnsShapeBase,\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n} from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { BooleanNullable } from '../../columns';\nimport { QueryBase } from '../../query/queryBase';\nimport { RawSQL } from '../../sql/rawSql';\nimport { ColumnExpression } from '../../common/fn';\n\n/*\nArgument of `where`:\n- can be an object with special keys `NOT`, `OR`, `IN`, etc.: q.where({ NOT: { key: 'value' } })\n- can be a raw SQL: q.where(q.raw`sql`)\n- can be a special query builder: q.whereNot((q) => q.whereIn(...))\n- can be a nested `where` query to be joined wth `AND`: q.where(q.where(...), q.where(...))\n- can be an object where keys are column names and values can be one of:\n - value to check for equality\n - null for `IS NULL`\n - object with column operators: q.where({ num: { gt: 5 } })\n - raw SQL: q.where({ num: q.raw`sql` })\n - sub query returning a single column: q.where({ num: db.someTable.where(...).get('column') })\n */\nexport type WhereArg<T extends WhereQueryBase> =\n | {\n [K in\n | keyof T['selectable']\n | 'NOT'\n | 'OR'\n | 'IN'\n | 'EXISTS']?: K extends 'NOT'\n ? MaybeArray<WhereArg<T>>\n : K extends 'OR'\n ? MaybeArray<WhereArg<T>>[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['selectable'])[];\n values: unknown[][] | Query | Expression;\n }>\n : K extends keyof T['selectable']\n ?\n | T['selectable'][K]['column']['queryType']\n | null\n | ColumnOperators<T['selectable'], K>\n | Expression\n | Query\n : never;\n }\n | QueryBase\n | Expression\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryBase | ColumnExpression<BooleanNullable>);\n\n/**\n * Callback argument of `where`.\n * It has `where` methods (`where`, `whereNot`, `whereExists`, etc.),\n * and it has relations that you can aggregate and use a boolean comparison with, such as:\n * ```ts\n * db.table.where((q) => q.relation.count().equals(10))\n * ```\n */\nexport type WhereQueryBuilder<T extends WhereQueryBase> = Pick<\n T,\n keyof WhereQueryBase\n> &\n T['relations'];\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends WhereQueryBase> =\n | WhereArg<T>[]\n | TemplateLiteralArgs;\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends QueryBase> =\n | keyof T['selectable']\n | [keyof T['selectable'], ...(keyof T['selectable'])[]];\n\n// If `WhereInColumn` is a single column, it accepts array of values, or Query returning single column, or raw SQL expression.\n// If `WhereInColumn` is a tuple, it accepts a tuple of values described above.\nexport type WhereInValues<\n T extends QueryBase,\n Column extends WhereInColumn<T>,\n> = Column extends keyof T['selectable']\n ? T['selectable'][Column]['column']['queryType'][] | Query | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['selectable']\n ? T['selectable'][Column[I]]['column']['queryType']\n : never;\n } & {\n length: Column extends { length: number } ? Column['length'] : never;\n })[]\n | Query\n | Expression;\n\n// In addition to `WhereInColumn` + `WhereInValues` where user can provide a tuple with columns and a tuple with values, enable `whereIn` with object syntax.\n// Each key is a column name, value is array of column values, or a query returning single column, or a raw SQL expression.\nexport type WhereInArg<T extends Pick<Query, 'selectable'>> = {\n [K in keyof T['selectable']]?:\n | T['selectable'][K]['column']['queryType'][]\n | Query\n | Expression;\n};\n\n// After applying `where`, attach `hasWhere: true` to query meta to allow updating and deleting.\nexport type WhereResult<T extends QueryBase> = T & {\n meta: {\n hasWhere: true;\n };\n};\n\n/**\n * Adds `where` arguments to query data: SQL template string is added as `RawSQL` object, other arguments are added as is.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addWhere = <T extends WhereQueryBase>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n if (Array.isArray(args[0])) {\n return pushQueryValue(\n q,\n 'and',\n new RawSQL(args as TemplateLiteralArgs),\n ) as unknown as WhereResult<T>;\n }\n\n return pushQueryArray(q, 'and', args) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data with a `NOT` keyword: SQL template string is added as `RawSQL` object, other arguments are added as is.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addWhereNot = <T extends WhereQueryBase>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n if (Array.isArray(args[0])) {\n return pushQueryValue(q, 'and', {\n NOT: new RawSQL(args as TemplateLiteralArgs),\n }) as unknown as WhereResult<T>;\n }\n return pushQueryValue(q, 'and', {\n NOT: args,\n }) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data. Arguments will be separated from each other with `OR`.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addOr = <T extends WhereQueryBase>(\n q: T,\n args: WhereArg<T>[],\n): WhereResult<T> => {\n return pushQueryArray(\n q,\n 'or',\n args.map((item) => [item]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data with a `NOT` keyword. Arguments will be separated from each other with `OR`.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addOrNot = <T extends WhereQueryBase>(\n q: T,\n args: WhereArg<T>[],\n): WhereResult<T> => {\n return pushQueryArray(\n q,\n 'or',\n args.map((item) => [{ NOT: item }]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereIn` to add them to query data properly.\n *\n * @param q - query object to add the data to.\n * @param and - `true` to join arguments with `AND`, `false` to join them with `OR.\n * @param arg - `whereIn` argument: can be a single column name, tuple of column names, or object with column names and values.\n * @param values - if the `arg` is a column name or a tuple, `values` are the values for the column/columns. If `arg` is an object, `values` are `undefined`.\n * @param not - adds the `NOT` keyword.\n */\nexport const addWhereIn = <T extends QueryBase>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | unknown[][] | Query | Expression | undefined,\n not?: boolean,\n): WhereResult<T> => {\n const op = not ? 'notIn' : 'in';\n\n let item;\n if (values) {\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n if (not) item = { NOT: item };\n } else {\n item = { [arg as string]: { [op]: values } };\n }\n } else {\n item = {} as Record<string, { in: unknown[] }>;\n for (const key in arg as Record<string, unknown[]>) {\n item[key] = { [op as 'in']: (arg as Record<string, unknown[]>)[key] };\n }\n }\n\n if (and) {\n pushQueryValue(q, 'and', item);\n } else {\n pushQueryValue(q, 'or', [item]);\n }\n\n return q as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereExists`.\n *\n * @param args - first element is a query, or relation name, or `with` alias, or a query builder callback that returns a query. Other arguments have conditions to join the query or a `with` table, no other arguments needed in case of a relation\n */\nconst existsArgs = (args: [JoinFirstArg<Query>, ...JoinArgs<Query, Query>]) => {\n const q = args[0];\n\n let isSubQuery;\n if (typeof q === 'object') {\n isSubQuery = getIsJoinSubQuery(q.q, q.baseQuery.q);\n if (isSubQuery) {\n args[0] = q.clone();\n args[0].shape = getShapeFromSelect(q, true) as ColumnsShapeBase;\n }\n } else {\n isSubQuery = false;\n }\n\n return {\n EXISTS: {\n args,\n isSubQuery,\n },\n } as never;\n};\n\nexport abstract class Where {\n /**\n * Constructing `WHERE` conditions:\n *\n * ```ts\n * db.table.where({\n * // column of the current table\n * name: 'John',\n *\n * // table name may be specified, it can be the name of a joined table\n * 'table.lastName': 'Johnsonuk',\n *\n * // object with operators, see the \"column operators\" section to see a full list of them:\n * age: {\n * gt: 30,\n * lt: 70,\n * },\n *\n * // where column equals to raw SQL\n * column: db.table.sql`raw expression`,\n * });\n * ```\n *\n * Multiple `where`s are joined with `AND`:\n *\n * ```ts\n * db.table.where({ foo: 'foo' }).where({ bar: 'bar' });\n * ```\n *\n * ```sql\n * SELECT * FROM table WHERE foo = 'foo' AND bar = 'bar'\n * ```\n *\n * `undefined` values are ignored, so you can supply a partial object with conditions:\n *\n * ```ts\n * type Params = {\n * // allow providing exact age, or lower or greater than\n * age?: number | { lt?: number; gt?: number };\n * };\n *\n * const loadRecords = async (params: Params) => {\n * // this will load all records if params is an empty object\n * const records = await db.table.where(params);\n * };\n * ```\n *\n * It supports a sub-query that is selecting a single value to compare it with a column:\n *\n * ```ts\n * db.table.where({\n * // compare `someColumn` in one table with the `column` value returned from another query.\n * someColumn: db.otherTable.where(...conditions).get('column'),\n * });\n * ```\n *\n * `where` can accept other queries and merge their conditions:\n *\n * ```ts\n * const otherQuery = db.table.where({ name: 'John' });\n *\n * db.table.where({ id: 1 }, otherQuery);\n * // this will produce WHERE \"table\".\"id\" = 1 AND \"table\".\"name' = 'John'\n * ```\n *\n * `where` supports raw SQL:\n *\n * ```ts\n * db.table.where`a = b`;\n *\n * // or\n * db.table.where(db.table.sql`a = b`);\n *\n * // or\n * import { raw } from 'orchid-orm';\n *\n * db.table.where(raw`a = b`);\n * ```\n *\n * `where` can accept a callback with a specific query builder containing all \"where\" methods such as `where`, `orWhere`, `whereNot`, `whereIn`, `whereExists`:\n *\n * ```ts\n * db.table.where((q) =>\n * q\n * .where({ name: 'Name' })\n * .orWhere({ id: 1 }, { id: 2 })\n * .whereIn('letter', ['a', 'b', 'c'])\n * .whereExists(Message, 'authorId', 'id'),\n * );\n * ```\n *\n * `where` can accept multiple arguments, conditions are joined with `AND`:\n *\n * ```ts\n * db.table.where(\n * { id: 1 },\n * db.table.where({ name: 'John' }),\n * db.table.sql`a = b`,\n * );\n * ```\n *\n * ## where sub query\n *\n * `where` handles a special callback where you can query a relation to get some value and filter by that value.\n *\n * It is useful for a faceted search. For instance, posts have tags, and we want to find all posts that have all the given tags.\n *\n * ```ts\n * const givenTags = ['typescript', 'node.js'];\n *\n * const posts = await db.post.where(\n * (post) =>\n * post.tags // query tags of the post\n * .whereIn('tagName', givenTags) // where name of the tag is inside array\n * .count() // count how many such tags were found\n * .equals(wantedTags.length), // the count must be exactly the length of array\n * // if the post has ony `typescript` tag but not the `node.js` it will be omitted\n * );\n * ```\n *\n * This will produce an efficient SQL query:\n *\n * ```sql\n * SELECT * FROM \"post\"\n * WHERE (\n * SELECT count(*) = 3\n * FROM \"tag\" AS \"tags\"\n * WHERE \"tag\".\"tagName\" IN ('typescript', 'node.js')\n * -- join tags to the post via \"postTag\" table\n * AND EXISTS (\n * SELECT 1 FROM \"postTag\"\n * WHERE \"postTag\".\"postId\" = \"post\".\"id\"\n * AND \"postTag\".\"tagId\" = \"tag\".\"id\"\n * )\n * )\n * ```\n *\n * In the example above we use `count()`, you can also use any other aggregate method instead, such as `min`, `max`, `avg`.\n *\n * The `count()` is chained with `equals` to check for a strict equality, any other operation is also allowed, such as `not`, `lt`, `gt`.\n *\n * ## where special keys\n *\n * The object passed to `where` can contain special keys, each of the keys corresponds to its own method and takes the same value as the type of argument of the method.\n *\n * For example:\n *\n * ```ts\n * db.table.where({\n * NOT: { key: 'value' },\n * OR: [{ name: 'a' }, { name: 'b' }],\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * });\n * ```\n *\n * Using methods `whereNot`, `orWhere`, `whereIn` instead of this is a shorter and cleaner way, but in some cases, such object keys way may be more convenient.\n *\n * ```ts\n * db.table.where({\n * // see .whereNot\n * NOT: { id: 1 },\n * // can be an array:\n * NOT: [{ id: 1 }, { id: 2 }],\n *\n * // see .orWhere\n * OR: [{ name: 'a' }, { name: 'b' }],\n * // can be an array:\n * // this will give id = 1 AND id = 2 OR id = 3 AND id = 4\n * OR: [\n * [{ id: 1 }, { id: 2 }],\n * [{ id: 3 }, { id: 4 }],\n * ],\n *\n * // see .in, the key syntax requires an object with columns and values\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * // can be an array:\n * IN: [\n * {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * { columns: ['someColumn'], values: [['foo', 'bar']] },\n * ],\n * });\n * ```\n *\n * ## column operators\n *\n * `where` argument can take an object where the key is the name of the operator and the value is its argument.\n *\n * Different types of columns support different sets of operators.\n *\n * All column operators can take a value of the same type as the column, a sub-query, or a raw SQL expression:\n *\n * ```ts\n * import { sql } from 'orchid-orm';\n *\n * db.table.where({\n * numericColumn: {\n * // lower than 5\n * lt: 5,\n *\n * // lower than the value returned by sub-query\n * lt: OtherTable.select('someNumber').take(),\n *\n * // raw SQL expression produces WHERE \"numericColumn\" < \"otherColumn\" + 10\n * lt: sql`\"otherColumn\" + 10`,\n * },\n * });\n * ```\n *\n * ### Any type of column operators\n *\n * `equals` is a simple `=` operator, it may be useful for comparing column value with JSON object:\n *\n * ```ts\n * db.table.where({\n * // when searching for an exact same JSON value, this won't work:\n * jsonColumn: someObject,\n *\n * // use `{ equals: ... }` instead:\n * jsonColumn: { equals: someObject },\n * });\n * ```\n *\n * `not` is `!=` (aka `<>`) not equal operator:\n *\n * ```ts\n * db.table.where({\n * anyColumn: { not: value },\n * });\n * ```\n *\n * `in` is for the `IN` operator to check if the column value is included in a list of values.\n *\n * Takes an array of the same type as a column, a sub-query that returns a list of values, or a raw SQL expression that returns a list.\n *\n * ```ts\n * db.table.where({\n * column: {\n * in: ['a', 'b', 'c'],\n *\n * // WHERE \"column\" IN (SELECT \"column\" FROM \"otherTable\")\n * in: OtherTable.select('column'),\n *\n * in: db.table.sql`('a', 'b')`,\n * },\n * });\n * ```\n *\n * `notIn` is for the `NOT IN` operator, and takes the same arguments as `in`\n *\n * ### Numeric, Date, and Time column operators\n *\n * To compare numbers, dates, and times.\n *\n * `lt` is for `<` (lower than)\n *\n * `lte` is for `<=` (lower than or equal)\n *\n * `gt` is for `>` (greater than)\n *\n * `gte` is for `>=` (greater than or equal)\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * gt: 5,\n * lt: 10,\n * },\n *\n * date: {\n * lte: new Date(),\n * },\n *\n * time: {\n * gte: new Date(),\n * },\n * });\n * ```\n *\n * `between` also works with numeric, dates, and time columns, it takes an array of two elements.\n *\n * Both elements can be of the same type as a column, a sub-query, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * column: {\n * // simple values\n * between: [1, 10],\n *\n * // sub-query and raw SQL expression\n * between: [OtherTable.select('column').take(), db.table.sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `char`, `varchar`, and `json` columns.\n *\n * `json` is stored as text, so it has text operators. Use the `jsonb` type for JSON operators.\n *\n * Takes a string, or sub-query returning string, or raw SQL expression as well as other operators.\n *\n * ```ts\n * db.table.where({\n * textColumn: {\n * // WHERE \"textColumn\" LIKE '%string%'\n * contains: 'string',\n * // WHERE \"textColumn\" ILIKE '%string%'\n * containsInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE 'string%'\n * startsWith: 'string',\n * // WHERE \"textColumn\" ILIKE 'string%'\n * startsWithInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE '%string'\n * endsWith: 'string',\n * // WHERE \"textColumn\" ILIKE '%string'\n * endsWithInsensitive: 'string',\n * },\n * });\n * ```\n *\n * ### JSONB column operators\n *\n * For the `jsonb` column, note that the `json` type has text operators instead.\n *\n * `jsonPath` operator: compare a column value under a given JSON path with the provided value.\n *\n * Value can be of any type to compare with JSON value, or it can be a sub-query or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonPath: [\n * '$.name', // first element is JSON path\n * '=', // second argument is comparison operator\n * 'value', // third argument is a value to compare with\n * ],\n * },\n * });\n * ```\n *\n * `jsonSupersetOf`: check if the column value is a superset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1, \"b\": 2 }` and provided value is `{ \"a\": 1 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * `jsonSubsetOf`: check if the column value is a subset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1 }` and provided value is `{ \"a\": 1, \"b\": 2 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n where<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return this.clone()._where(...args);\n }\n _where<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return addWhere(this, args);\n }\n\n /**\n * `whereNot` takes the same arguments as `where` and prepends them with `NOT` in SQL\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return this.clone()._whereNot(...args);\n }\n _whereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return addWhereNot(this, args);\n }\n\n /**\n * `orWhere` is accepting the same arguments as {@link where}, joining arguments with `OR`.\n *\n * Columns in single arguments are still joined with `AND`.\n *\n * The database is processing `AND` before `OR`, so this should be intuitively clear.\n *\n * ```ts\n * db.table.where({ id: 1, color: 'red' }).orWhere({ id: 2, color: 'blue' });\n * // equivalent:\n * db.table.orWhere({ id: 1, color: 'red' }, { id: 2, color: 'blue' });\n * ```\n *\n * This query will produce such SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"table\"\n * WHERE id = 1 AND color = 'red'\n * OR id = 2 AND color = 'blue'\n * ```\n *\n * @param args - {@link WhereArgs} will be joined with `OR`\n */\n orWhere<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return this.clone()._orWhere(...args);\n }\n _orWhere<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return addOr(this, args);\n }\n\n /**\n * `orWhereNot` takes the same arguments as {@link orWhere}, and prepends each condition with `NOT` just as {@link whereNot} does.\n *\n * @param args - {@link WhereArgs} will be prefixed with `NOT` and joined with `OR`\n */\n orWhereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return this.clone()._orWhereNot(...args);\n }\n _orWhereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return addOrNot(this, args);\n }\n\n /**\n * `whereIn` and related methods are for the `IN` operator to check for inclusion in a list of values.\n *\n * When used with a single column it works equivalent to the `in` column operator:\n *\n * ```ts\n * db.table.whereIn('column', [1, 2, 3]);\n * // the same as:\n * db.table.where({ column: [1, 2, 3] });\n * ```\n *\n * `whereIn` can support a tuple of columns, that's what the `in` operator cannot support:\n *\n * ```ts\n * db.table.whereIn(\n * ['id', 'name'],\n * [\n * [1, 'Alice'],\n * [2, 'Bob'],\n * ],\n * );\n * ```\n *\n * It supports sub query which should return records with columns of the same type:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], OtherTable.select('id', 'name'));\n * ```\n *\n * It supports raw SQL expression:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], db.table.sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n whereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link whereIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n whereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n whereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._whereIn(\n arg as any,\n values as any,\n ) as unknown as WhereResult<T>;\n }\n _whereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _whereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _whereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, true, arg, values);\n }\n\n /**\n * Takes the same arguments as {@link whereIn}.\n * Add a `WHERE IN` condition prefixed with `OR` to the query:\n *\n * ```ts\n * db.table.whereIn('a', [1, 2, 3]).orWhereIn('b', ['one', 'two']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n orWhereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link orWhereIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return this.clone()._orWhereIn(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values as any,\n ) as unknown as WhereResult<T>;\n }\n _orWhereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, false, arg, values);\n }\n\n /**\n * Acts as `whereIn`, but negates the condition with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('color', ['red', 'green', 'blue']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n whereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link whereNotIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._whereNotIn(arg as any, values as any);\n }\n _whereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, true, arg, values, true);\n }\n\n /**\n * Acts as `whereIn`, but prepends `OR` to the condition and negates it with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('a', [1, 2, 3]).orWhereNoIn('b', ['one', 'two']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n orWhereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link orWhereNotIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._orWhereNotIn(arg as any, values as any);\n }\n _orWhereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, false, arg, values, true);\n }\n\n /**\n * `whereExists` is for support of the `WHERE EXISTS (query)` clause.\n *\n * This method is accepting the same arguments as `join`, see the {@link Join.join} section for more details.\n *\n * ```ts\n * // find users who have accounts\n * // find by a relation name if it's defined\n * db.user.whereExists('account');\n *\n * // find using a table and a join conditions\n * db.user.whereExists(db.account, 'account.id', 'user.id');\n *\n * // find using a query builder in a callback:\n * db.user.whereExists(db.account, (q) => q.on('account.id', '=', 'user.id'));\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n ...args: JoinArgs<T, Arg>\n ): WhereResult<T>;\n /**\n * See {@link whereExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n whereExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._whereExists(arg, ...args);\n }\n _whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n ...args: JoinArgs<T, Arg>\n ): WhereResult<T>;\n _whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _whereExists(this: WhereQueryBase, ...args: any) {\n return this._where(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR`:\n *\n * ```ts\n * // find users who have an account or a profile,\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereExist('account').orWhereExists('profile');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n orWhereExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link orWhereExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n orWhereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orWhereExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._orWhereExists(arg, ...args);\n }\n _orWhereExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _orWhereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _orWhereExists(this: WhereQueryBase, ...args: any) {\n return this._orWhere(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but negates the condition with `NOT`:\n *\n * ```ts\n * // find users who don't have an account,\n * // image that the user `belongsTo` or `hasOne` account.\n * db.user.whereNotExist('account');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link whereNotExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n whereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n whereNotExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._whereNotExists(arg, ...args);\n }\n _whereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _whereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _whereNotExists(this: WhereQueryBase, ...args: any) {\n return this._whereNot(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR` and negates it with `NOT`:\n *\n * ```ts\n * // find users who don't have an account OR who don't have a profile\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereNotExists('account').orWhereNotExists('profile');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n orWhereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link orWhereNotExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n orWhereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orWhereNotExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._orWhereNotExists(arg, ...args);\n }\n _orWhereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _orWhereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _orWhereNotExists(this: WhereQueryBase, ...args: any) {\n return this._orWhereNot(existsArgs(args));\n }\n}\n\n// Query builder class that only has Where methods.\n// Used for `where` callback argument, and for callback argument of `join`.\nexport interface WhereQueryBase extends Where, QueryBase {}\nexport abstract class WhereQueryBase extends QueryBase {}\napplyMixins(WhereQueryBase, [Where]);\n","import {\n Query,\n GetQueryResult,\n SelectableBase,\n WithDataBase,\n WithDataItem,\n QueryReturnType,\n} from '../../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport { WhereQueryBase } from '../where/where';\nimport { RelationsBase } from '../../relations';\nimport { QueryData } from '../../sql';\nimport {\n Expression,\n StringKey,\n QueryInternal,\n EmptyTuple,\n NullableColumn,\n QueryMetaBase,\n ColumnsShapeBase,\n QueryThen,\n QueryCatch,\n emptyObject,\n} from 'orchid-core';\nimport { _join, _joinLateral } from './_join';\nimport { AliasOrTable } from '../../common/utils';\nimport { ColumnsObject } from '../../columns';\nimport { QueryBase } from '../../query/queryBase';\n\n// Type of column names of a `with` table, to use to join a `with` table by these columns.\n// Union of `with` column names that may be prefixed with a `with` table name.\ntype WithSelectable<\n T extends QueryBase,\n W extends keyof T['withData'],\n> = T['withData'][W] extends WithDataItem\n ?\n | StringKey<keyof T['withData'][W]['shape']>\n | `${T['withData'][W]['table']}.${StringKey<\n keyof T['withData'][W]['shape']\n >}`\n : never;\n\n/**\n * The first argument of all `join` and `joinLateral` methods.\n * See argument of {@link join}.\n */\nexport type JoinFirstArg<T extends QueryBase> =\n | Query\n | keyof T['relations']\n | keyof T['withData']\n | ((q: T['relations']) => Query);\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n> = Arg extends Query\n ? JoinQueryArgs<T, Arg>\n : Arg extends keyof T['relations']\n ? EmptyTuple\n : Arg extends keyof T['withData']\n ? JoinWithArgs<T, Arg>\n : never;\n\n/**\n * Column names of the joined table that can be used to join.\n * Derived from 'result', not from 'shape',\n * because if the joined table has a specific selection, it will be wrapped like:\n * ```sql\n * JOIN (SELECT something FROM joined) joined ON joined.something = ...\n * ```\n * And the selection becomes available to use in the `ON` and to select from the joined table.\n */\ntype JoinSelectable<Q extends Query> =\n | keyof Q['result']\n | `${AliasOrTable<Q>}.${StringKey<keyof Q['result']>}`;\n\n// Available arguments when joining a query object. Can be:\n// - an object where keys are columns of the joined table and values are columns of the main table or a raw SQL.\n// - raw SQL expression\n// - `true` to join without conditions\n// - pair of columns, first is of the joined table, second is of main table\n// - string tuple of a column of a joined table, operator string such as '=' or '!=', and a column of the main table\ntype JoinQueryArgs<T extends QueryBase, Q extends Query> =\n | [\n conditions:\n | Record<JoinSelectable<Q>, keyof T['selectable'] | Expression>\n | Expression\n | true,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n rightColumn: keyof T['selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n op: string,\n rightColumn: keyof T['selectable'] | Expression,\n ];\n\n// Available arguments when joining a `with` table. Can be:\n// - an object where keys are columns of the `with` table and values are columns of the main table or a raw SQL\n// - raw SQL expression\n// - pair of columns, first is of the `with` table, second is of main table\n// - string tuple of a column of a `with` table, operator string such as '=' or '!=', and a column of the main table\ntype JoinWithArgs<T extends QueryBase, W extends keyof T['withData']> =\n | [\n conditions:\n | Record<WithSelectable<T, W>, keyof T['selectable'] | Expression>\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n rightColumn: keyof T['selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n op: string,\n rightColumn: keyof T['selectable'] | Expression,\n ];\n\n/**\n * Result of all `join` methods, not `joinLateral`.\n * Adds joined table columns from its 'result' to the 'selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n * @param RequireMain - when false, main table shape will be mapped to make all columns optional (for right and full join)\n */\nexport type JoinResult<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n Cb extends (q: never) => { meta: QueryMetaBase } = () => {\n meta: QueryMetaBase;\n },\n J extends {\n table?: string;\n meta: QueryMetaBase;\n shape: ColumnsShapeBase;\n } = Arg extends Query\n ? Arg['meta']['hasSelect'] extends true\n ? // If joined query has select, it will be wrapped into a sub-query, use result type as the shape.\n { table: Arg['table']; meta: Arg['meta']; shape: Arg['result'] }\n : // If no select, use its shape. This allows using computed columns.\n Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['table']\n : Arg extends (q: never) => Query\n ? ReturnType<Arg>\n : Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? {\n table: T['withData'][Arg]['table'];\n shape: T['withData'][Arg]['shape'];\n meta: QueryBase['meta'];\n }\n : never\n : never,\n Selectable extends SelectableBase = JoinResultSelectable<\n J,\n RequireJoined,\n ReturnType<Cb>\n >,\n> = RequireMain extends true\n ? JoinAddSelectable<T, Selectable>\n : JoinOptionalMain<T, Selectable>;\n\n/**\n * Result of all `joinLateral` methods.\n * Adds joined table columns from its 'result' to the 'selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n */\nexport type JoinLateralResult<\n T extends Query,\n R extends QueryBase,\n RequireJoined extends boolean,\n Selectable extends SelectableBase = JoinResultSelectable<\n R,\n RequireJoined,\n { meta: QueryMetaBase }\n >,\n> = JoinAddSelectable<T, Selectable>;\n\n/**\n * Build `selectable` type for joined table.\n *\n * When `RequireJoined` parameter is false,\n * the result type of the joined table will be mapped to make all columns optional.\n *\n * Callback may override the joined table alias.\n *\n * The resulting selectable receives all joined table columns prefixed with the table name or alias,\n * and a star prefixed with the table name or alias to select all joined columns.\n */\ntype JoinResultSelectable<\n J extends {\n table?: string;\n meta: QueryMetaBase;\n shape: ColumnsShapeBase;\n },\n RequireJoined extends boolean,\n CbResult extends { meta: QueryMetaBase },\n Result extends ColumnsShapeBase = RequireJoined extends true\n ? J['shape']\n : { [K in keyof J['shape']]: NullableColumn<J['shape'][K]> },\n As extends string = CbResult extends { meta: QueryMetaBase & { as: string } }\n ? CbResult['meta']['as']\n : AliasOrTable<J>,\n> = {\n [K in keyof Result as `${As}.${StringKey<K>}`]: {\n as: K;\n column: Result[K];\n };\n} & {\n [K in As as `${As}.*`]: {\n as: K;\n column: RequireJoined extends true\n ? ColumnsObject<J['shape']>\n : NullableColumn<ColumnsObject<J['shape']>>;\n };\n};\n\n// Replace the 'selectable' of the query with the given selectable.\ntype JoinAddSelectable<T extends Query, Selectable extends SelectableBase> = {\n [K in keyof T]: K extends 'selectable' ? T['selectable'] & Selectable : T[K];\n};\n\n// Map `selectable` of the query to make all columns optional, and add the given `Selectable` to it.\n// Derive and apply a new query result type, where all columns become optional.\ntype JoinOptionalMain<\n T extends Query,\n Selectable extends SelectableBase,\n Result extends ColumnsShapeBase = {\n [K in keyof T['result']]: NullableColumn<T['result'][K]>;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'selectable'\n ? {\n [K in keyof T['selectable']]: {\n as: T['selectable'][K]['as'];\n column: NullableColumn<T['selectable'][K]['column']>;\n };\n } & Selectable\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n/**\n * Map the `with` table first argument of `join` or `joinLateral` to a query type.\n * Constructs `selectable` based on `with` table shape, and adds generic types to conform the `QueryBase` type.\n */\ntype JoinWithArgToQuery<\n With extends WithDataItem,\n Selectable extends SelectableBase = {\n [K in keyof With['shape']]: {\n as: StringKey<K>;\n column: With['shape'][K];\n };\n },\n> = {\n q: QueryData;\n table: With['table'];\n clone<T extends QueryBase>(this: T): T;\n selectable: Selectable & {\n [K in keyof Selectable as `${With['table']}.${StringKey<K>}`]: Selectable[K];\n };\n shape: With['shape'];\n result: With['shape'];\n baseQuery: Query;\n relations: RelationsBase;\n withData: WithDataBase;\n meta: QueryBase['meta'];\n internal: QueryInternal;\n returnType: QueryReturnType;\n};\n\n/**\n * Map the first argument of `join` or `joinLateral` to a query type.\n *\n * `with` table arg is mapped into `QueryBase`,\n * query arg is returned as is,\n * relation name is replaced with a relation table.\n */\ntype JoinArgToQuery<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n> = Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? JoinWithArgToQuery<T['withData'][Arg]>\n : never\n : Arg extends Query\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['table']\n : never;\n\n/**\n * Type of the `join` callback (not `joinLateral`).\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * The query builder is limited to `or` and `where` methods only.\n *\n * Callback must return a query builder.\n */\nexport type JoinCallback<T extends QueryBase, Arg extends JoinFirstArg<T>> = (\n q: OnQueryBuilder<T, JoinArgToQuery<T, Arg>>,\n) => OnQueryBuilder;\n\n/**\n * Type of the `joinLateral`.\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * Query builder inside callback is the query derived from the `joinLateral` first argument,\n * all query methods are allowed, `on` methods are available.\n *\n * The callback must return a query object. Its resulting type will become a type of the joined table.\n */\nexport type JoinLateralCallback<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n Q extends QueryBase = JoinArgToQuery<T, Arg>,\n> = (q: Q & OnQueryBuilder<T, Q>) => R;\n\nexport class Join {\n /**\n * ## Select relation\n *\n * Before joining a table, consider if selecting a relation is enough for your case:\n *\n * ```ts\n * // select users with profiles\n * // result type is Array<{ name: string, profile: Profile }>\n * await db.user.select('name', {\n * profile: (q) => q.profile,\n * });\n *\n * // select posts with counts of comments, order by comments count\n * // result type is Array<Post & { commentsCount: number }>\n * await db.post\n * .select('*', {\n * commentsCount: (q) => q.comments.count(),\n * })\n * .order({\n * commentsCount: 'DESC',\n * });\n *\n * // select authors with array of their book titles\n * // result type is Array<Author & { books: string[] }>\n * await db.author.select('*', {\n * books: (q) => q.books.pluck('title'),\n * });\n * ```\n *\n * Internally, such selects will use `LEFT JOIN LATERAL` to join a relation.\n * If you're loading users with profiles (one-to-one relation), and some users don't have a profile, `profile` property will have `NULL` for such users.\n * If you want to load only users that have profiles, and filter out the rest, add `.join()` method to the relation without arguments:\n *\n * ```ts\n * // load only users who have a profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join(),\n * });\n *\n * // load only users who have a specific profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join().where({ age: { gt: 20 } }),\n * });\n * ```\n *\n * You can also use this `.join()` method on the one-to-many relations, and records with empty array will be filtered out:\n *\n * ```ts\n * // posts that have no tags won't be loaded\n * // result type is Array<Post & { tags: Tag[] }>\n * db.post.select('*', {\n * tags: (q) => q.tags.join(),\n * });\n * ```\n *\n * # Joins\n *\n * `join` methods allows to join other tables, relations by name, [with](/guide/advanced-queries#with) statements, sub queries.\n *\n * All the `join` methods accept the same arguments, but returning type is different because with `join` it's guaranteed to load joined table, and with `leftJoin` the joined table columns may be `NULL` when no matching record was found.\n *\n * For the following examples, imagine we have a `User` table with `id` and `name`, and `Message` table with `id`, `text`, messages belongs to user via `userId` column:\n *\n * ```ts\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(),\n * }));\n *\n * relations = {\n * messages: this.hasMany(() => MessageTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n *\n * export class MessageTable extends BaseTable {\n * readonly table = 'message';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * text: t.text(),\n * ...t.timestamps(),\n * }));\n *\n * relations = {\n * user: this.belongsTo(() => UserTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n * ```\n *\n * ## join\n *\n * `join` is a method for SQL `JOIN`, which is equivalent to `INNER JOIN`, `LEFT INNERT JOIN`.\n *\n * When no matching record is found, it will skip records of the main table.\n *\n * ### join relation\n *\n * When relations are defined between the tables, you can join them by a relation name.\n * Joined table can be references from `where` and `select` by a relation name.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * // after joining a table, we can use it in `where` conditions:\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select(\n * 'name', // name is User column, table name may be omitted\n * 'messages.text', // text is the Message column, and the table name is required\n * );\n *\n * // result has the following type:\n * const ok: { name: string; text: string }[] = result;\n * ```\n *\n * The first argument can also be a callback, where instead of relation name as a string we're picking it as a property of `q`.\n * In such a way, we can alias the relation with `as`, add `where` conditions, use other query methods.\n *\n * ```ts\n * const result = await db.user.join((q) =>\n * q.messages.as('m').where({ text: 'some text' }),\n * );\n * ```\n *\n * Optionally, you can pass a second callback argument, it makes `on` and `orOn` methods available.\n *\n * But remember that when joining a relation, the needed `ON` conditions are already handled automatically.\n *\n * ```ts\n * const result = await db.user.join(\n * (q) => q.messages.as('m'),\n * (q) =>\n * q\n * .on('text', 'name') // additionally, match message with user name\n * .where({ text: 'some text' }), // you can add `where` in a second callback as well.\n * );\n * ```\n *\n * ### Selecting full joined records\n *\n * `select` supports selecting a full record of a previously joined table by passing a table name with `.*` at the end:\n *\n * ```ts\n * const result = await db.book.join('author').select('title', {\n * author: 'author.*',\n * });\n *\n * // result has the following type:\n * const ok: {\n * // title of the book\n * title: string;\n * // a full author record is included:\n * author: { id: number; name: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * It works fine for `1:1` (`belongsTo`, `hasOne`) relations, but it may have an unexpected result for `1:M` or `M:M` (`hasMany`, `hasAndBelongsToMany`) relations.\n * For any kind of relation, it results in one main table record with data of exactly one joined table record, i.e. when selecting in this way, the records **won't** be collected into arrays.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select('name', { messages: 'messages.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * messages: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * Because it's a one-to-many relation, one user has many messages, the user data will be duplicated for different messages data:\n *\n * | name | msg |\n * | ------ | ------------------------------ |\n * | user 1 | `{ id: 1, text: 'message 1' }` |\n * | user 1 | `{ id: 2, text: 'message 2' }` |\n * | user 1 | `{ id: 3, text: 'message 3' }` |\n *\n * ### join table\n *\n * If relation wasn't defined, provide a `db.table` instance and specify columns for the join.\n * Joined table can be references from `where` and `select` by a table name.\n *\n * ```ts\n * // Join message where userId = id:\n * db.user\n * .join(db.message, 'userId', 'id')\n * .where({ 'message.text': { startsWith: 'Hi' } })\n * .select('name', 'message.text');\n * ```\n *\n * Columns in the join list may be prefixed with table names for clarity:\n *\n * ```ts\n * db.user.join(db.message, 'message.userId', 'user.id');\n * ```\n *\n * Joined table can have an alias for referencing it further:\n *\n * ```ts\n * db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', 'm.text');\n * ```\n *\n * Joined table can be selected as an object as well as the relation join above:\n *\n * ```ts\n * const result = await db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', { msg: 'm.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * You can provide a custom comparison operator\n *\n * ```ts\n * db.user.join(db.message, 'userId', '!=', 'id');\n * ```\n *\n * Join can accept raw SQL for the `ON` part of join:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\") = lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * Join can accept raw SQL instead of columns:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\")`,\n * db.user.sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\")`,\n * '!=',\n * db.user.sql`lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * To join based on multiple columns, you can provide an object where keys are joining table columns, and values are main table columns or a raw SQL:\n *\n * ```ts\n * db.user.join(db.message, {\n * userId: 'id',\n *\n * // with table names:\n * 'message.userId': 'user.id',\n *\n * // value can be a raw SQL expression:\n * text: db.user.sql`lower(\"user\".\"name\")`,\n * });\n * ```\n *\n * Join all records without conditions by providing `true`:\n *\n * ```ts\n * db.user.join(db.message, true);\n * ```\n *\n * Join methods can accept a callback with a special query builder that has `on` and `orOn` methods for handling advanced cases:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * (q) =>\n * q\n * // left column is the db.message column, right column is the db.user column\n * .on('userId', 'id')\n * // table names can be provided:\n * .on('message.userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'id') // where message.userId = user.id\n * .orOn('text', 'name'), // or message.text = user.name\n * );\n * ```\n *\n * Join query builder supports all `where` methods: `.where`, `.whereIn`, `.whereExists`, and all `.or`, `.not`, and `.orNot` forms.\n *\n * Column names in the where conditions are applied for the joined table, but you can specify a table name to add a condition for the main table.\n *\n * ```ts\n * db.user.join(db.message, (q) =>\n * q\n * .on('userId', 'id')\n * .where({\n * // not prefixed column name is for joined table:\n * text: { startsWith: 'hello' },\n * // specify a table name to set condition on the main table:\n * 'user.name': 'Bob',\n * })\n * // id is a column of a joined table Message\n * .whereIn('id', [1, 2, 3])\n * // condition for id of a user\n * .whereIn('user.id', [4, 5, 6]),\n * );\n * ```\n *\n * The query above will generate the following SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN \"message\"\n * ON \"message\".\"userId\" = \"user\".\"id\"\n * AND \"message\".\"text\" ILIKE 'hello%'\n * AND \"user\".\"name\" = 'Bob'\n * AND \"message\".\"id\" IN (1, 2, 3)\n * AND \"user\".\"id\" IN (4, 5, 6)\n * ```\n *\n * The join argument can be a query with `select`, `where`, and other methods. In such case, it will be handled as a sub query:\n *\n * ```ts\n * db.user.join(\n * db.message\n * .select('id', 'userId', 'text')\n * .where({ text: { startsWith: 'Hi' } })\n * .as('t'),\n * 'userId',\n * 'id',\n * );\n * ```\n *\n * It will produce such SQL:\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN (\n * SELECT \"t\".\"id\", \"t\".\"userId\", \"t\".\"text\"\n * FROM \"message\" AS \"t\"\n * ) \"t\" ON \"t\".\"userId\" = \"user\".\"id\"\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, true>;\n /**\n * A join variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n join(this: Query, ...args: any) {\n return _join(this.clone(), true, 'JOIN', args);\n }\n _join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, true>;\n _join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _join(this: Query, ...args: any) {\n return _join(this, true, 'JOIN', args);\n }\n\n /**\n * `leftJoin` is a method for SQL `LEFT JOIN`, which is equivalent to `OUTER JOIN`, `LEFT OUTER JOIN`.\n *\n * When no matching record is found, it will fill joined table columns with `NULL` values in the result rows.\n *\n * Works just like `join`, except for result type that may have `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoin('messages')\n * .select('name', 'messages.text');\n *\n * // the same query, but joining table explicitly\n * const result2: typeof result = await db.user\n * .leftJoin(db.message, 'userId', 'id')\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, true>;\n /**\n * A `leftJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n leftJoin(this: Query, ...args: any) {\n return _join(this.clone(), false, 'LEFT JOIN', args);\n }\n _leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, true>;\n _leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _leftJoin(this: Query, ...args: any) {\n return _join(this, false, 'LEFT JOIN', args);\n }\n\n /**\n * `rightJoin` is a method for SQL `RIGHT JOIN`, which is equivalent to `RIGHT OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, and fill the main table columns with `null` when no match is found.\n *\n * The columns of the table you're joining to are becoming nullable when using `rightJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // even though name is not a nullable column, it becomes nullable after using rightJoin\n * const ok: { name: string | null; text: string }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, false>;\n /**\n * A `rightJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rightJoin(this: Query, ...args: any) {\n return _join(this.clone(), true, 'RIGHT JOIN', args);\n }\n _rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, false>;\n _rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _rightJoin(this: Query, ...args: any) {\n return _join(this, true, 'RIGHT JOIN', args);\n }\n\n /**\n * `fullJoin` is a method for SQL `FULL JOIN`, which is equivalent to `FULL OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, both sides of the join may result in `null` values when there is no match.\n *\n * All columns become nullable after using `fullJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // all columns can be null\n * const ok: { name: string | null; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, false>;\n /**\n * A `fullJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fullJoin(this: Query, ...args: any) {\n return _join(this.clone(), false, 'FULL JOIN', args);\n }\n _fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, false>;\n _fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _fullJoin(this: Query, ...args: any) {\n return _join(this, false, 'FULL JOIN', args);\n }\n\n /**\n * `joinLateral` allows joining a table with a sub-query that can reference the main table of current query and the other joined tables.\n *\n * Regular `JOIN` also can have a sub-query in its definition, but it cannot reference other tables of this query.\n *\n * `JOIN LATERAL` of Postgres can have conditions in the `ON` statement, but `Orchid ORM` decided that there are no useful use-cases for such conditions, and it is only building a sub-query.\n *\n * First argument is the other table you want to join, or a name of relation, or a name of `with` defined table.\n *\n * Second argument is a callback where you can reference other tables using `on` and `orOn`, select columns, do `where` conditions, and use any other query methods to build a sub-query.\n *\n * ```ts\n * // joinLateral a Message table, alias it as `m`\n * // without aliasing you can refer to the message by a table name\n * User.joinLateral(Message.as('m'), (q) =>\n * q\n * // select message columns\n * .select('text')\n * // join the message to the user, column names can be prefixed with table names\n * .on('authorId', 'id')\n * // message columns are available without prefixing,\n * // outer table columns are available with a table name\n * .where({ text: 'some text', 'user.name': 'name' })\n * .order({ createdAt: 'DESC' }),\n * )\n * // only selected message columns are available in select and where\n * .select('id', 'name', 'm.text')\n * .where({ 'm.text': messageData.text });\n * ```\n *\n * As well as simple `join`, `joinLateral` can select an object of full joined record:\n *\n * ```ts\n * // join by relation name\n * const result = await User.joinLateral(\n * 'messages',\n * (q) => q.as('message'), // alias to 'message'\n * ).select('name', { message: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * message: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * `message` can be aliased withing the `select` as well as in case of a simple `join`:\n *\n * ```ts\n * // join by relation name\n * const result = await User.joinLateral(\n * 'messages',\n * (q) => q.as('message'), // alias to 'message'\n * ).select('name', { msg: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinLateralCallback}\n */\n joinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, true> {\n return _joinLateral<T, Arg, R, true>(this.clone(), 'JOIN', arg, cb);\n }\n _joinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, true> {\n return _joinLateral<T, Arg, R, true>(this, 'JOIN', arg, cb);\n }\n\n /**\n * The same as {@link joinLateral}, but when no records found for the join it will result in `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoinLateral('messages', (q) => q.as('message'))\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinLateralCallback}\n */\n leftJoinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, false> {\n return _joinLateral<T, Arg, R, false>(this.clone(), 'LEFT JOIN', arg, cb);\n }\n _leftJoinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, false> {\n return _joinLateral<T, Arg, R, false>(this, 'LEFT JOIN', arg, cb);\n }\n}\n\n// Arguments of `on` and `orOn` methods inside `join` callback.\n// Takes a pair of columns to check them for equality, or a pair of columns separated with an operator such as '!='.\ntype OnArgs<Q extends { selectable: SelectableBase }> =\n | [leftColumn: keyof Q['selectable'], rightColumn: keyof Q['selectable']]\n | [\n leftColumn: keyof Q['selectable'],\n op: string,\n rightColumn: keyof Q['selectable'],\n ];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: QueryBase,\n joinFrom: QueryBase,\n args: OnArgs<QueryBase>,\n) => {\n return {\n ON: {\n joinTo,\n joinFrom,\n on: args,\n },\n };\n};\n\n// Add `ON` statement.\nexport const pushQueryOn = <T extends QueryBase>(\n q: T,\n joinFrom: QueryBase,\n joinTo: QueryBase,\n ...on: OnArgs<QueryBase>\n): T => {\n return pushQueryValue(q, 'and', makeOnItem(joinFrom, joinTo, on));\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn: typeof pushQueryOn = (\n q,\n joinFrom,\n joinTo,\n ...on\n) => {\n return pushQueryValue(q, 'or', [makeOnItem(joinFrom, joinTo, on)]);\n};\n\n// Used by the ORM to join relations.\n// Adds a shape of relation to the `joinedShapes`, and adds an `on` statement.\nexport const addQueryOn = <T extends QueryBase>(\n q: T,\n joinFrom: QueryBase,\n joinTo: QueryBase,\n ...args: OnArgs<QueryBase>\n): T => {\n const cloned = q.clone() as typeof q;\n setQueryObjectValue(\n cloned,\n 'joinedShapes',\n (joinFrom.q.as || joinFrom.table) as string,\n joinFrom.q.shape,\n );\n return pushQueryOn(cloned, joinFrom, joinTo, ...args);\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<T extends QueryBase> = [\n leftColumn: keyof T['selectable'],\n leftPath: string,\n rightColumn: keyof T['selectable'],\n rightPath: string,\n];\n\n// Query builder with `or` methods that is passed to the `join` and `joinLateral` callbacks.\nexport class OnQueryBuilder<\n S extends QueryBase = QueryBase,\n J extends QueryBase = QueryBase,\n> extends WhereQueryBase {\n declare selectable: J['selectable'] & Omit<S['selectable'], keyof S['shape']>;\n declare relations: J['relations'];\n declare result: J['result'];\n shape: J['shape'];\n baseQuery: Query;\n withData = emptyObject;\n internal: QueryInternal;\n\n constructor(\n q: QueryBase,\n { shape, joinedShapes }: Pick<QueryData, 'shape' | 'joinedShapes'>,\n joinTo: QueryBase,\n ) {\n super();\n this.internal = q.internal;\n this.table = typeof q === 'object' ? q.table : q;\n this.shape = shape;\n this.q = {\n shape: shape as ColumnsShapeBase,\n joinedShapes,\n } as QueryData;\n this.baseQuery = this as unknown as Query;\n if (typeof q === 'object' && q.q.as) {\n this.q.as = q.q.as;\n }\n this.q.joinTo = joinTo;\n }\n\n /**\n * Use `on` to specify columns to join records.\n *\n * ```ts\n * q\n * // left column is the db.message column, right column is the db.user column\n * .on('userId', 'id')\n * // table names can be provided:\n * .on('message.userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'id') // where message.userId = user.id\n * ```\n *\n * @param args - columns to join with\n */\n on<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return this.clone()._on(...args);\n }\n _on<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return pushQueryOn(this, this.q.joinTo as QueryBase, this, ...args);\n }\n\n /**\n * Works as {@link on}, but the added conditions will be separated from previous with `OR`.\n *\n * @param args - columns to join with\n */\n orOn<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return this.clone()._orOn(...args);\n }\n _orOn<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return pushQueryOrOn(this, this.q.joinTo as QueryBase, this, ...args);\n }\n\n /**\n * Use `onJsonPathEquals` to join record based on a field of their JSON column:\n *\n * ```ts\n * db.table.join(db.otherTable, (q) =>\n * // '$.key' is a JSON path\n * q.onJsonPathEquals('otherTable.data', '$.key', 'table.data', '$.key'),\n * );\n * ```\n *\n * @param args - columns and JSON paths to join with.\n */\n onJsonPathEquals<T extends OnQueryBuilder>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T>\n ): T {\n return this.clone()._onJsonPathEquals(...args);\n }\n _onJsonPathEquals<T extends OnQueryBuilder>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T>\n ): T {\n return pushQueryValue(this, 'and', { ON: args });\n }\n}\n","import {\n AddQuerySelect,\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../query/query';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { ColumnType, StringColumn } from '../columns';\nimport { JsonItem, SelectQueryData } from '../sql';\nimport { StringKey, ColumnTypeBase } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { RawSQL } from '../sql/rawSql';\n\n// union of column names that have a `jsonb` type\ntype JsonColumnName<T extends QueryBase> = StringKey<\n {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['dataType'] extends 'jsonb'\n ? K\n : never;\n }[keyof T['selectable']]\n>;\n\n// union of `jsonb` column names, or a JsonItem type for nesting json methods one in other\ntype ColumnOrJsonMethod<T extends QueryBase> = JsonColumnName<T> | JsonItem;\n\n// result of `jsonSet`:\n// adds a select to a query,\n// adds a `JsonItem` properties that allows nesting of json methods\ntype JsonSetResult<\n T extends QueryBase,\n Column extends ColumnOrJsonMethod<T>,\n As extends string,\n Type extends ColumnTypeBase = Column extends keyof T['shape']\n ? T['shape'][Column]\n : Column extends JsonItem\n ? Column['__json'][2]\n : ColumnTypeBase,\n> = JsonItem<As, Type> & AddQuerySelect<T, Record<As, Type>>;\n\n// result of `jsonPathQuery`:\n// adds a select to a query,\n// adds a `JsonItem` properties that allows nesting of json methods\ntype JsonPathQueryResult<\n T extends QueryBase,\n As extends string,\n Type extends ColumnType,\n> = JsonItem &\n AddQuerySelect<\n T,\n {\n [K in As]: Type;\n }\n >;\n\nexport abstract class JsonModifiers extends QueryBase {\n /**\n * Return a JSON value/object/array where a given value is set at the given path.\n * The path is an array of keys to access the value.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * const result = await db.table.jsonSet('data', ['name'], 'new value').take();\n *\n * expect(result.data).toEqual({ name: 'new value' });\n * ```\n *\n * Optionally takes parameters of type `{ as?: string, createIfMissing?: boolean }`\n *\n * ```ts\n * await db.table.jsonSet('data', ['name'], 'new value', {\n * as: 'alias', // select data as `alias`\n * createIfMissing: true, // ignored if missing by default\n * });\n * ```\n *\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to value inside the json\n * @param value - value to set into the json\n * @param options - `as` to alias the json value when selecting, `createIfMissing: true` will create a new JSON property if it didn't exist before\n */\n jsonSet<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n createIfMissing?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonSet(column, path, value, options);\n }\n _jsonSet<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n createIfMissing?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'set',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n value,\n options,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Return a JSON value/object/array where a given value is inserted at the given JSON path. Value can be a single value or JSON object. If a value exists at the given path, the value is not replaced.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * // imagine user has data = { tags: ['two'] }\n * const result = await db.table.jsonInsert('data', ['tags', 0], 'one').take();\n *\n * // 'one' is inserted to 0 position\n * expect(result.data).toEqual({ tags: ['one', 'two'] });\n * ```\n *\n * Optionally takes parameters of type `{ as?: string, insertAfter?: boolean }`\n *\n * ```ts\n * // imagine user has data = { tags: ['one'] }\n * const result = await db.table\n * .jsonInsert('data', ['tags', 0], 'two', {\n * as: 'alias', // select as an alias\n * insertAfter: true, // insert after the specified position\n * })\n * .take();\n *\n * // 'one' is inserted to 0 position\n * expect(result.alias).toEqual({ tags: ['one', 'two'] });\n * ```\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to the array inside the json, last path element is index to insert into\n * @param value - value to insert into the json array\n * @param options - `as` to alias the json value when selecting, `insertAfter: true` to insert after the specified position\n */\n jsonInsert<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n insertAfter?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonInsert(column, path, value, options);\n }\n _jsonInsert<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n insertAfter?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'insert',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n value,\n options,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Return a JSON value/object/array where a given value is removed at the given JSON path.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * // imagine a user has data = { tags: ['one', 'two'] }\n * const result = await db.table\n * .jsonRemove(\n * 'data',\n * ['tags', 0],\n * // optional parameters:\n * {\n * as: 'alias', // select as an alias\n * },\n * )\n * .take();\n *\n * expect(result.alias).toEqual({ tags: ['two'] });\n * ```\n *\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to the array inside the json, last path element is index to remove this element\n * @param options - `as` to alias the json value when selecting\n */\n jsonRemove<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n options?: { as?: As },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonRemove(column, path, options);\n }\n _jsonRemove<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n options?: { as?: As },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'remove',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * ```ts\n * import { columnTypes } from 'pqb';\n *\n * db.table.jsonPathQuery(\n * columnTypes.text(3, 100), // type of the value\n * 'data', // name of the JSON column\n * '$.name', // JSON path\n * 'name', // select value as name\n *\n * // Optionally supports `vars` and `silent` options\n * // check Postgres docs for jsonb_path_query for details\n * {\n * vars: 'vars',\n * silent: true,\n * },\n * );\n * ```\n *\n * Nested JSON operations can be used in place of JSON column name:\n *\n * ```ts\n * db.table.jsonPathQuery(\n * columnTypes.text(3, 100),\n * // Available: .jsonSet, .jsonInsert, .jsonRemove\n * db.table.jsonSet('data', ['key'], 'value'),\n * '$.name',\n * 'name',\n * );\n * ```\n *\n * @param type - provide a column type to have a correct result type\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - special JSON path string to reference a JSON value\n * @param as - optional alias for the selected value\n * @param options - supports `vars` and `silent`, check Postgres docs of `json_path_query` for these\n */\n jsonPathQuery<\n T extends JsonModifiers,\n As extends string,\n Type extends ColumnType,\n >(\n this: T,\n type: Type,\n column: ColumnOrJsonMethod<T>,\n path: string,\n as: As,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ): JsonPathQueryResult<T, As, Type> {\n const q = this.clone() as T;\n return q._jsonPathQuery(type, column, path, as, options);\n }\n _jsonPathQuery<\n T extends JsonModifiers,\n As extends string,\n Type extends ColumnType,\n >(\n this: T,\n type: Type,\n column: ColumnOrJsonMethod<T>,\n path: string,\n as: As,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ): JsonPathQueryResult<T, As, Type> {\n const json: JsonItem = {\n __json: ['pathQuery', as, type, column, path, options],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonPathQueryResult<T, As, Type>;\n }\n}\n\nexport abstract class JsonMethods {\n /**\n * Wraps the query in a way to select a single JSON string.\n * So that JSON encoding is done on a database side, and the application doesn't have to turn a response to a JSON.\n * It may be better for performance in some cases.\n *\n * ```ts\n * // json is a JSON string that you can directly send as a response.\n * const json = await db.table.select('id', 'name').json();\n * ```\n *\n * @param coalesce\n */\n json<T extends Query>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, StringColumn> {\n return this.clone()._json(coalesce);\n }\n _json<T extends Query>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, StringColumn> {\n const q = this._wrap(this.baseQuery.clone()) as unknown as T;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n q._getOptional(\n new RawSQL(\n queryTypeWithLimitOne[this.q.returnType]\n ? `row_to_json(\"t\".*)`\n : coalesce !== false\n ? `COALESCE(json_agg(row_to_json(\"t\".*)), '[]')`\n : 'json_agg(row_to_json(\"t\".*))',\n ),\n );\n\n // to skip LIMIT 1\n (q.q as SelectQueryData).returnsOne = true;\n\n return q as unknown as SetQueryReturnsColumnOptional<T, StringColumn>;\n }\n}\n","import { Query } from '../query/query';\nimport { quote } from '../quote';\nimport { Sql } from 'orchid-core';\n\nexport type QueryLogObject = {\n colors: boolean;\n beforeQuery(sql: Sql): unknown;\n afterQuery(sql: Sql, logData: unknown): void;\n onError(error: Error, sql: Sql, logData: unknown): void;\n};\n\nexport type QueryLogger = {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\nexport type QueryLogOptions = {\n log?: boolean | Partial<QueryLogObject>;\n logger?: QueryLogger;\n};\n\nexport const logColors = {\n boldCyanBright: (message: string) =>\n `\\u001b[1m\\u001b[96m${message}\\u001b[39m\\u001b[22m`,\n\n boldBlue: (message: string) =>\n `\\u001b[1m\\u001b[34m${message}\\u001b[39m\\u001b[22m`,\n\n boldYellow: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldMagenta: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldRed: (message: string) =>\n `\\u001b[1m\\u001b[31m${message}\\u001b[39m\\u001b[22m`,\n};\n\nconst makeMessage = (\n colors: boolean,\n timeColor: (message: string) => string,\n time: [number, number],\n sqlColor: (message: string) => string,\n sql: string,\n valuesColor: (message: string) => string,\n values: unknown[],\n): string => {\n const elapsed = process.hrtime(time);\n const formattedTime = `(${elapsed[0] ? `${elapsed[0]}s ` : ''}${(\n elapsed[1] / 1000000\n ).toFixed(1)}ms)`;\n\n const result = `${colors ? timeColor(formattedTime) : formattedTime} ${\n colors ? sqlColor(sql) : sql\n }`;\n\n if (!values.length) {\n return result;\n }\n\n const formattedValues = `[${values.map(quote).join(', ')}]`;\n\n return `${result} ${colors ? valuesColor(formattedValues) : formattedValues}`;\n};\n\nexport const logParamToLogObject = (\n logger: QueryLogger,\n log: QueryLogOptions['log'],\n): QueryLogObject | undefined => {\n if (!log) return;\n const logObject = Object.assign(\n {\n colors: true,\n beforeQuery() {\n return process.hrtime();\n },\n afterQuery(sql, time: [number, number]) {\n logger.log(\n makeMessage(\n colors,\n logColors.boldCyanBright,\n time,\n logColors.boldBlue,\n sql.text,\n logColors.boldYellow,\n sql.values,\n ),\n );\n },\n onError(error, sql, time: [number, number]) {\n const message = `Error: ${error.message}`;\n\n logger.error(\n `${makeMessage(\n colors,\n logColors.boldMagenta,\n time,\n logColors.boldRed,\n sql.text,\n logColors.boldYellow,\n sql.values,\n )} ${colors ? logColors.boldRed(message) : message}`,\n );\n },\n } as QueryLogObject,\n log === true ? {} : log,\n );\n\n const colors = logObject.colors;\n\n return logObject;\n};\n\nexport class QueryLog {\n log<T extends Query>(this: T, log = true): T {\n return this.clone()._log(log);\n }\n\n _log<T extends Query>(this: T, log = true): T {\n this.q.log = logParamToLogObject(this.q.logger, log);\n return this;\n }\n}\n","import { Query, QueryReturnType, GetQueryResult } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport {\n ColumnsShapeBase,\n getValueKey,\n MergeObjects,\n QueryCatch,\n QueryThen,\n} from 'orchid-core';\n\nexport type MergeQuery<\n T extends Query,\n Q extends Query,\n ReturnType extends QueryReturnType = QueryReturnType extends Q['returnType']\n ? T['returnType']\n : Q['returnType'],\n Result extends ColumnsShapeBase = T['meta']['hasSelect'] extends true\n ? Q['meta']['hasSelect'] extends true\n ? {\n [K in\n | keyof T['result']\n | keyof Q['result']]: K extends keyof Q['result']\n ? Q['result'][K]\n : T['result'][K];\n }\n : T['result']\n : Q['result'],\n Data = GetQueryResult<ReturnType, Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? MergeObjects<T['meta'], Q['meta']>\n : K extends 'result'\n ? Result\n : K extends 'returnType'\n ? ReturnType\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : K extends 'selectable'\n ? MergeObjects<T['selectable'], Q['selectable']>\n : K extends 'windows'\n ? MergeObjects<T['windows'], Q['windows']>\n : K extends 'withData'\n ? MergeObjects<T['withData'], Q['withData']>\n : T[K];\n};\n\nconst mergableObjects: Record<string, boolean> = {\n shape: true,\n withShapes: true,\n parsers: true,\n defaults: true,\n joinedShapes: true,\n joinedParsers: true,\n};\n\nexport class MergeQueryMethods {\n merge<T extends Query, Q extends Query>(this: T, q: Q): MergeQuery<T, Q> {\n return this.clone()._merge(q);\n }\n _merge<T extends Query, Q extends Query>(this: T, q: Q): MergeQuery<T, Q> {\n const a = this.q as Record<string, unknown>;\n const b = q.q as Record<string, unknown>;\n\n for (const key in b) {\n const value = b[key];\n switch (typeof value) {\n case 'boolean':\n case 'string':\n case 'number':\n a[key] = value;\n break;\n case 'object':\n if (Array.isArray(value)) {\n a[key] = a[key] ? [...(a[key] as unknown[]), ...value] : value;\n } else if (mergableObjects[key]) {\n a[key] = a[key]\n ? { ...(a[key] as Record<string, unknown>), ...value }\n : value;\n } else {\n a[key] = value;\n }\n break;\n }\n }\n\n (a as SelectQueryData)[getValueKey] = (b as SelectQueryData)[getValueKey];\n\n if (b.returnType) a.returnType = b.returnType;\n\n return this as unknown as MergeQuery<T, Q>;\n }\n}\n","import { Query, QueryReturnType } from '../query/query';\nimport { NotFoundError, QueryError } from '../errors';\nimport { QueryArraysResult, QueryResult } from '../adapter';\nimport {\n CommonQueryData,\n QueryAfterHook,\n QueryBeforeHook,\n QueryHookSelect,\n} from '../sql';\nimport pg from 'pg';\nimport {\n AdapterBase,\n callWithThis,\n ColumnParser,\n ColumnsParsers,\n emptyArray,\n getValueKey,\n Sql,\n TransactionState,\n} from 'orchid-core';\n\nexport const queryMethodByReturnType: Record<\n QueryReturnType,\n 'query' | 'arrays'\n> = {\n all: 'query',\n rows: 'arrays',\n pluck: 'arrays',\n one: 'query',\n oneOrThrow: 'query',\n value: 'arrays',\n valueOrThrow: 'arrays',\n rowCount: 'arrays',\n void: 'arrays',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Resolve = (result: any) => any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Reject = (error: any) => any;\n\nexport class Then {\n then!: (this: Query, resolve?: Resolve, reject?: Reject) => Promise<unknown>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n catch(this: Query, fn: (reason: any) => unknown) {\n return this.then(undefined, fn);\n }\n}\n\n// For storing error with the stacktrace leading to the code which calls `await query`,\n// using it later when catching query error.\nlet queryError: Error = undefined as unknown as Error;\n\n// `query.then` getter: it must be a getter to store the error with stacktrace prior to executing `await`.\nlet getThen: (this: Query) => typeof Then.prototype.then;\n\n// workaround for the bun issue: https://github.com/romeerez/orchid-orm/issues/198\nif (process.versions.bun) {\n getThen = function (this: Query) {\n queryError = new Error();\n\n // In rake-db `then` might be called on a lightweight query object that has no `internal`.\n if (!this.internal) return maybeWrappedThen;\n\n // Value in the store exists only before the call of the returned function.\n const trx = this.internal.transactionStorage.getStore();\n if (!trx) return maybeWrappedThen;\n\n return (resolve, reject) => {\n // Here `transactionStorage.getStore()` returns undefined,\n // need to set the `trx` value to the store to workaround the bug.\n return this.internal.transactionStorage.run(trx, () => {\n return maybeWrappedThen.call(this, resolve, reject);\n });\n };\n };\n} else {\n getThen = function () {\n queryError = new Error();\n return maybeWrappedThen;\n };\n}\n\nObject.defineProperty(Then.prototype, 'then', {\n get: getThen,\n set(value) {\n Object.defineProperty(this, 'then', {\n value,\n });\n },\n});\n\nexport const handleResult: CommonQueryData['handleResult'] = (\n q,\n returnType,\n result: QueryResult,\n isSubQuery?: true,\n) => {\n return parseResult(q, q.q.parsers, returnType, result, isSubQuery);\n};\n\nfunction maybeWrappedThen(\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n): Promise<unknown> {\n const { q } = this;\n\n let beforeHooks: QueryBeforeHook[] | undefined;\n let afterHooks: QueryAfterHook[] | undefined;\n let afterCommitHooks: QueryAfterHook[] | undefined;\n if (q.type) {\n if (q.type === 'insert') {\n beforeHooks = q.beforeCreate;\n afterHooks = q.afterCreate;\n afterCommitHooks = q.afterCreateCommit;\n } else if (q.type === 'update') {\n beforeHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterCommitHooks = q.afterUpdateCommit;\n } else if (q.type === 'delete') {\n beforeHooks = q.beforeDelete;\n afterHooks = q.afterDelete;\n afterCommitHooks = q.afterDeleteCommit;\n }\n }\n\n const trx = this.internal.transactionStorage.getStore();\n if ((q.wrapInTransaction || afterHooks) && !trx) {\n return this.transaction(\n () =>\n new Promise((resolve, reject) => {\n const trx =\n this.internal.transactionStorage.getStore() as TransactionState;\n return then(\n this,\n trx.adapter,\n trx,\n beforeHooks,\n afterHooks,\n afterCommitHooks,\n resolve,\n reject,\n );\n }),\n ).then(resolve, reject);\n } else {\n return then(\n this,\n trx?.adapter || this.q.adapter,\n trx,\n beforeHooks,\n afterHooks,\n afterCommitHooks,\n resolve,\n reject,\n );\n }\n}\n\nconst queriesNames: Record<string, string> = {};\nlet nameI = 0;\n\nconst callAfterHook = function (\n this: [result: unknown[], q: Query],\n cb: QueryAfterHook,\n): Promise<unknown> | unknown {\n return cb(this[0], this[1]);\n};\n\nconst then = async (\n q: Query,\n adapter: AdapterBase,\n trx?: TransactionState,\n beforeHooks?: QueryBeforeHook[],\n afterHooks?: QueryAfterHook[],\n afterCommitHooks?: QueryAfterHook[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve?: (result: any) => any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reject?: (error: any) => any,\n): Promise<unknown> => {\n const { q: query } = q;\n\n let sql: (Sql & { name?: string }) | undefined;\n let logData: unknown | undefined;\n\n // save error to a local variable before async operations\n const localError = queryError;\n\n try {\n if (beforeHooks || query.before) {\n await Promise.all(\n [...(beforeHooks || emptyArray), ...(query.before || emptyArray)].map(\n callWithThis,\n q,\n ),\n );\n }\n\n sql = q.toSQL();\n const { hookSelect } = sql;\n\n if (query.autoPreparedStatements) {\n sql.name =\n queriesNames[sql.text] ||\n (queriesNames[sql.text] = (nameI++).toString(36));\n }\n\n if (query.log) {\n logData = query.log.beforeQuery(sql);\n }\n\n const { returnType = 'all' } = query;\n const returns = hookSelect ? 'all' : returnType;\n\n const queryResult = (await adapter[\n hookSelect ? 'query' : (queryMethodByReturnType[returnType] as 'query')\n ](sql)) as QueryResult;\n\n if (query.patchResult) {\n await query.patchResult(q, queryResult);\n }\n\n if (query.log) {\n query.log.afterQuery(sql, logData);\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n }\n\n let result = query.handleResult(q, returns, queryResult);\n\n if (afterHooks || afterCommitHooks || query.after) {\n if (queryResult.rowCount) {\n if (afterHooks || query.after) {\n const args = [result, q];\n await Promise.all(\n [...(afterHooks || emptyArray), ...(query.after || emptyArray)].map(\n callAfterHook,\n args,\n ),\n );\n }\n\n // afterCommitHooks are executed later after transaction commit,\n // or, if we don't have transaction, they are executed intentionally after other after hooks\n if (afterCommitHooks && trx) {\n (trx.afterCommit ??= []).push(\n result as unknown[],\n q,\n afterCommitHooks,\n );\n } else if (afterCommitHooks) {\n const args = [result, q];\n await Promise.all(afterCommitHooks.map(callAfterHook, args));\n }\n } else if (query.after) {\n const args = [result, q];\n await Promise.all(query.after.map(callAfterHook, args));\n }\n\n if (hookSelect)\n result = filterResult(q, returnType, queryResult, hookSelect, result);\n }\n\n if (query.transform) {\n for (const fn of query.transform) {\n result = fn(result);\n }\n }\n\n return resolve?.(result);\n } catch (err) {\n let error;\n if (err instanceof pg.DatabaseError) {\n error = new (q.error as unknown as new () => QueryError)();\n assignError(error, err);\n error.cause = localError;\n } else {\n error = err;\n if (error instanceof Error) {\n error.cause = localError;\n }\n }\n\n if (query.log && sql) {\n query.log.onError(error as Error, sql, logData);\n }\n return reject?.(error);\n }\n};\n\nconst assignError = (to: QueryError, from: pg.DatabaseError) => {\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n\n return to;\n};\n\nexport const parseResult = (\n q: Query,\n parsers: ColumnsParsers | undefined,\n returnType: QueryReturnType | undefined = 'all',\n result: QueryResult,\n isSubQuery?: boolean,\n): unknown => {\n switch (returnType) {\n case 'all': {\n if (q.q.throwOnNotFound && result.rows.length === 0)\n throw new NotFoundError(q);\n\n const { rows } = result;\n if (parsers) {\n for (const row of rows) {\n parseRecord(parsers, row);\n }\n }\n return rows;\n }\n case 'one': {\n const row = result.rows[0];\n if (!row) return;\n\n return parsers ? parseRecord(parsers, row) : row;\n }\n case 'oneOrThrow': {\n const row = result.rows[0];\n if (!row) throw new NotFoundError(q);\n\n return parsers ? parseRecord(parsers, row) : row;\n }\n case 'rows': {\n return parsers\n ? parseRows(\n parsers,\n (result as unknown as QueryArraysResult).fields,\n result.rows,\n )\n : result.rows;\n }\n case 'pluck': {\n const pluck = parsers?.pluck;\n if (pluck) {\n return result.rows.map(isSubQuery ? pluck : (row) => pluck(row[0]));\n } else if (isSubQuery) {\n return result.rows;\n }\n return result.rows.map((row) => row[0]);\n }\n case 'value': {\n const value = result.rows[0]?.[0];\n return value !== undefined\n ? parseValue(value, parsers)\n : q.q.notFoundDefault;\n }\n case 'valueOrThrow': {\n const value = result.rows[0]?.[0];\n if (value === undefined) throw new NotFoundError(q);\n return parseValue(value, parsers);\n }\n case 'rowCount': {\n if (q.q.throwOnNotFound && result.rowCount === 0) {\n throw new NotFoundError(q);\n }\n return result.rowCount;\n }\n case 'void': {\n return;\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const parseRecord = (parsers: ColumnsParsers, row: any) => {\n for (const key in parsers) {\n if (key in row) {\n row[key] = (parsers[key] as ColumnParser)(row[key]);\n }\n }\n return row;\n};\n\nconst parseRows = (\n parsers: ColumnsParsers,\n fields: { name: string }[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rows: any[],\n) => {\n for (let i = fields.length - 1; i >= 0; i--) {\n const parser = parsers[fields[i].name];\n if (parser) {\n for (const row of rows) {\n row[i] = parser(row[i]);\n }\n }\n }\n return rows;\n};\n\nconst parseValue = (value: unknown, parsers?: ColumnsParsers) => {\n const parser = parsers?.[getValueKey];\n return parser ? parser(value) : value;\n};\n\nconst filterResult = (\n q: Query,\n returnType: QueryReturnType,\n queryResult: QueryResult,\n hookSelect: QueryHookSelect,\n result: unknown,\n): unknown => {\n if (returnType === 'all') {\n const pick = getSelectPick(queryResult, hookSelect);\n return (result as unknown[]).map((full) => {\n const filtered: Record<string, unknown> = {};\n for (const key of pick) {\n filtered[key] = (full as Record<string, unknown>)[key];\n }\n return filtered;\n });\n }\n\n if (returnType === 'oneOrThrow' || returnType === 'one') {\n const row = (result as unknown[])[0];\n if (!row) {\n if (returnType === 'oneOrThrow') throw new NotFoundError(q);\n return undefined;\n } else {\n result = {};\n for (const key in row) {\n if (!hookSelect.includes(key)) {\n (result as Record<string, unknown>)[key] = (\n row as Record<string, unknown>\n )[key];\n }\n }\n return result;\n }\n }\n\n if (returnType === 'value') {\n return (result as Record<string, unknown>[])[0]?.[\n queryResult.fields[0].name\n ];\n }\n\n if (returnType === 'valueOrThrow') {\n const row = (result as Record<string, unknown>[])[0];\n if (!row) throw new NotFoundError(q);\n return row[queryResult.fields[0].name];\n }\n\n if (returnType === 'rowCount') {\n return queryResult.rowCount;\n }\n\n if (returnType === 'pluck') {\n const key = queryResult.fields[0].name;\n return (result as Record<string, unknown>[]).map((row) => row[key]);\n }\n\n if (returnType === 'rows') {\n const pick = getSelectPick(queryResult, hookSelect);\n return (result as unknown[]).map((full) =>\n pick.map((key) => (full as Record<string, unknown>)[key]),\n );\n }\n\n return;\n};\n\nconst getSelectPick = (\n queryResult: QueryResult,\n hookSelect: QueryHookSelect,\n): string[] => {\n const pick: string[] = [];\n for (const field of queryResult.fields) {\n if (!hookSelect.includes(field.name)) pick.push(field.name);\n }\n return pick;\n};\n","import { WithOptions } from '../sql';\nimport { AddQueryWith, Query } from '../query/query';\nimport { Db } from '../query/db';\nimport { pushQueryValue, setQueryObjectValue } from '../query/queryUtils';\nimport {\n isExpression,\n Expression,\n ColumnShapeOutput,\n emptyObject,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { DefaultColumnTypes } from '../columns';\n\n// `with` method options\n// - `columns`: true to get all columns from the query, or array of column names\n// - `recursive`, `materialized`, `notMaterialized`: adds corresponding SQL keyword\ntype WithArgsOptions = {\n [K in keyof WithOptions]: K extends 'columns'\n ? boolean | string[]\n : WithOptions[K];\n};\n\n// `with` method arguments.\n// First argument is an alias for the CTE query,\n// other arguments may be a column shape, query object, or a raw SQL.\ntype WithArgs =\n | [string, ColumnsShapeBase, Expression]\n | [string, WithArgsOptions, ColumnsShapeBase, Expression]\n | [string, Query | ((qb: Db) => Query)]\n | [string, WithArgsOptions, Query | ((qb: Db) => Query)];\n\n// Get the columns shape based on `with` arguments.\n// It can get the shape from explicitly provided column schema or from a query object.\ntype WithShape<Args extends WithArgs> = Args[1] extends Query\n ? Args[1]['result']\n : Args[1] extends (qb: Db) => Query\n ? ReturnType<Args[1]>['result']\n : Args[2] extends Query\n ? Args[2]['result']\n : Args[2] extends (qb: Db) => Query\n ? ReturnType<Args[2]>['result']\n : Args[1] extends ColumnsShapeBase\n ? Args[1]\n : Args[2] extends ColumnsShapeBase\n ? Args[2]\n : Args[2] extends (t: DefaultColumnTypes) => ColumnsShapeBase\n ? ReturnType<Args[2]> extends ColumnsShapeBase\n ? ReturnType<Args[2]>\n : never\n : never;\n\n// Adds a `withData` entry to a query\ntype WithResult<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase,\n> = AddQueryWith<\n T,\n {\n table: Args[0];\n shape: Shape;\n type: ColumnShapeOutput<Shape>;\n }\n>;\n\nexport class With {\n /**\n * Add Common Table Expression (CTE) to the query.\n *\n * ```ts\n * import { columnTypes } from 'pqb';\n * import { NumberColumn } from './number';\n *\n * // .with optionally accepts such options:\n * type WithOptions = {\n * // list of columns returned by this WITH statement\n * // by default all columns from provided column shape will be included\n * // true is for default behavior\n * columns?: string[] | boolean;\n *\n * // Adds RECURSIVE keyword:\n * recursive?: true;\n *\n * // Adds MATERIALIZED keyword:\n * materialized?: true;\n *\n * // Adds NOT MATERIALIZED keyword:\n * notMaterialized?: true;\n * };\n *\n * // accepts columns shape and a raw expression:\n * db.table.with(\n * 'alias',\n * {\n * id: columnTypes.integer(),\n * name: columnTypes.text(3, 100),\n * },\n * db.table.sql`SELECT id, name FROM \"someTable\"`,\n * );\n *\n * // accepts query:\n * db.table.with('alias', db.table.all());\n *\n * // accepts a callback for a query builder:\n * db.table.with('alias', (qb) =>\n * qb.select({ one: db.table.sql((t) => t.integer())`1` }),\n * );\n *\n * // All mentioned forms can accept options as a second argument:\n * db.table.with(\n * 'alias',\n * {\n * recursive: true,\n * materialized: true,\n * },\n * rawOrQueryOrCallback,\n * );\n * ```\n *\n * Defined `WITH` table can be used in `.from` or `.join` with all the type safeness:\n *\n * ```ts\n * db.table.with('alias', db.table.all()).from('alias').select('alias.id');\n *\n * db.table\n * .with('alias', db.table.all())\n * .join('alias', 'alias.id', 'user.id')\n * .select('alias.id');\n * ```\n *\n * @param args - first argument is an alias for this CTE, other arguments can be column shape, query object, or raw SQL.\n */\n with<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase = WithShape<Args>,\n >(this: T, ...args: Args): WithResult<T, Args, Shape> {\n return this.clone()._with<T, Args, Shape>(...args);\n }\n _with<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase = WithShape<Args>,\n >(this: T, ...args: Args): WithResult<T, Args, Shape> {\n let options =\n (args.length === 3 && !isExpression(args[2])) || args.length === 4\n ? (args[1] as WithArgsOptions | WithOptions)\n : undefined;\n\n const last = args[args.length - 1] as\n | Query\n | ((qb: Db) => Query)\n | Expression;\n\n const query = typeof last === 'function' ? last(this.queryBuilder) : last;\n\n const shape =\n args.length === 4\n ? (args[2] as ColumnsShapeBase)\n : isExpression(query)\n ? args[1]\n : query.q.shape;\n\n if (options?.columns === true) {\n options = {\n ...options,\n columns: Object.keys(shape),\n };\n }\n\n pushQueryValue(this, 'with', [args[0], options || emptyObject, query]);\n\n return setQueryObjectValue(\n this,\n 'withShapes',\n args[0],\n shape,\n ) as unknown as WithResult<T, Args, Shape>;\n }\n}\n","import { Query } from '../query/query';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { Expression } from 'orchid-core';\n\n// argument of `union`-like query methods.\n// it supports query objects with the same result as in the previous query,\n// or a raw SQL\nexport type UnionArg<T extends Query> =\n | (Omit<Query, 'result'> & {\n result: { [K in keyof T['result']]: Pick<T['result'][K], 'dataType'> };\n })\n | Expression;\n\nexport class Union {\n /**\n * Creates a union query, taking an array or a list of callbacks, builders, or raw statements to build the union statement, with optional boolean `wrap`.\n * If the `wrap` parameter is true, the queries will be individually wrapped in parentheses.\n *\n * ```ts\n * SomeTable.select('id', 'name').union(\n * [\n * OtherTable.select('id', 'name'),\n * SomeTable.sql`SELECT id, name FROM \"thirdTable\"`,\n * ],\n * true, // optional wrap parameter\n * );\n * ```\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n union<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._union(args, wrap);\n }\n _union<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'UNION' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n unionAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._unionAll(args, wrap);\n }\n _unionAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'UNION ALL' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but uses a `INTERSECT` SQL keyword instead\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n intersect<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._intersect(args, wrap);\n }\n _intersect<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'INTERSECT' as const, wrap })),\n );\n }\n\n /**\n * Same as `intersect`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n intersectAll<T extends Query>(\n this: T,\n args: UnionArg<T>[],\n wrap?: boolean,\n ): T {\n return this._intersectAll(args, wrap);\n }\n _intersectAll<T extends Query>(\n this: T,\n args: UnionArg<T>[],\n wrap?: boolean,\n ): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'INTERSECT ALL' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but uses an `EXCEPT` SQL keyword instead\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n except<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._except(args, wrap);\n }\n _except<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'EXCEPT' as const, wrap })),\n );\n }\n\n /**\n * Same as `except`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n exceptAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._exceptAll(args, wrap);\n }\n _exceptAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'EXCEPT ALL' as const, wrap })),\n );\n }\n}\n","import {\n Query,\n QueryReturnsAll,\n SetQueryKind,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n pushQueryValue,\n saveSearchAlias,\n throwIfNoWhere,\n} from '../query/queryUtils';\nimport { RelationConfigBase, RelationQueryBase } from '../relations';\nimport { WhereResult } from './where/where';\nimport { JsonItem } from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape, Db } from '../query/db';\nimport {\n isExpression,\n Expression,\n EmptyObject,\n QueryThen,\n callWithThis,\n TemplateLiteralArgs,\n emptyObject,\n} from 'orchid-core';\nimport { QueryResult } from '../adapter';\nimport { JsonModifiers } from './json';\nimport { RawSQL } from '../sql/rawSql';\nimport { resolveSubQueryCallback } from '../common/utils';\nimport { OrchidOrmInternalError } from '../errors';\n\n// Type of argument for `update` and `updateOrThrow`\n//\n// It maps the `inputType` of a table into object with column values.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type UpdateData<T extends Query> = {\n [K in keyof T['inputType']]?: UpdateColumn<T, K>;\n} & {\n [K in keyof T['relations']]?: UpdateRelationData<\n T,\n T['relations'][K]['relationConfig']\n >;\n};\n\n// Type of available variants to provide for a specific column when updating.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\ntype UpdateColumn<T extends Query, Key extends keyof T['inputType']> =\n | T['inputType'][Key]\n | Expression\n | {\n [K in keyof Query]: K extends 'then'\n ? QueryThen<T['inputType'][Key]>\n : Query[K];\n }\n | ((\n q: {\n [K in keyof JsonModifiers]: K extends 'selectable'\n ? T['selectable']\n : T[K];\n } & T['relations'],\n ) => JsonItem | (RelationQueryBase & { meta: { kind: 'select' } }));\n\n// Add relation operations to the update argument.\ntype UpdateRelationData<\n T extends Query,\n Rel extends RelationConfigBase,\n> = Rel['one'] extends true\n ?\n | Rel['dataForUpdate']\n | (QueryReturnsAll<T['returnType']> extends true\n ? never\n : Rel['dataForUpdateOne'])\n : Rel['dataForUpdate'] &\n (QueryReturnsAll<T['returnType']> extends true\n ? EmptyObject\n : Rel['dataForUpdateOne']);\n\n// Type of argument for `update`.\n// not available when there are no conditions on the query.\ntype UpdateArg<T extends Query> = T['meta']['hasWhere'] extends true\n ? UpdateData<T>\n : never;\n\n// Type of argument for `updateRaw`.\n// not available when there are no conditions on the query.\ntype UpdateRawArgs<T extends Query> = T['meta']['hasWhere'] extends true\n ? [sql: Expression] | TemplateLiteralArgs\n : never;\n\n// `update` and `updateOrThrow` methods output type.\n// Unless something was explicitly selected on the query, it's returning the count of updated records.\ntype UpdateResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'update'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'update'>>;\n\n// `increment` and `decrement` methods argument type.\n// Accepts a column name to change, or an object with column names and number values to increment or decrement with.\ntype ChangeCountArg<T extends Query> =\n | keyof T['shape']\n | Partial<Record<keyof T['shape'], number>>;\n\n// Context object for `update` logic used internally.\n// It's being used by relations logic in the ORM.\nexport type UpdateCtx = {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n updateData?: Record<string, unknown>;\n};\n\n// apply `increment` or a `decrement`,\n// mutates the `queryData` of a query.\nconst applyCountChange = <T extends Query>(\n self: T,\n op: string,\n data: ChangeCountArg<T>,\n) => {\n self.q.type = 'update';\n\n if (!self.q.select) {\n if (\n self.q.returnType === 'oneOrThrow' ||\n self.q.returnType === 'valueOrThrow'\n ) {\n self.q.throwOnNotFound = true;\n }\n self.q.returnType = 'rowCount';\n }\n\n let map: Record<string, { op: string; arg: number }>;\n if (typeof data === 'object') {\n map = {};\n for (const key in data) {\n map[key] = { op, arg: data[key] as number };\n }\n } else {\n map = { [data as string]: { op, arg: 1 } };\n }\n\n pushQueryValue(self, 'updateData', map);\n return self as unknown as UpdateResult<T>;\n};\n\n// sets query type, `returnType`, casts type from Query to UpdateResult\nconst update = <T extends Query>(q: T): UpdateResult<T> => {\n q.q.type = 'update';\n\n if (!q.q.select) {\n q.q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(q, 'update');\n\n return q as unknown as UpdateResult<T>;\n};\n\nexport class Update {\n /**\n * `update` takes an object with columns and values to update records.\n *\n * By default, `update` will return a count of updated records.\n *\n * Place `select`, `selectAll`, or `get` before `update` to specify returning columns.\n *\n * You need to provide `where`, `findBy`, or `find` conditions before calling `update`.\n * To ensure that the whole table won't be updated by accident, updating without where conditions will result in TypeScript and runtime errors.\n *\n * Use `all()` to update ALL records without conditions:\n *\n * ```ts\n * await db.table.all().update({ name: 'new name' });\n * ```\n *\n * If `select` and `where` were specified before the update it will return an array of updated records.\n *\n * If `select` and `take`, `find`, or similar were specified before the update it will return one updated record.\n *\n * For a column value you can provide a specific value, raw SQL, a query object that returns a single value, or a callback with a sub-query.\n *\n * The callback is allowed to select a single value from a relation (see `fromRelation` column below),\n * or to use a [jsonSet](/guide/advanced-queries.html#jsonset),\n * [jsonInsert](/guide/advanced-queries.html#jsoninsert),\n * and [jsonRemove](/guide/advanced-queries.html#jsonremove) for a JSON column (see `jsonColumn` below).\n *\n * ```ts\n * // returns number of updated records by default\n * const updatedCount = await db.table\n * .where({ name: 'old name' })\n * .update({ name: 'new name' });\n *\n * // returning only `id`\n * const id = await db.table.find(1).get('id').update({ name: 'new name' });\n *\n * // `selectAll` + `find` will return a full record\n * const oneFullRecord = await db.table\n * .selectAll()\n * .find(1)\n * .update({ name: 'new name' });\n *\n * // `selectAll` + `where` will return array of full records\n * const recordsArray = await db.table\n * .select('id', 'name')\n * .where({ id: 1 })\n * .update({ name: 'new name' });\n *\n * await db.table.where({ ...conditions }).update({\n * // set the column to a specific value\n * column1: 123,\n *\n * // use raw SQL to update the column\n * column2: db.table.sql`2 + 2`,\n *\n * // use query that returns a single value\n * // returning multiple values will result in Postgres error\n * column3: db.otherTable.get('someColumn'),\n *\n * // select a single value from a related record\n * fromRelation: (q) => q.relatedTable.get('someColumn'),\n *\n * // set a new value to the `.foo.bar` path into a JSON column\n * jsonColumn: (q) => q.jsonSet('jsonColumn', ['foo', 'bar'], 'new value'),\n * });\n * ```\n *\n * ### sub-queries\n *\n * In addition to sub-queries that are simply selecting a single value, it's supported to update a column with a result of the provided `create`, `update`, or `delete` sub-query.\n *\n * ```ts\n * await db.table.where({ ...conditions }).update({\n * // `column` will be set to a value of the `otherColumn` of the created record.\n * column: db.otherTable.get('otherColumn').create({ ...data }),\n *\n * // `column2` will be set to a value of the `otherColumn` of the updated record.\n * column2: db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .update({ key: 'value' }),\n *\n * // `column3` will be set to a value of the `otherColumn` of the deleted record.\n * column3: db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .delete(),\n * });\n * ```\n *\n * This is achieved by defining a `WITH` clause under the hood, it produces such a query:\n *\n * ```sql\n * WITH q AS (\n * INSERT INTO \"otherTable\"(col1, col2, col3)\n * VALUES ('val1', 'val2', 'val3')\n * RETURNING \"otherTable\".\"selectedColumn\"\n * )\n * UPDATE \"table\"\n * SET \"column\" = (SELECT * FROM \"q\")\n * ```\n *\n * The query is atomic, and if the sub-query fails, or the update part fails, or if multiple rows are returned from a sub-query, no changes will persist in the database.\n *\n * Though it's possible to select a single value from a callback for the column to update:\n *\n * ```ts\n * await db.table.find(1).update({\n * // update column `one` with the value of column `two` of the related record.\n * one: (q) => q.relatedTable.get('two'),\n * })\n * ```\n *\n * It is **not** supported to use `create`, `update`, or `delete` kinds of sub-query on related tables:\n *\n * ```ts\n * await db.table.find(1).update({\n * // TS error, this is not allowed:\n * one: (q) => q.relatedTable.get('two').create({ ...data }),\n * })\n * ```\n *\n * It is not supported because query inside `WITH` cannot reference the table in `UPDATE`.\n *\n * ### null, undefined, unknown columns\n *\n * - `null` value will set a column to `NULL`\n * - `undefined` value will be ignored\n * - unknown columns will be ignored\n *\n * ```ts\n * db.table.findBy({ id: 1 }).update({\n * name: null, // updates to null\n * age: undefined, // skipped, no effect\n * lalala: 123, // skipped\n * });\n * ```\n *\n * ### empty set\n *\n * When trying to query update with an empty object, it will be transformed seamlessly to a `SELECT` query:\n *\n * ```ts\n * // imagine the data is an empty object\n * const data = req.body;\n *\n * // query is transformed to `SELECT count(*) WHERE key = 'value'`\n * const count = await db.table.where({ key: 'value' }).update(data);\n *\n * // will select a full record by id\n * const record = await db.table.find(1).selectAll().update(data);\n *\n * // will select a single column by id\n * const name = await db.table.find(1).get('name').update(data);\n * ```\n *\n * If the table has `updatedAt` [timestamp](/guide/common-column-methods.html#timestamps), it will be updated even for an empty data.\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n update<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const q = this.clone() as T;\n return q._update(arg);\n }\n _update<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const { q } = this;\n\n const set: Record<string, unknown> = { ...arg };\n pushQueryValue(this, 'updateData', set);\n\n const { shape } = q;\n\n const ctx: UpdateCtx = {};\n\n for (const key in arg) {\n const item = shape[key];\n if (item instanceof VirtualColumn && item.update) {\n item.update(this, ctx, set);\n delete set[key];\n } else if (\n (!shape[key] || shape[key].data.computed) &&\n shape !== anyShape\n ) {\n delete set[key];\n } else {\n let value = set[key];\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(\n this.baseQuery,\n value as (q: Query) => Query,\n );\n if (value instanceof Db && value.q.type) {\n throw new OrchidOrmInternalError(\n value,\n `Only selecting queries are allowed inside callback of update, ${value.q.type} is given instead.`,\n );\n }\n\n set[key] = value;\n }\n\n if (value !== null && value !== undefined && !isExpression(value)) {\n if (value instanceof Db) {\n // if it is not a select query,\n // move it into `WITH` statement and select from it with a raw SQL\n if (value.q.type) {\n const as = saveSearchAlias(this, 'q', 'withShapes');\n pushQueryValue(this, 'with', [as, emptyObject, value]);\n\n set[key] = new RawSQL(`(SELECT * FROM \"${as}\")`);\n }\n } else {\n // encode if not a query object\n const encode = shape[key].encodeFn;\n if (encode) set[key] = encode(value);\n }\n }\n }\n }\n\n const { queries } = ctx;\n if (queries) {\n q.patchResult = async (_, queryResult) => {\n await Promise.all(queries.map(callWithThis, queryResult));\n\n if (ctx.updateData) {\n const t = this.baseQuery.clone();\n const keys = this.primaryKeys;\n\n (\n t._whereIn as unknown as (\n keys: string[],\n values: unknown[][],\n ) => Query\n )(\n keys,\n queryResult.rows.map((item) => keys.map((key) => item[key])),\n );\n\n await (t as WhereResult<Query>)._update(\n ctx.updateData as UpdateData<WhereResult<Query>>,\n );\n\n for (const row of queryResult.rows) {\n Object.assign(row, ctx.updateData);\n }\n }\n };\n }\n\n return update(this);\n }\n\n /**\n * `updateRaw` is for updating records with raw expression.\n *\n * The behavior is the same as a regular `update` method has:\n * `find` or `where` must precede calling this method,\n * it returns an updated count by default,\n * you can customize returning data by using `select`.\n *\n * ```ts\n * const value = 'new name';\n *\n * // update with SQL template string\n * const updatedCount = await db.table.find(1).updateRaw`name = ${value}`;\n *\n * // or update with `sql` function:\n * await db.table.find(1).updateRaw(db.table.sql`name = ${value}`);\n * ```\n * @param args - raw SQL via a template string or by using a `sql` method\n */\n updateRaw<T extends Query>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n const q = this.clone() as T;\n return q._updateRaw(...args);\n }\n _updateRaw<T extends Query>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n if (Array.isArray(args[0])) {\n const sql = new RawSQL(args as TemplateLiteralArgs);\n return (this as T & { meta: { hasWhere: true } })._updateRaw(sql);\n }\n\n pushQueryValue(this, 'updateData', args[0]);\n\n this.q.type = 'update';\n\n return update(this);\n }\n\n /**\n * To make sure that at least one row was updated use `updateOrThrow`:\n *\n * ```ts\n * import { NotFoundError } from 'pqb';\n *\n * try {\n * // updatedCount is guaranteed to be greater than 0\n * const updatedCount = await db.table\n * .where(conditions)\n * .updateOrThrow({ name: 'name' });\n *\n * // updatedRecords is guaranteed to be a non-empty array\n * const updatedRecords = await db.table\n * .where(conditions)\n * .select('id')\n * .updateOrThrow({ name: 'name' });\n * } catch (err) {\n * if (err instanceof NotFoundError) {\n * // handle error\n * }\n * }\n * ```\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n updateOrThrow<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const q = this.clone() as T;\n return q._updateOrThrow(arg);\n }\n _updateOrThrow<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n this.q.throwOnNotFound = true;\n return this._update(arg);\n }\n\n /**\n * Increments a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .increment('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).increment('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .increment('numericColumn');\n * ```\n *\n * Provide an object to increment multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // increment someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .increment({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to increment, or an object with columns and values to add\n */\n increment<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return this.clone()._increment(data) as unknown as UpdateResult<T>;\n }\n _increment<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return applyCountChange(this, '+', data);\n }\n\n /**\n * Decrements a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .decrement('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).decrement('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .decrement('numericColumn');\n * ```\n *\n * Provide an object to decrement multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // decrement someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .decrement({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to decrement, or an object with columns and values to subtract\n */\n decrement<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return this.clone()._decrement(data) as unknown as UpdateResult<T>;\n }\n _decrement<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return applyCountChange(this, '-', data);\n }\n}\n","import { Query } from '../query/query';\nimport {\n AfterCommitHook,\n emptyArray,\n emptyObject,\n Sql,\n TransactionAdapterBase,\n TransactionState,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nconst commitSql = {\n text: 'COMMIT',\n values: emptyArray,\n};\n\nconst rollbackSql = {\n text: 'ROLLBACK',\n values: emptyArray,\n};\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport type TransactionOptions = {\n level: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n};\n\nexport class Transaction {\n transaction<T extends Query, Result>(\n this: T,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<T extends Query, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<T extends Query, Result>(\n this: T,\n cbOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n cb?: () => Promise<Result>,\n ): Promise<Result> {\n let options: TransactionOptions;\n let fn: () => Promise<Result>;\n if (typeof cbOrOptions === 'function') {\n options = emptyObject as TransactionOptions;\n fn = cbOrOptions;\n } else {\n options =\n typeof cbOrOptions === 'object' ? cbOrOptions : { level: cbOrOptions };\n fn = cb as () => Promise<Result>;\n }\n\n const sql = {\n values: emptyArray,\n } as unknown as Sql;\n\n const log = this.q.log;\n let logData: unknown | undefined;\n\n let trx = this.internal.transactionStorage.getStore();\n const transactionId = trx ? trx.transactionId + 1 : 0;\n\n const callback = (adapter: TransactionAdapterBase) => {\n if (log) log.afterQuery(sql, logData);\n if (log) logData = log.beforeQuery(commitSql);\n\n if (trx) {\n trx.transactionId = transactionId;\n return fn();\n }\n\n trx = {\n adapter,\n transactionId,\n };\n\n return this.internal.transactionStorage.run(trx, fn);\n };\n\n if (!trx) {\n sql.text = `BEGIN${\n options.level ? ` ISOLATION LEVEL ${options.level}` : ''\n }${\n options.readOnly !== undefined\n ? ` READ ${options.readOnly ? 'ONLY' : 'WRITE'}`\n : ''\n }${\n options.deferrable !== undefined\n ? ` ${options.deferrable ? '' : 'NOT '}DEFERRABLE`\n : ''\n }`;\n if (log) logData = log.beforeQuery(sql);\n\n try {\n const result = await this.q.adapter.transaction(sql, callback);\n\n if (log) log.afterQuery(commitSql, logData);\n\n // trx was defined in the callback above\n const { afterCommit } = trx as unknown as TransactionState;\n if (afterCommit) {\n const promises = [];\n for (let i = 0, len = afterCommit.length; i < len; i += 2) {\n const q = afterCommit[i] as QueryBase;\n const result = afterCommit[i + 1] as unknown[];\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n promises.push(fn(result, q));\n }\n }\n await Promise.all(promises);\n }\n\n return result;\n } catch (err) {\n if (log) log.afterQuery(rollbackSql, logData);\n\n throw err;\n }\n } else {\n try {\n sql.text = `SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n\n const { adapter } = trx;\n await adapter.query(sql);\n\n let result;\n try {\n result = await callback(adapter);\n } catch (err) {\n sql.text = `ROLLBACK TO SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await adapter.query(sql);\n if (log) log.afterQuery(sql, logData);\n throw err;\n }\n\n sql.text = `RELEASE SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await adapter.query(sql);\n if (log) log.afterQuery(sql, logData);\n\n return result;\n } finally {\n trx.transactionId = transactionId - 1;\n }\n }\n }\n}\n","import { Query, SelectableOrExpressionOfType } from '../query/query';\nimport { ColumnExpression } from '../common/fn';\nimport { TextColumn } from '../columns';\nimport { AggregateMethods } from './aggregate';\nimport { Expression, MaybeArray } from 'orchid-core';\nimport {\n OrderTsQueryConfig,\n QueryData,\n QuerySourceItem,\n SearchWeight,\n ToSQLCtx,\n} from '../sql';\nimport { QueryBase } from '../query/queryBase';\nimport {\n pushQueryValue,\n saveSearchAlias,\n setQueryObjectValue,\n} from '../query/queryUtils';\nimport { getSearchLang, getSearchText } from '../sql/fromAndAs';\nimport { OrchidOrmInternalError } from '../errors';\nimport { addValue, columnToSql } from '../sql/common';\n\n// `headline` first argument is a name of the search.\ntype HeadlineSearchArg<T extends Query> = Exclude<\n T['meta']['tsQuery'],\n undefined\n>;\n\n// Options of the `headline` function:\n// - text: column name or a raw SQL with the full text to select headline from.\n// - options: string or an expression returning Postgres headline options (https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\ntype HeadlineParams<T extends Query> = {\n text?: SelectableOrExpressionOfType<T, TextColumn>;\n options?: string | Expression;\n};\n\n// define a `headline` method on a query builder\ndeclare module './aggregate' {\n interface AggregateMethods {\n /**\n * Give the `as` alias for the search, and it becomes possible to select a text with highlights of the matching words or phrases:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) => q.headline('search'),\n * });\n * ```\n *\n * When searching in the generated `tsvector` column, need to provide a text source to the `headline`:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * vector: 'textVector',\n * query: 'query',\n * })\n * .select({\n * // `body` is a column name\n * highlightedText: (q) => q.headline('search', { text: 'body' }),\n * });\n * ```\n *\n * `text` can be a raw SQL, here we are joining multiple columns:\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table\n * .search({\n * as: 'search',\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', { text: raw`concat_ws(' ', title, body)` }),\n * });\n * ```\n *\n * `headline` supports a string for `options`, see details [in Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\n *\n * Provide a simple string or a raw SQL:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', {\n * options:\n * 'MaxFragments=10, MaxWords=7, MinWords=3, StartSel=<<, StopSel=>>',\n * }),\n * });\n * ```\n *\n * @param search - name of the search to use the query from\n * @param options - `text` for a text source, `options` for `ts_headline` options\n */\n headline<T extends Query>(\n this: T,\n search: HeadlineSearchArg<T>,\n options?: HeadlineParams<T>,\n ): ColumnExpression<TextColumn>;\n }\n}\n\n// type of `search` argument\nexport type SearchArg<T extends QueryBase, As extends string> = {\n // alias this search to use in `order` and/or in `headline`\n as?: As;\n // order results by search rank\n order?: OrderTsQueryConfig;\n} & (\n | {\n // language to use for parsing documents into ts_vector\n language?: string | Expression;\n }\n | {\n // use a language stored in a column of the table\n languageColumn?: keyof T['selectable'];\n }\n) &\n (\n | {\n // text to search in: simple string or raw SQL\n text: string | Expression;\n }\n | {\n // Provide one or multiple columns to search in.\n // Define an object like `{ title: 'A', body: 'B' }` to set column weights.\n in:\n | MaybeArray<keyof T['selectable']>\n | { [K in keyof T['selectable']]?: SearchWeight };\n }\n | {\n // search in a generated vector column\n vector: {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['dataType'] extends 'tsvector'\n ? K\n : never;\n }[keyof T['selectable']];\n }\n ) &\n (\n | {\n // string or a raw SQL for `websearch_to_tsquery` kind of query\n query: string | Expression;\n }\n | {\n // string or a raw SQL for `plainto_tsquery` kind of query\n plainQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `phraseto_tsquery` kind of query\n phraseQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `to_tsquery` kind of query\n tsQuery: string | Expression;\n }\n );\n\n// query type after `search`: this is collecting search aliases in `meta.tsQuery`\nexport type WhereSearchResult<T extends QueryBase, As extends string> = T & {\n meta: { tsQuery: string extends As ? never : As };\n};\n\nclass Headline extends Expression<TextColumn> {\n _type = TextColumn.instance;\n\n constructor(\n public q: QueryData,\n public source: QuerySourceItem,\n public params?: HeadlineParams<Query>,\n ) {\n super();\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs: string | undefined): string {\n const { q, source, params } = this;\n const lang = getSearchLang(ctx, q, source, quotedAs);\n\n const text = params?.text\n ? params.text instanceof Expression\n ? params.text.toSQL(ctx, quotedAs)\n : columnToSql(ctx, q, q.shape, params.text, quotedAs)\n : getSearchText(ctx, q, source, quotedAs, true);\n\n const options = params?.options\n ? `, ${\n params.options instanceof Expression\n ? params.options.toSQL(ctx, quotedAs)\n : addValue(ctx.values, params.options)\n }`\n : '';\n\n return `ts_headline(${lang}, ${text}, \"${source.as}\"${options})`;\n }\n}\n\nAggregateMethods.prototype.headline = function (this: Query, search, params) {\n const source = this.q.sources?.[search];\n if (!source)\n throw new OrchidOrmInternalError(\n this,\n `Search \\`${search}\\` is not defined`,\n );\n\n return new Headline(\n this.q,\n source,\n params as HeadlineParams<Query> | undefined,\n ) as unknown as ColumnExpression<TextColumn>;\n};\n\nexport class SearchMethods {\n /**\n * ## language\n *\n * By default, the search language is English.\n *\n * You can set a different default language in the `createBaseTable` config:\n *\n * ```ts\n * import { createBaseTable } from 'orchid-orm';\n *\n * export const BaseTable = createBaseTable({\n * language: 'swedish',\n * });\n * ```\n *\n * See the list of supported language configs with the SQL:\n *\n * ```sql\n * SELECT cfgname FROM pg_ts_config;\n * ```\n *\n * When performing a search, you can override the default language:\n *\n * ```ts\n * db.table.search({\n * language: 'finnish',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * `language` also accepts a raw SQL.\n *\n * The language can be stored in the column of this table, then you can use `languageColumn` to use this column for the search:\n *\n * ```ts\n * db.table.search({\n * // the table has `lang` column, use it for the search\n * languageColumn: 'lang',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * ## text vector to search in\n *\n * The text to search in can be a simple string, or a raw SQL, or a text column, or multiple columns:\n *\n * ```ts\n * db.table.search({\n * // search in the given string\n * text: 'simply a string to search in',\n * query: 'query',\n * });\n *\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * // raw SQL: join text columns with space\n * text: raw`concat_ws(' ', title, body)`,\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in a single text column\n * in: 'body',\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns, they are concatenated with `concat_ws` as shown above\n * in: ['title', 'body'],\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns with different weights. Weight can be A, B, C, or D\n * in: {\n * title: 'A',\n * body: 'B',\n * },\n * query: 'query',\n * });\n * ```\n *\n * For better performance, define a [generated](/guide/migration-column-methods.html#generated) column of `tsvector` type, and use it in the search with `vector` keyword:\n *\n * ```ts\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * });\n * ```\n *\n * ## search query\n *\n * Read about different search queries in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES).\n *\n * `search` method can accept one of the following queries:\n *\n * - `query`: corresponds to `websearch_to_tsquery` in Postgres, good to use by default\n * - `plainQuery`: corresponds to `plainto_tsquery`\n * - `phraseQuery`: corresponds to `phraseto_tsquery`\n * - `tsQuery`: corresponds to `to_tsquery`\n *\n * The `query` (`websearch_to_tsquery`) can work with any user input, while other query kinds require a specific format and will fail for invalid input.\n *\n * Each query kind accepts a string or a raw SQL.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * // can accept raw SQL:\n * phraseQuery: raw`'The Fat Rats'`,\n * });\n * ```\n *\n * ## order by search rank\n *\n * Read about search ranking in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING).\n *\n * Set `order: true` to order results by the search rank:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank(to_tsvector('english', body)) DESC\n * order: true,\n * });\n * ```\n *\n * To order with `ts_rank_cd` instead of `ts_rank`, set `coverDensity: true`:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank_cd(to_tsvector('english', body)) DESC\n * order: {\n * coverDensity: true,\n * },\n * });\n * ```\n *\n * Other options are:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * order: {\n * // weights for D, C, B, A:\n * weights: [0.1, 0.2, 0.4, 1],\n * // by default, rank ignores the document length\n * // change rank behavior by providing here a special number\n * normalization: 32,\n * // it's possible to change the order direction:\n * dir: 'ASC', // DESC by default\n * },\n * });\n * ```\n *\n * Giving the `as` alias for the search allows to set the ordering in the `order` method:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .order({\n * // can be `search: true` for defaults\n * search: {\n * // same options as above\n * coverDensity: true,\n * weights: [0.1, 0.2, 0.4, 1.0],\n * normalization: 32,\n * dir: 'ASC',\n * },\n * });\n * ```\n *\n * @param arg - search config\n */\n search<T extends Query, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n return this.clone()._search(arg);\n }\n _search<T extends Query, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n if (!arg.as) {\n const as = saveSearchAlias(this, '@q', 'joinedShapes') as As;\n\n arg = {\n ...arg,\n as,\n };\n }\n\n setQueryObjectValue(this, 'sources', arg.as as string, arg);\n if (arg.order) {\n pushQueryValue(this, 'order', arg.as);\n }\n\n return pushQueryValue(this, 'and', { SEARCH: arg }) as WhereSearchResult<\n T,\n As\n >;\n }\n}\n","import {\n Query,\n SetQueryKind,\n SetQueryReturnsOne,\n SetQueryReturnsVoid,\n} from '../query/query';\nimport { UpdateData } from './update';\nimport { CreateData } from './create';\nimport { WhereResult } from './where/where';\nimport { MoreThanOneRowError } from '../errors';\nimport { isObjectEmpty, SetOptional } from 'orchid-core';\n\n// `orCreate` arg type.\n// Unlike `upsert`, doesn't pass a data to `create` callback.\nexport type OrCreateArg<T extends Query> =\n | CreateData<T>\n | (() => CreateData<T>);\n\n// `upsert` arg type.\n// `create` callback arg is of exact `update` type.\nexport type UpsertArg<T extends Query, Data> =\n | {\n update: Data;\n create: CreateData<T> | ((update: Data) => CreateData<T>);\n }\n | UpsertArgWithData<T, Data>;\n\n// `data` and `create` upsert arg.\n// `create` callback arg is of exact `data` type.\ntype UpsertArgWithData<\n T extends Query,\n Data,\n Create = SetOptional<CreateData<T>, keyof Data>,\n> = {\n data: Data;\n create: Create | ((update: Data) => Create);\n};\n\n// unless upsert query has a select, it returns void\nexport type UpsertResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'upsert'>>\n : SetQueryReturnsVoid<SetQueryKind<T, 'upsert'>>;\n\n// Require type of query object to query only one record\n// because upserting multiple isn't possible\nexport type UpsertThis = WhereResult<Query> & {\n returnType: 'one' | 'oneOrThrow';\n};\n\n// this is used by `upsert` and `orCreate` methods.\n// `updateData` and `mergeData` args are passed only by `upsert`.\nfunction orCreate<T extends Query>(\n q: T,\n data: unknown | ((updateData: unknown) => unknown),\n updateData?: unknown,\n mergeData?: unknown,\n): UpsertResult<T> {\n q.q.returnType = 'one';\n q.q.wrapInTransaction = true;\n\n const { handleResult } = q.q;\n let result: unknown;\n let created = false;\n q.q.handleResult = (q, t, r, s) => {\n return created ? result : handleResult(q, t, r, s);\n };\n\n q.q.patchResult = async (q, queryResult) => {\n if (queryResult.rowCount === 0) {\n if (typeof data === 'function') {\n data = data(updateData);\n }\n\n if (mergeData)\n data = { ...mergeData, ...(data as Record<string, unknown>) };\n\n const inner = q.create(data as CreateData<Query>);\n const { handleResult } = inner.q;\n inner.q.handleResult = (q, t, r, s) => {\n queryResult = r;\n const res = handleResult(q, t, r, s);\n result = res;\n return res;\n };\n await inner;\n created = true;\n } else if (queryResult.rowCount > 1) {\n throw new MoreThanOneRowError(\n q,\n `Only one row was expected to find, found ${queryResult.rowCount} rows.`,\n );\n }\n };\n return q as unknown as UpsertResult<T>;\n}\n\nexport class QueryUpsertOrCreate {\n /**\n * `upsert` tries to update one record, and it will perform create in case a record was not found.\n *\n * It will implicitly wrap queries in a transaction if it was not wrapped yet.\n *\n * `find` or `findBy` must precede `upsert` because it does not work with multiple updates.\n *\n * In case more than one row was updated, it will throw `MoreThanOneRowError` and the transaction will be rolled back.\n *\n * It can take `update` and `create` objects, then they are used separately for update and create queries.\n * Or, it can take `data` and `create` objects, `data` will be used for update and be mixed to `create` object.\n *\n * `data` and `update` objects are of the same type that's expected by `update` method, `create` object is of type of `create` method argument.\n *\n * It is not returning a value by default, place `select` or `selectAll` before `upsert` to specify returning columns.\n *\n * ```ts\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * // update record's name\n * name: 'new name',\n * },\n * create: {\n * // create a new record with this email and a name 'new name'\n * email: 'some@email.com',\n * },\n * });\n *\n * // the same as above but using `update` and `create`\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: {\n * email: 'some@email.com',\n * // here we use a different name when creating a record\n * name: 'created user',\n * },\n * });\n * ```\n *\n * The data for `create` may be returned from a function, it won't be called if a record was updated:\n *\n * ```ts\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }),\n * });\n *\n * // the same as above using `data`\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * // name in `create` is overriding the name from `data`\n * name: 'created user',\n * }),\n * });\n * ```\n *\n * Data from `data` or `update` is passed to the `create` function and can be used:\n *\n * ```ts\n * const user = await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * // `updateData` has the exact type of what is passed to `data`\n * create: (updateData) => ({\n * email: `${updateData.name}@email.com`,\n * }),\n * });\n * ```\n *\n * @param data - `update` property for the data to update, `create` property for the data to create\n */\n upsert<T extends UpsertThis, Update extends UpdateData<T>>(\n this: T,\n data: UpsertArg<T, Update>,\n ): UpsertResult<T> {\n return this.clone()._upsert(data);\n }\n _upsert<T extends UpsertThis, Update extends UpdateData<T>>(\n this: T,\n data: UpsertArg<T, Update>,\n ): UpsertResult<T> {\n let updateData;\n let mergeData;\n if ('data' in data) {\n updateData = mergeData = data.data;\n } else {\n updateData = data.update;\n }\n\n if (!isObjectEmpty(updateData)) {\n this._update<WhereResult<Query>>(\n updateData as UpdateData<WhereResult<Query>>,\n );\n }\n\n return orCreate(this, data.create, updateData, mergeData);\n }\n\n /**\n * `orCreate` creates a record only if it was not found by conditions.\n *\n * It will implicitly wrap queries in a transaction if it was not wrapped yet.\n *\n * `find` or `findBy` must precede `orCreate`.\n *\n * It is accepting the same argument as `create` commands.\n *\n * By default, it is not returning columns, place `get`, `select`, or `selectAll` before `orCreate` to specify returning columns.\n *\n * ```ts\n * const user = await User.selectAll().find({ email: 'some@email.com' }).orCreate({\n * email: 'some@email.com',\n * name: 'created user',\n * });\n * ```\n *\n * The data may be returned from a function, it won't be called if the record was found:\n *\n * ```ts\n * const user = await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .orCreate(() => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }));\n * ```\n *\n * @param data - the same data as for `create`, it may be returned from a callback\n */\n orCreate<T extends UpsertThis>(\n this: T,\n data: OrCreateArg<T>,\n ): UpsertResult<T> {\n return this.clone()._orCreate(data);\n }\n _orCreate<T extends UpsertThis>(\n this: T,\n data: OrCreateArg<T>,\n ): UpsertResult<T> {\n return orCreate(this, data);\n }\n}\n","import { ColumnTypeBase, StaticSQLArgs, DynamicSQLArg } from 'orchid-core';\nimport { DynamicRawSQL, raw, RawSQL } from '../sql/rawSql';\n\nexport class RawSqlMethods<ColumnTypes> {\n columnTypes!: ColumnTypes;\n\n /**\n * When there is a need to use a piece of raw SQL, use the `sql` method from tables, or a `raw` function imported from `orchid-orm`.\n *\n * When selecting a raw SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * const result: { num: number }[] = await db.table.select({\n * num: db.table.sql<number>`\n * random() * 100\n * `,\n * });\n * ```\n *\n * In a situation when you want the result to be parsed, such as when returning a timestamp that you want to be parsed into a `Date` object, provide a column type in such a way:\n *\n * This example assumes that the `timestamp` column was overridden with `asDate` as shown in [Override column types](/guide/columns-overview#override-column-types).\n *\n * ```ts\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: db.table.sql`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * Instead of `sql` method, you can use `raw` function from `orchid-orm` (or `pqb`) to do the same.\n * The only difference, `raw` function don't have access to the overridden column types.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * // if you have overridden timestamp with `asDate` or `asNumber` it won't be parsed properly:\n * timestamp: raw`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * In some cases such as when using [from](/guide/orm-and-query-builder.html#from), setting column type via callback allows for special `where` operations:\n *\n * ```ts\n * const subQuery = db.someTable.select({\n * sum: (q) => q.sql`$a + $b`.type((t) => t.decimal()).values({ a: 1, b: 2 }),\n * });\n *\n * // `gt`, `gte`, `min`, `lt`, `lte`, `max` in `where`\n * // are allowed only for numeric columns:\n * const result = await db.$from(subQuery).where({ sum: { gte: 5 } });\n * ```\n *\n * `where` and other methods don't need the return type, so it can be omitted.\n * You can pass SQL template directly to the `where`:\n *\n * ```ts\n * await db.table.where`\"someValue\" = random() * 100`;\n * ```\n *\n * Interpolating values in template literals is completely safe:\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // SQL injection is prevented by a library, this is safe:\n * await db.table.where`column = ${value}`;\n * ```\n *\n * In the example above, TS cannot check if the table has `column` column, or if there are joined tables that have such column which will lead to error.\n * Instead, use the `column` method to reference a column:\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * // ids will be prefixed with proper table names, no ambiguity:\n * db.table.join(db.otherTable, 'id', 'otherId').where`\n * ${db.table.column('id')} = 1 AND\n * ${db.otherTable.column('id')} = 2\n * `;\n * ```\n *\n * SQL can be passed with a simple string, it's important to note that this is not safe to interpolate values in it.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * // no interpolation is okay\n * await db.table.where(raw({ raw: 'column = random() * 100' }));\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is NOT safe, SQL injection is possible:\n * await db.table.where(raw({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `raw` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` method is more preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is SAFE, SQL injection are prevented:\n * await db.table.where(\n * db.table.sql({\n * raw: '$$column = random() * $value',\n * values: {\n * column: 'someTable.someColumn', // or simply 'column'\n * one: value,\n * two: 123,\n * },\n * }),\n * );\n * ```\n *\n * Summarizing:\n *\n * ```ts\n * // simplest form:\n * db.table.sql`key = ${value}`;\n *\n * // with resulting type:\n * db.table.sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * db.table.sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * db.table.sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * db.table.sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * db.table.sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * db.table.sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * db.table.sql`($one + $two) / $one`\n * .type((t) => t.numeric())\n * .values({ one: 1, two: 2 });\n * ```\n *\n * @param args - template literal or an object { raw: string }\n * @return object that has `type` and `values` methods\n */\n sql<T = unknown>(\n this: { columnTypes: ColumnTypes },\n ...args: StaticSQLArgs\n ): RawSQL<ColumnTypeBase<T>, ColumnTypes>;\n sql<T = unknown>(\n this: { columnTypes: ColumnTypes },\n ...args: [DynamicSQLArg]\n ): DynamicRawSQL<ColumnTypeBase<T>, ColumnTypes>;\n sql(...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = this.columnTypes;\n return sql;\n }\n}\n","import { Query } from '../query/query';\nimport { ColumnTypeBase, QueryCatch, QueryThen } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { QueryBase } from '../query/queryBase';\n\n// A function type to transfer query result with.\n// `input` type is inferred from a query `catch` method,\n// it is a result of the query before transform.\nexport type QueryTransformFn<T extends Query> = (\n input: T['catch'] extends QueryCatch<infer Data> ? Data : never,\n) => unknown;\n\n// Type of query after applying a `transform`.\n// Changes the `returnType` to `valueOrThrow`,\n// because it's always returning a single value - the result of the transform function.\n// Changes the query result to a type returned by the transform function.\nexport type QueryTransform<\n T extends QueryBase,\n Fn extends QueryTransformFn<Query>,\n Data = ReturnType<Fn>,\n> = {\n [K in keyof QueryBase]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: ColumnTypeBase<Data> }\n : T[K];\n} & {\n then: QueryThen<Data>;\n catch: QueryCatch<Data>;\n};\n\nexport class TransformMethods {\n /**\n * Transform the result of the query right after loading it.\n *\n * `transform` method should be called in the last order, other methods can't be chained after calling it.\n *\n * The [hooks](/guide/hooks.html) that are going to run after the query will receive the query result **before** transferring.\n *\n * Consider the following example of a cursor-based pagination by `id`:\n *\n * ```ts\n * const lastId: number | undefined = req.query.cursor;\n *\n * type Result = {\n * nodes: { id: number; text: string }[];\n * cursor?: number;\n * };\n *\n * // result is only for demo, it will be inferred\n * const posts: Result = await db.post\n * .select('id', 'text')\n * .where({ id: { lt: lastId } })\n * .order({ id: 'DESC' })\n * .limit(100)\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * You can also use the `tranform` on nested sub-queries:\n *\n * ```ts\n * type Result = {\n * nodes: {\n * id: number;\n * text: string;\n * comments: { nodes: { id: number; text: string }[]; cursor?: number };\n * }[];\n * cursor?: number;\n * };\n *\n * const postsWithComments: Result = await db.post\n * .select('id', 'text')\n * .select({\n * comments: (q) =>\n * q.comments\n * .select('id', 'text')\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id })),\n * })\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * @param fn - function to transform query result with\n */\n transform<T extends Query, Fn extends QueryTransformFn<T>>(\n this: T,\n fn: Fn,\n ): QueryTransform<T, Fn> {\n return this.clone()._transform(fn);\n }\n _transform<T extends Query, Fn extends QueryTransformFn<T>>(\n this: T,\n fn: Fn,\n ): QueryTransform<T, Fn> {\n return pushQueryValue(this, 'transform', fn) as QueryTransform<T, Fn>;\n }\n}\n","import { Query } from '../query/query';\nimport { noop } from 'orchid-core';\nimport { NotFoundError } from '../errors';\n\n/**\n * Methods added to the query prototype when calling {@link QueryMethods.none}.\n */\nexport const noneMethods = {\n // `then` resolves or rejects based on return type of the query.\n // It is `async` so it returns a chainable Promise.\n async then(\n this: Query,\n resolve?: (data?: unknown) => void,\n reject?: (err: unknown) => void,\n ) {\n const type = this.q.returnType;\n if (!type || type === 'all' || type === 'rows' || type === 'pluck')\n resolve?.([]);\n else if (type === 'one' || type === 'value' || type === 'void') resolve?.();\n else if (type === 'rowCount') resolve?.(0);\n else reject?.(new NotFoundError(this));\n },\n // `catch` returns a Promise, so it is chainable with then/catch.\n catch: () => new Promise(noop),\n};\n","import {\n Query,\n SetQueryKind,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluck,\n SetQueryReturnsRows,\n SetQueryReturnsVoid,\n SetQueryTableAlias,\n} from '../query/query';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n OrderTsQueryConfig,\n SelectItem,\n SelectQueryData,\n SortDir,\n toSQL,\n ToSQLCtx,\n ToSQLOptions,\n TruncateQueryData,\n} from '../sql';\nimport {\n extendQuery,\n pushQueryArray,\n pushQueryValue,\n} from '../query/queryUtils';\nimport { Then } from './then';\nimport { AggregateMethods } from './aggregate';\nimport { addParserForSelectItem, Select } from './select';\nimport { From } from './from';\nimport { Join, OnQueryBuilder } from './join/join';\nimport { With } from './with';\nimport { Union } from './union';\nimport { JsonModifiers, JsonMethods } from './json';\nimport { Create } from './create';\nimport { Update } from './update';\nimport { Delete } from './delete';\nimport { Transaction } from './transaction';\nimport { For } from './for';\nimport { ColumnInfoMethods } from './columnInfo';\nimport { addWhere, Where, WhereArg, WhereResult } from './where/where';\nimport { SearchMethods } from './search';\nimport { Clear } from './clear';\nimport { Having } from './having';\nimport { QueryLog } from './log';\nimport { QueryHooks } from './hooks';\nimport { QueryUpsertOrCreate } from './upsertOrCreate';\nimport { QueryGet } from './get';\nimport { MergeQuery, MergeQueryMethods } from './merge';\nimport { RawSqlMethods } from './rawSql';\nimport { CopyMethods } from './copy';\nimport {\n applyMixins,\n Sql,\n QueryThen,\n ColumnsShapeBase,\n TemplateLiteralArgs,\n Expression,\n ColumnTypeBase,\n} from 'orchid-core';\nimport { AsMethods } from './as';\nimport { QueryBase } from '../query/queryBase';\nimport { OrchidOrmInternalError } from '../errors';\nimport { TransformMethods } from './transform';\nimport { RawSQL } from '../sql/rawSql';\nimport { noneMethods } from './none';\nimport { simpleExistingColumnToSQL } from '../sql/common';\n\n// argument of the window method\n// it is an object where keys are name of windows\n// and values can be a window options or a raw SQL\nexport type WindowArg<T extends Query> = Record<\n string,\n WindowArgDeclaration<T> | Expression\n>;\n\n// SQL window options to specify partitionBy and order of the window\nexport type WindowArgDeclaration<T extends Query = Query> = {\n partitionBy?: SelectableOrExpression<T> | SelectableOrExpression<T>[];\n order?: OrderArg<T>;\n};\n\n// add new windows to a query\ntype WindowResult<T extends Query, W extends WindowArg<T>> = T & {\n windows: Record<keyof W, true>;\n};\n\nexport type OrderArg<\n T extends Query,\n TsQuery extends PropertyKey = string | undefined extends T['meta']['tsQuery']\n ? never\n : Exclude<T['meta']['tsQuery'], undefined>,\n Key extends PropertyKey =\n | keyof T['selectable']\n | {\n [K in keyof T['result']]: T['result'][K]['dataType'] extends\n | 'array'\n | 'object'\n ? never\n : K;\n }[keyof T['result']]\n | TsQuery,\n> =\n | Key\n | {\n [K in Key]?: K extends TsQuery ? OrderTsQueryConfig : SortDir;\n }\n | Expression;\n\nexport type OrderArgs<T extends Query> = OrderArg<T>[] | TemplateLiteralArgs;\n\ntype FindArgs<T extends Query> =\n | [T['shape'][T['singlePrimaryKey']]['queryType'] | Expression]\n | TemplateLiteralArgs;\n\ntype QueryHelper<T extends Query, Args extends unknown[], Result> = <\n Q extends {\n [K in keyof T]: K extends 'then'\n ? QueryThen<unknown>\n : K extends 'result'\n ? ColumnsShapeBase\n : T[K];\n },\n>(\n q: Q,\n ...args: Args\n) => Result extends Query ? MergeQuery<Q, Result> : Result;\n\n// Result of `truncate` method: query has kind 'truncate' and returns nothing.\ntype TruncateResult<T extends Query> = SetQueryKind<\n SetQueryReturnsVoid<T>,\n 'truncate'\n>;\n\n// Expression created by `Query.column('name')`, it will prefix the column with a table name from query's context.\nexport class ColumnRefExpression<\n T extends ColumnTypeBase,\n> extends Expression<T> {\n constructor(public _type: T, public name: string) {\n super();\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return simpleExistingColumnToSQL(ctx, this.name, this._type, quotedAs);\n }\n}\n\nexport interface QueryMethods<ColumnTypes>\n extends Omit<AsMethods, 'result'>,\n AggregateMethods,\n Select,\n From,\n Join,\n With,\n Union,\n Omit<JsonModifiers, 'result'>,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n ColumnInfoMethods,\n Omit<Where, 'result'>,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n Omit<QueryHooks, 'result'>,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n RawSqlMethods<ColumnTypes>,\n CopyMethods,\n TransformMethods {}\n\nexport class QueryMethods<ColumnTypes> {\n /**\n * `.all` is a default behavior, that returns an array of objects:\n *\n * ```ts\n * const records = db.table\n * .take() // .take() will be overridden by .all()\n * .all();\n * ```\n */\n all<T extends Query>(this: T): SetQueryReturnsAll<T> {\n return this.clone()._all();\n }\n _all<T extends Query>(this: T): SetQueryReturnsAll<T> {\n this.q.returnType = 'all';\n this.q.and ??= [];\n return this as unknown as SetQueryReturnsAll<T>;\n }\n\n /**\n * Takes a single record, adds `LIMIT 1`.\n * Throws when not found.\n *\n * ```ts\n * const result: TableType = await db.table.where({ key: 'value' }).take();\n * ```\n */\n take<T extends Query>(this: T): SetQueryReturnsOne<T> {\n return this.clone()._take();\n }\n _take<T extends Query>(this: T): SetQueryReturnsOne<T> {\n this.q.returnType = 'oneOrThrow';\n return this as unknown as SetQueryReturnsOne<T>;\n }\n\n /**\n * Takes a single record, adds `LIMIT 1`.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table\n * .where({ key: 'value' })\n * .takeOptional();\n * ```\n */\n takeOptional<T extends Query>(this: T): SetQueryReturnsOneOptional<T> {\n return this.clone()._takeOptional();\n }\n _takeOptional<T extends Query>(this: T): SetQueryReturnsOneOptional<T> {\n this.q.returnType = 'one';\n return this as unknown as SetQueryReturnsOneOptional<T>;\n }\n\n /**\n * `.rows` returns an array of arrays without field names:\n *\n * ```ts\n * const rows: Array<Array<number | string>> = await db.table\n * .select('id', 'name')\n * .rows();\n *\n * rows.forEach((row) => {\n * // row is array of column values\n * row.forEach((value) => {\n * // value is an id or a name\n * });\n * });\n * ```\n */\n rows<T extends Query>(this: T): SetQueryReturnsRows<T> {\n return this.clone()._rows();\n }\n _rows<T extends Query>(this: T): SetQueryReturnsRows<T> {\n this.q.returnType = 'rows';\n return this as unknown as SetQueryReturnsRows<T>;\n }\n\n /**\n * `.pluck` returns a single array of a single selected column values:\n *\n * ```ts\n * const ids = await db.table.select('id').pluck();\n * // ids are an array of all users' id like [1, 2, 3]\n * ```\n * @param select - column name or a raw SQL\n */\n pluck<T extends Query, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n return this.clone()._pluck(select);\n }\n _pluck<T extends Query, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n this.q.returnType = 'pluck';\n (this.q as SelectQueryData).select = [select as SelectItem];\n addParserForSelectItem(this, this.q.as || this.table, 'pluck', select);\n return this as unknown as SetQueryReturnsPluck<T, S>;\n }\n\n /**\n * `.exec` won't parse the response at all, and returns undefined:\n *\n * ```ts\n * const nothing = await db.table.take().exec();\n * ```\n */\n exec<T extends Query>(this: T): SetQueryReturnsVoid<T> {\n return this.clone()._exec();\n }\n _exec<T extends Query>(this: T): SetQueryReturnsVoid<T> {\n this.q.returnType = 'void';\n return this as unknown as SetQueryReturnsVoid<T>;\n }\n\n /**\n * Call `toSQL` on a query to get an object with a `text` SQL string and a `values` array of binding values:\n *\n * ```ts\n * const sql = db.table.select('id', 'name').where({ name: 'name' }).toSQL();\n *\n * expect(sql.text).toBe(\n * 'SELECT \"table\".\"id\", \"table\".\"name\" FROM \"table\" WHERE \"table\".\"name\" = $1',\n * );\n * expect(sql.values).toEqual(['name']);\n * ```\n *\n * `toSQL` is called internally when awaiting a query.\n *\n * It is caching the result. Not mutating query methods are resetting the cache, but need to be careful with mutating methods that start with `_` - they won't reset the cache, which may lead to unwanted results.\n *\n * `toSQL` optionally accepts such parameters:\n *\n * ```ts\n * type ToSqlOptions = {\n * clearCache?: true;\n * values?: [];\n * };\n * ```\n */\n toSQL(this: Query, options?: ToSQLOptions): Sql {\n return toSQL(this, options);\n }\n\n /**\n * Adds a `DISTINCT` keyword to `SELECT`:\n *\n * ```ts\n * db.table.distinct().select('name');\n * ```\n *\n * Can accept column names or raw expressions to place it to `DISTINCT ON (...)`:\n *\n * ```ts\n * // Distinct on the name and raw SQL\n * db.table.distinct('name', db.table.sql`raw sql`).select('id', 'name');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n distinct<T extends Query>(\n this: T,\n ...columns: SelectableOrExpression<T>[]\n ): T {\n return this.clone()._distinct(...columns);\n }\n _distinct<T extends Query>(\n this: T,\n ...columns: SelectableOrExpression<T>[]\n ): T {\n return pushQueryArray(this, 'distinct', columns as string[]);\n }\n\n /**\n * The `find` method is available only for tables which has exactly one primary key.\n * And also it can accept raw SQL template literal, then the primary key is not required.\n *\n * Find record by id, throw [NotFoundError](/guide/error-handling.html) if not found:\n *\n * ```ts\n * await db.table.find(1);\n * ```\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - primary key value to find by, or a raw SQL\n */\n find<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOne<WhereResult<T>> {\n return this.clone()._find(...args);\n }\n _find<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOne<WhereResult<T>> {\n const [value] = args;\n if (Array.isArray(value)) {\n return this._find(new RawSQL(args as TemplateLiteralArgs));\n }\n\n if (value === null || value === undefined) {\n throw new OrchidOrmInternalError(\n this,\n `${value} is not allowed in the find method`,\n );\n }\n\n return this._where({\n [this.singlePrimaryKey]: value,\n } as WhereArg<T>)._take();\n }\n\n /**\n * Find a single record by the primary key (id), adds `LIMIT 1`, can accept a raw SQL.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.find(123);\n * ```\n *\n * @param args - primary key value to find by, or a raw SQL\n */\n findOptional<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this.clone()._findOptional(...args);\n }\n _findOptional<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this._find(\n ...args,\n ).takeOptional() as unknown as SetQueryReturnsOneOptional<WhereResult<T>>;\n }\n\n /**\n * The same as `where(conditions).take()`, it will filter records and add a `LIMIT 1`.\n * Throws `NotFoundError` if not found.\n *\n * ```ts\n * const result: TableType = await db.table.findBy({ key: 'value' });\n * // is equivalent to:\n * db.table.where({ key: 'value' }).take()\n * ```\n *\n * @param args - `where` conditions\n */\n findBy<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOne<WhereResult<T>> {\n return this.clone()._findBy(...args);\n }\n _findBy<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOne<WhereResult<T>> {\n return addWhere(this, args).take();\n }\n\n /**\n * The same as `where(conditions).takeOptional()`, it will filter records and add a `LIMIT 1`.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.findByOptional({\n * key: 'value',\n * });\n * ```\n *\n * @param args - `where` conditions\n */\n findByOptional<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this.clone()._findByOptional(...args);\n }\n _findByOptional<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return addWhere(this, args).takeOptional();\n }\n\n /**\n * Specifies the schema to be used as a prefix of a table name.\n *\n * Though this method can be used to set the schema right when building the query,\n * it's better to specify schema when calling `db(table, () => columns, { schema: string })`\n *\n * ```ts\n * db.table.withSchema('customSchema').select('id');\n * ```\n *\n * Resulting SQL:\n *\n * ```sql\n * SELECT \"user\".\"id\" FROM \"customSchema\".\"user\"\n * ```\n *\n * @param schema - a name of the database schema to use\n */\n withSchema<T extends Query>(this: T, schema: string): T {\n return this.clone()._withSchema(schema);\n }\n _withSchema<T extends Query>(this: T, schema: string): T {\n this.q.schema = schema;\n return this;\n }\n\n /**\n * For the `GROUP BY` SQL statement, it is accepting column names or raw expressions.\n *\n * `group` is useful when aggregating values.\n *\n * ```ts\n * // Select the category and sum of prices grouped by the category\n * const results = Product.select('category')\n * .selectSum('price', { as: 'sumPrice' })\n * .group('category');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n group<T extends Query>(this: T, ...columns: SelectableOrExpression<T>[]): T {\n return this.clone()._group(...columns);\n }\n _group<T extends Query>(this: T, ...columns: SelectableOrExpression<T>[]): T {\n return pushQueryArray(this, 'group', columns);\n }\n\n /**\n * Add a window with `window` and use it later by its name for aggregate or window functions:\n *\n * ```ts\n * db.table\n * // define window `windowName`\n * .window({\n * windowName: {\n * partitionBy: 'someColumn',\n * order: {\n * id: 'DESC',\n * },\n * },\n * })\n * .select({\n * avg: (q) =>\n * // calculate average price over the window\n * q.avg('price', {\n * // use window by its name\n * over: 'windowName',\n * }),\n * });\n * ```\n *\n * @param arg - window config\n */\n window<T extends Query, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return this.clone()._window(arg);\n }\n _window<T extends Query, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return pushQueryValue(this, 'window', arg) as unknown as WindowResult<T, W>;\n }\n\n wrap<T extends Query, Q extends Query, As extends string = 't'>(\n this: T,\n query: Q,\n as?: As,\n ): SetQueryTableAlias<Q, As> {\n return this.clone()._wrap(query, as);\n }\n _wrap<T extends Query, Q extends Query, As extends string = 't'>(\n this: T,\n query: Q,\n as: As = 't' as As,\n ): SetQueryTableAlias<Q, As> {\n return (query._from(this) as Query)._as(\n as,\n ) as unknown as SetQueryTableAlias<Q, As>;\n }\n\n /**\n * Adds an order by clause to the query.\n *\n * Takes one or more arguments, each argument can be a column name, an object, or a raw expression.\n *\n * ```ts\n * db.table.order('id', 'name'); // ASC by default\n *\n * db.table.order({\n * id: 'ASC', // or DESC\n *\n * // to set nulls order:\n * name: 'ASC NULLS FIRST',\n * age: 'DESC NULLS LAST',\n * });\n *\n * // order by raw SQL expression:\n * db.table.order`raw sql`;\n * // or\n * db.table.order(db.table.sql`raw sql`);\n * ```\n *\n * `order` can refer to the values returned from `select` sub-queries (unlike `where` which cannot).\n * So you can select a count of related records and order by it.\n *\n * For example, `comment` has many `likes`.\n * We are selecting few columns of `comment`, selecting `likesCount` by a sub-query in a select, and ordering comments by likes count:\n *\n * ```ts\n * db.comment\n * .select('title', 'content', {\n * likesCount: (q) => q.likes.count(),\n * })\n * .order({\n * likesCount: 'DESC',\n * });\n * ```\n *\n * @param args - column name(s), raw SQL, or an object with column names and sort directions.\n */\n order<T extends Query>(this: T, ...args: OrderArgs<T>): T {\n return this.clone()._order(...args);\n }\n _order<T extends Query>(this: T, ...args: OrderArgs<T>): T {\n if (Array.isArray(args[0])) {\n return this._order(new RawSQL(args as TemplateLiteralArgs));\n }\n return pushQueryArray(this, 'order', args);\n }\n\n /**\n * Adds a limit clause to the query.\n *\n * ```ts\n * db.table.limit(10);\n * ```\n *\n * @param arg - limit number\n */\n limit<T extends Query>(this: T, arg: number | undefined): T {\n return this.clone()._limit(arg);\n }\n _limit<T extends Query>(this: T, arg: number | undefined): T {\n (this.q as SelectQueryData).limit = arg;\n return this;\n }\n\n /**\n * Adds an offset clause to the query.\n *\n * ```ts\n * db.table.offset(10);\n * ```\n *\n * @param arg - offset number\n */\n offset<T extends Query>(this: T, arg: number | undefined): T {\n return this.clone()._offset(arg);\n }\n _offset<T extends Query>(this: T, arg: number | undefined): T {\n (this.q as SelectQueryData).offset = arg;\n return this;\n }\n\n /**\n * Truncates the specified table.\n *\n * ```ts\n * // simply truncate\n * await db.table.truncate();\n *\n * // restart autoincrementing columns:\n * await db.table.truncate({ restartIdentity: true });\n *\n * // truncate also dependant tables:\n * await db.table.truncate({ cascade: true });\n * ```\n *\n * @param options - truncate options, may have `cascade: true` and `restartIdentity: true`\n */\n truncate<T extends Query>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): TruncateResult<T> {\n return this.clone()._truncate(options);\n }\n _truncate<T extends Query>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): TruncateResult<T> {\n const q = this.q as TruncateQueryData;\n q.type = 'truncate';\n if (options?.restartIdentity) {\n q.restartIdentity = true;\n }\n if (options?.cascade) {\n q.cascade = true;\n }\n return this._exec() as TruncateResult<T>;\n }\n\n /**\n * `none` will resolve the query into an empty result, without executing a database query.\n *\n * ```ts\n * await db.table.none(); // -> empty array\n * await db.table.findOptional(123).none(); // -> undefined\n * await db.table.find(123).none(); // throws NotFoundError\n * ```\n *\n * [create](/guide/create-update-delete.html#create) chained with `count`, [update](/guide/create-update-delete.html#update), and [delete](/guide/create-update-delete.html#del-delete) are returning a count of affected records.\n *\n * When they are called with `none`, query does not execute and 0 is returned.\n *\n * ```ts\n * await db.table.insert(data); // -> 0\n * await db.table.all().update(data); // -> 0\n * await db.table.all().delete(); // -> 0\n * ```\n */\n none<T extends Query>(this: T): T {\n return extendQuery(this, noneMethods);\n }\n\n /**\n * `modify` allows modifying the query with your function:\n *\n * ```ts\n * const doSomethingWithQuery = (q: typeof db.table) => {\n * // can use all query methods\n * return q.select('name').where({ active: true }).order({ createdAt: 'DESC' });\n * };\n *\n * const record = await db.table.select('id').modify(doSomethingWithQuery).find(1);\n *\n * record.id; // id was selected before `modify`\n * record.name; // name was selected by the function\n * ```\n *\n * It's possible to apply different `select`s inside the function, and then the result type will be a union of all possibilities:\n *\n * Use this sparingly as it complicates dealing with the result.\n *\n * ```ts\n * const doSomethingWithQuery = (q: typeof db.table) => {\n * if (Math.random() > 0.5) {\n * return q.select('one');\n * } else {\n * return q.select('two');\n * }\n * };\n *\n * const record = await db.table.modify(doSomethingWithQuery).find(1);\n *\n * // TS error: we don't know for sure if the `one` was selected.\n * record.one;\n *\n * // use `in` operator to disambiguate the result type\n * if ('one' in record) {\n * record.one;\n * } else {\n * record.two;\n * }\n * ```\n *\n * @param fn - function to modify the query with. The result type will be merged with the main query as if the `merge` method was used.\n */\n modify<T extends Query, Arg extends Query & { table: T['table'] }, Result>(\n this: T,\n fn: (q: Arg) => Result,\n ): Result extends Query ? MergeQuery<T, Result> : Result {\n return fn(this as unknown as Arg) as Result extends Query\n ? MergeQuery<T, Result>\n : Result;\n }\n\n /**\n * Use `makeHelper` to make a query helper - a function where you can modify the query, and reuse this function across different places.\n *\n * ```ts\n * const defaultAuthorSelect = db.author.makeHelper((q) => {\n * return q.select('firstName', 'lastName');\n * });\n *\n * // this will select id, firstName, lastName with a correct TS type\n * // and return a single record\n * const result = await defaultAuthorSelect(db.author.select('id').find(1));\n * ```\n *\n * Such helper is available for relation queries inside `select`:\n *\n * ```ts\n * await db.book.select({\n * author: (book) => defaultAuthorSelect(book.author),\n * });\n * ```\n *\n * Helper can accept additional arguments:\n *\n * ```ts\n * const selectFollowing = db.user.makeHelper((q, currentUser: { id: number }) => {\n * return q.select({\n * following: (q) =>\n * q.followers.where({ followerId: currentUser.id }).exists(),\n * });\n * });\n *\n * // select some columns and the `following` boolean field from users\n * await selectFollowing(db.user.select('id', 'name'), currentUser);\n * ```\n *\n * @param fn - helper function\n */\n makeHelper<T extends Query, Args extends unknown[], Result>(\n this: T,\n fn: (q: T, ...args: Args) => Result,\n ): QueryHelper<T, Args, Result> {\n return fn as unknown as QueryHelper<T, Args, Result>;\n }\n\n /**\n * Use `column` method to interpolate column names inside SQL templates.\n * The column will be prefixed with the correct table name taken from the context of the query.\n *\n * ```ts\n * db.table.sql`${db.table.column('id')} = 1`;\n * ```\n *\n * @param name\n */\n column<T extends Query, K extends keyof T['shape']>(\n this: T,\n name: K,\n ): ColumnRefExpression<T['shape'][K]> {\n const column = (this.shape as Record<PropertyKey, ColumnTypeBase>)[name];\n return new ColumnRefExpression(column as T['shape'][K], name as string);\n }\n}\n\napplyMixins(QueryMethods, [\n QueryBase,\n AsMethods,\n AggregateMethods,\n Select,\n From,\n Join,\n OnQueryBuilder,\n With,\n Union,\n JsonModifiers,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n ColumnInfoMethods,\n Where,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n RawSqlMethods,\n CopyMethods,\n TransformMethods,\n]);\n","import { Query, SelectableFromShape } from './query';\nimport {\n QueryMethods,\n handleResult,\n OnQueryBuilder,\n logParamToLogObject,\n QueryLogOptions,\n} from '../queryMethods';\nimport { QueryData, SelectQueryData, ToSQLOptions } from '../sql';\nimport {\n AdapterOptions,\n Adapter,\n QueryResult,\n QueryArraysResult,\n} from '../adapter';\nimport {\n getColumnTypes,\n getTableData,\n DefaultColumnTypes,\n columnTypes,\n} from '../columns';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n DbBase,\n ColumnsShapeBase,\n DefaultSelectColumns,\n applyMixins,\n pushOrNewArray,\n ColumnShapeOutput,\n SinglePrimaryKey,\n snakeCaseKey,\n toSnakeCase,\n Sql,\n QueryThen,\n QueryCatch,\n ColumnsParsers,\n TransactionState,\n QueryResultRow,\n TemplateLiteralArgs,\n QueryInternal,\n SQLQueryArgs,\n isRawSQL,\n EmptyObject,\n ColumnTypesBase,\n ColumnTypeBase,\n} from 'orchid-core';\nimport { inspect } from 'node:util';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { templateLiteralToSQL } from '../sql/rawSql';\nimport { RelationsBase } from '../relations';\n\nexport type NoPrimaryKeyOption = 'error' | 'warning' | 'ignore';\n\nexport type DbOptions<ColumnTypes extends ColumnTypesBase> = (\n | { adapter: Adapter }\n | Omit<AdapterOptions, 'log'>\n) &\n QueryLogOptions & {\n // concrete column types or a callback for overriding standard column types\n // this types will be used in tables to define their columns\n columnTypes?: ColumnTypes | ((t: DefaultColumnTypes) => ColumnTypes);\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n // when set to true, all columns will be translated to `snake_case` when querying database\n snakeCase?: boolean;\n // if `now()` for some reason doesn't suite your timestamps, provide a custom SQL for it\n nowSQL?: string;\n };\n\nexport type DbTableOptions = {\n schema?: string;\n // prepare all SQL queries before executing\n // true by default\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n snakeCase?: boolean;\n // default language for the full text search\n language?: string;\n} & QueryLogOptions;\n\n// Type of data returned from the table query by default, doesn't include computed columns.\n// `const user: User[] = await db.user;`\nexport type QueryDefaultReturnData<Shape extends ColumnsShapeBase> = Pick<\n ColumnShapeOutput<Shape>,\n DefaultSelectColumns<Shape>[number]\n>[];\n\nexport interface Db<\n Table extends string | undefined = undefined,\n Shape extends ColumnsShapeBase = Record<string, never>,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes,\n ShapeWithComputed extends ColumnsShapeBase = Shape,\n Data = QueryDefaultReturnData<Shape>,\n> extends DbBase<Adapter, Table, Shape, ColumnTypes, ShapeWithComputed>,\n QueryMethods<ColumnTypes> {\n new (\n adapter: Adapter,\n queryBuilder: Db<Table, Shape, Relations, ColumnTypes>,\n table?: Table,\n shape?: Shape,\n options?: DbTableOptions,\n ): this;\n internal: Query['internal'];\n queryBuilder: Db;\n onQueryBuilder: Query['onQueryBuilder'];\n primaryKeys: Query['primaryKeys'];\n q: QueryData;\n selectable: SelectableFromShape<ShapeWithComputed, Table>;\n returnType: Query['returnType'];\n then: QueryThen<Data>;\n catch: QueryCatch<Data>;\n windows: Query['windows'];\n defaultSelectColumns: DefaultSelectColumns<Shape>;\n relations: Relations;\n withData: Query['withData'];\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError<this>;\n meta: {\n kind: 'select';\n defaults: {\n [K in keyof Shape]:\n | undefined\n | unknown extends Shape[K]['data']['default']\n ? never\n : K;\n }[keyof Shape];\n };\n}\n\nexport const anyShape = {} as Record<string, ColumnTypeBase>;\n\nexport class Db<\n Table extends string | undefined = undefined,\n Shape extends ColumnsShapeBase = Record<string, never>,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes,\n ShapeWithComputed extends ColumnsShapeBase = Shape,\n> implements Query\n{\n constructor(\n public adapter: Adapter,\n public queryBuilder: Db,\n public table: Table = undefined as Table,\n public shape: ShapeWithComputed = anyShape as ShapeWithComputed,\n public columnTypes: ColumnTypes,\n transactionStorage: AsyncLocalStorage<TransactionState>,\n options: DbTableOptions,\n ) {\n const tableData = getTableData();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n this.internal = {\n ...tableData,\n transactionStorage,\n };\n\n this.baseQuery = this as Query;\n\n const logger = options.logger || console;\n\n const parsers = {} as ColumnsParsers;\n let hasParsers = false;\n let modifyQuery: ((q: Query) => void)[] | undefined = undefined;\n let hasCustomName = false;\n const { snakeCase } = options;\n for (const key in shape) {\n const column = shape[key];\n if (column.parseFn) {\n hasParsers = true;\n parsers[key] = column.parseFn;\n }\n\n if (column.data.modifyQuery) {\n modifyQuery = pushOrNewArray(modifyQuery, column.data.modifyQuery);\n }\n\n if (column.data.name) {\n hasCustomName = true;\n } else if (snakeCase) {\n const snakeName = toSnakeCase(key);\n if (snakeName !== key) {\n hasCustomName = true;\n column.data.name = snakeName;\n }\n }\n\n if (typeof column.data.default === 'function') {\n const arr = this.internal.runtimeDefaultColumns;\n if (!arr) this.internal.runtimeDefaultColumns = [key];\n else arr.push(key);\n\n if (!column.data.runtimeDefault) {\n const {\n data: { default: def },\n encodeFn,\n } = column;\n\n column.data.runtimeDefault = encodeFn\n ? () => encodeFn(def())\n : (def as () => unknown);\n }\n }\n }\n\n if (hasCustomName) {\n const list: string[] = [];\n for (const key in shape) {\n const column = shape[key];\n list.push(\n column.data.name ? `\"${column.data.name}\" AS \"${key}\"` : `\"${key}\"`,\n );\n }\n this.internal.columnsForSelectAll = list;\n }\n\n this.q = {\n adapter,\n shape: shape as ColumnsShapeBase,\n handleResult,\n logger,\n log: logParamToLogObject(logger, options.log),\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n parsers: hasParsers ? parsers : undefined,\n language: options.language,\n } as QueryData;\n\n if (options?.schema) {\n this.q.schema = options.schema;\n }\n\n this.primaryKeys = Object.keys(shape).filter(\n (key) => shape[key].data.isPrimaryKey,\n );\n const primaryKeysFromData = getTableData().primaryKey?.columns;\n if (primaryKeysFromData) this.primaryKeys.push(...primaryKeysFromData);\n\n if (this.primaryKeys.length === 1) {\n this.singlePrimaryKey = this\n .primaryKeys[0] as unknown as SinglePrimaryKey<Shape>;\n } else if (\n this.primaryKeys.length === 0 &&\n shape !== anyShape &&\n options.noPrimaryKey !== 'ignore'\n ) {\n const message = `Table ${table} has no primary key`;\n if (options.noPrimaryKey === 'error') throw new Error(message);\n else logger.warn(message);\n }\n\n const columns = Object.keys(\n shape,\n ) as unknown as (keyof ColumnShapeOutput<Shape>)[];\n const { toSQL } = this;\n\n this.columns = columns as (keyof ColumnShapeOutput<Shape>)[];\n this.defaultSelectColumns = columns.filter(\n (column) => !shape[column as keyof typeof shape].data.isHidden,\n ) as DefaultSelectColumns<Shape>;\n\n const defaultSelect =\n this.defaultSelectColumns.length === columns.length\n ? undefined\n : this.defaultSelectColumns;\n\n this.toSQL = defaultSelect\n ? function <T extends Query>(this: T, options?: ToSQLOptions): Sql {\n const q = this.clone();\n if (!(q.q as SelectQueryData).select) {\n (q.q as SelectQueryData).select = defaultSelect as string[];\n }\n return toSQL.call(q, options);\n }\n : toSQL;\n\n this.relations = {} as Relations;\n\n modifyQuery?.forEach((cb) => cb(this));\n\n this.error = class extends QueryError {\n constructor(message?: string) {\n super(self, message);\n }\n };\n }\n\n [inspect.custom]() {\n return `QueryObject<${this.table}>`;\n }\n\n /**\n * Use `query` to perform raw SQL queries.\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.query<{ one: number }>`SELECT ${value} AS one`;\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * If the query is executing inside a transaction, it will use the transaction connection automatically.\n *\n * ```ts\n * await db.transaction(async () => {\n * // both queries will execute in the same transaction\n * await db.query`SELECT 1`;\n * await db.query`SELECT 2`;\n * });\n * ```\n *\n * Alternatively, support a simple SQL string, with optional `values`:\n *\n * Note that the values is a simple array, and the SQL is referring to the values with `$1`, `$2` and so on.\n *\n * ```ts\n * const value = 1;\n *\n * // it is NOT safe to interpolate inside a simple string, use `values` to pass the values.\n * const result = await db.query<{ one: number }>({\n * raw: 'SELECT $1 AS one',\n * values: [value],\n * });\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n query<T extends QueryResultRow = QueryResultRow>(\n ...args: SQLQueryArgs\n ): Promise<QueryResult<T>> {\n return performQuery<QueryResult<T>>(this, args, 'query');\n }\n\n /**\n * The same as the {@link query}, but returns an array of arrays instead of objects:\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.queryArrays<[number]>`SELECT ${value} AS one`;\n * // `rows` is an array of arrays:\n * const row = result.rows[0];\n * row[0]; // our value\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n queryArrays<R extends any[] = any[]>(\n ...args: SQLQueryArgs\n ): Promise<QueryArraysResult<R>> {\n return performQuery<QueryArraysResult<R>>(this, args, 'arrays');\n }\n}\n\nconst performQuery = async <Result>(\n q: {\n queryBuilder: Db;\n internal: QueryInternal;\n adapter: Adapter;\n q: QueryData;\n },\n args: SQLQueryArgs,\n method: 'query' | 'arrays',\n): Promise<Result> => {\n const trx = q.internal.transactionStorage.getStore();\n let sql: Sql;\n if (isRawSQL(args[0])) {\n const values: unknown[] = [];\n sql = {\n text: args[0].toSQL({ values }),\n values,\n };\n } else {\n const values: unknown[] = [];\n sql = {\n text: templateLiteralToSQL(args as TemplateLiteralArgs, {\n queryBuilder: q.queryBuilder,\n sql: [],\n values,\n }),\n values,\n };\n }\n\n const { log } = q.q;\n let logData: unknown | undefined;\n if (log) logData = log.beforeQuery(sql);\n\n try {\n const result = (await (trx?.adapter || q.adapter)[method as 'query'](\n sql,\n )) as Promise<Result>;\n\n if (log) log.afterQuery(sql, logData);\n\n return result;\n } catch (err) {\n if (log) {\n log.onError(err as Error, sql, logData);\n }\n\n throw err;\n }\n};\n\napplyMixins(Db, [QueryMethods]);\nDb.prototype.constructor = Db;\nDb.prototype.onQueryBuilder = OnQueryBuilder;\n\nexport type DbResult<ColumnTypes> = Db<\n string,\n Record<string, never>,\n EmptyObject,\n ColumnTypes\n> & {\n <Table extends string, Shape extends ColumnsShapeBase = ColumnsShapeBase>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n options?: DbTableOptions,\n ): Db<Table, Shape, EmptyObject>;\n\n adapter: Adapter;\n close: Adapter['close'];\n};\n\nexport const createDb = <\n ColumnTypes extends ColumnTypesBase = DefaultColumnTypes,\n>({\n log,\n logger,\n columnTypes: ctOrFn = columnTypes as unknown as ColumnTypes,\n snakeCase,\n nowSQL,\n ...options\n}: DbOptions<ColumnTypes>): DbResult<ColumnTypes> => {\n const adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n noPrimaryKey: options.noPrimaryKey ?? 'error',\n snakeCase,\n };\n\n const ct =\n typeof ctOrFn === 'function'\n ? (ctOrFn as unknown as (t: DefaultColumnTypes) => ColumnTypes)(\n columnTypes,\n )\n : ctOrFn;\n\n if (snakeCase) {\n (ct as { [snakeCaseKey]?: boolean })[snakeCaseKey] = true;\n }\n\n const transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n ct,\n transactionStorage,\n commonOptions,\n );\n qb.queryBuilder = qb as unknown as Db;\n\n const db = Object.assign(\n <Table extends string, Shape extends ColumnsShapeBase = ColumnsShapeBase>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n options?: DbTableOptions,\n ): Db<Table, Shape, EmptyObject, ColumnTypes> => {\n return new Db<Table, Shape, EmptyObject, ColumnTypes>(\n adapter,\n qb as unknown as Db,\n table as Table,\n typeof shape === 'function'\n ? getColumnTypes(ct, shape, nowSQL, options?.language)\n : shape,\n ct,\n transactionStorage,\n { ...commonOptions, ...options },\n );\n },\n qb,\n { adapter, close: () => adapter.close() },\n );\n\n // Set all methods from prototype to the db instance (needed for transaction at least):\n for (const name of Object.getOwnPropertyNames(Db.prototype)) {\n (db as unknown as Record<string, unknown>)[name] =\n Db.prototype[name as keyof typeof Db.prototype];\n }\n\n return db as unknown as DbResult<ColumnTypes>;\n};\n","import { Query } from './query/query';\n\n// The `Rollback` is not an error,\n// but a command to throw by `rollback` function,\n// and catch it immediately by the transaction to handle the rollback.\nclass Rollback extends Error {}\n\n// `testTransaction` will store its state under this unique key in the `db.internal`.\nconst trxForTest: unique symbol = Symbol('trxForTest');\n\n// The state of `testTransaction` that will be stored in the `db.internal`.\ntype TrxData = {\n // promise of the full transaction lifecycle, from start to rollback.\n promise?: Promise<void>;\n // reject function of the transaction.\n // `Rollback` won't leak outside, other errors will be brought back to the caller.\n reject?(err: unknown): void;\n // Adapter methods are replaced inside the transaction.\n // Original methods are stored here to be restored on rollback.\n adapter: {\n query: unknown;\n arrays: unknown;\n transaction: unknown;\n };\n};\n\n// Type to store transaction data on `db.internal`.\ntype Internal = {\n [trxForTest]?: TrxData[];\n};\n\n// Argument of the transaction, $queryBuilder is to use ORM instance, Query to use any other queryable instance.\ntype Arg = { $queryBuilder: Query } | Query;\n\n// Get queryable instance from the transaction argument.\nconst argToDb = (arg: Arg): Query =>\n '$queryBuilder' in arg ? arg.$queryBuilder : arg;\n\n// Methods of a test transaction.\nexport const testTransaction = {\n /**\n * Start a test transaction.\n * The returned promise is resolved immediately when transaction starts, not waiting for it to end.\n *\n * @param arg - ORM instance or a queryable instance (such as db.someTable).\n */\n start(arg: Arg): Promise<void> {\n const db = argToDb(arg);\n const { transactionStorage } = db.internal;\n const { getStore } = transactionStorage;\n const { adapter } = db.baseQuery.q;\n const data: TrxData = {\n adapter: {\n query: adapter.query,\n arrays: adapter.arrays,\n transaction: adapter.transaction,\n },\n };\n ((db.internal as unknown as Internal)[trxForTest] ??= []).push(data);\n\n return new Promise<void>((resolve) => {\n data.promise = db\n .transaction(() => {\n resolve();\n return new Promise<void>((_, rej) => {\n const trx = transactionStorage.getStore();\n db.internal.transactionStorage.getStore = () => trx;\n if (trx) {\n const t = trx.adapter as unknown as typeof adapter;\n adapter.query = t.query.bind(t);\n adapter.arrays = t.arrays.bind(t);\n adapter.transaction = t.transaction.bind(t);\n }\n data.reject = rej;\n });\n })\n .catch((err) => {\n if (!(err instanceof Rollback)) {\n throw err;\n }\n })\n .finally(() => {\n db.internal.transactionStorage.getStore = getStore;\n });\n });\n },\n\n /**\n * Rollback a test transaction.\n *\n * @param arg - the same ORM or query argument passed into the `testTransaction.start`.\n */\n rollback(arg: Arg): Promise<void> | undefined {\n const db = argToDb(arg);\n const data = (db.internal as unknown as Internal)[trxForTest];\n const last = data?.pop();\n if (!last) return;\n\n // if there's only one transaction left, restore the adapter methods.\n if (data?.length === 1) {\n Object.assign(db.baseQuery.q.adapter, data[0].adapter);\n }\n\n last.reject?.(new Rollback());\n return last.promise;\n },\n\n /**\n * Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),\n * and if there's no nested test transactions left, it will close the db connection.\n *\n * @param arg - the same ORM or query argument passed into the `testTransaction.start`.\n */\n async close(arg: Arg) {\n const db = argToDb(arg);\n await this.rollback(db);\n if ((db.internal as unknown as Internal)[trxForTest]?.length === 0) {\n return db.q.adapter.close();\n }\n },\n};\n","import { Query, SelectableFromShape } from '../query/query';\nimport { ColumnsShapeBase, ColumnTypeBase, Expression } from 'orchid-core';\n\n// Type of argument for computed columns, each value is a function returning an Expression.\nexport type ComputedColumnsBase<T extends Query> = Record<\n string,\n (q: T) => Expression\n>;\n\n// Map query type to apply computed columns to it.\n// Computed columns are added to the query shape and to `selectable`.\n// Not added to `result`, `then`, `catch`, so it doesn't return computed columns by default, only after explicit selecting.\nexport type QueryWithComputed<\n T extends Query,\n Computed extends ComputedColumnsBase<T>,\n Shape extends ColumnsShapeBase = {\n [K in keyof Computed]: ReturnType<Computed[K]>['_type'];\n },\n> = {\n [K in keyof T]: K extends 'shape'\n ? T['shape'] & Shape\n : K extends 'selectable'\n ? T['selectable'] & SelectableFromShape<Shape, T['table']>\n : T[K];\n};\n\ndeclare module 'orchid-core' {\n interface ColumnDataBase {\n // Computed columns have an Expression in their data, which will be used for building SQL.\n computed?: Expression;\n }\n}\n\n// Adds computed columns to the shape of query object.\nexport function addComputedColumns<\n T extends Query,\n Computed extends ComputedColumnsBase<T>,\n>(q: T, computed: Computed): QueryWithComputed<T, Computed> {\n const { shape } = q;\n for (const key in computed) {\n const expr = computed[key](q);\n (shape as Record<string, ColumnTypeBase>)[key] = expr._type;\n expr._type.data.computed = expr;\n }\n\n return q as QueryWithComputed<T, Computed>;\n}\n"],"names":["i","__spreadProps","__spreadValues","hasOptions","col","query","table","value","q","_a","_b","quoteValue","quotedAs","args","name","types","__objRest","performQuery","require","key","resolve","reject","trx","result","fn","handleResult","columnTypes","options"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/sql/rawSql.ts","../src/columns/columnType.ts","../src/columns/code.ts","../src/sql/common.ts","../src/errors.ts","../src/query/query.ts","../src/sql/distinct.ts","../src/sql/select.ts","../src/sql/orderBy.ts","../src/sql/window.ts","../src/sql/where.ts","../src/sql/join.ts","../src/sql/having.ts","../src/sql/with.ts","../src/sql/types.ts","../src/sql/fromAndAs.ts","../src/sql/insert.ts","../src/sql/update.ts","../src/sql/delete.ts","../src/sql/truncate.ts","../src/sql/columnInfo.ts","../src/quote.ts","../src/sql/copy.ts","../src/sql/toSQL.ts","../src/sql/data.ts","../src/common/utils.ts","../src/query/queryUtils.ts","../src/columns/operators.ts","../src/columns/number.ts","../src/columns/string.ts","../src/columns/dateTime.ts","../src/columns/boolean.ts","../src/columns/enum.ts","../src/columns/json.ts","../src/columns/array.ts","../src/columns/customType.ts","../src/columns/columnTypes.ts","../src/columns/columnsSchema.ts","../src/columns/virtual.ts","../src/columns/unknown.ts","../src/columns/columnsByType.ts","../src/adapter.ts","../src/common/fn.ts","../src/queryMethods/aggregate.ts","../src/query/queryBase.ts","../src/queryMethods/as.ts","../src/queryMethods/clear.ts","../src/queryMethods/columnInfo.ts","../src/queryMethods/copy.ts","../src/queryMethods/create.ts","../src/queryMethods/delete.ts","../src/queryMethods/for.ts","../src/queryMethods/join/_join.ts","../src/queryMethods/select.ts","../src/queryMethods/from.ts","../src/common/selectItemExpression.ts","../src/queryMethods/get.ts","../src/queryMethods/having.ts","../src/queryMethods/hooks.ts","../src/queryMethods/where/where.ts","../src/queryMethods/join/join.ts","../src/queryMethods/json.ts","../src/queryMethods/log.ts","../src/queryMethods/merge.ts","../src/queryMethods/then.ts","../src/queryMethods/with.ts","../src/queryMethods/union.ts","../src/queryMethods/update.ts","../src/queryMethods/transaction.ts","../src/queryMethods/search.ts","../src/queryMethods/upsertOrCreate.ts","../src/queryMethods/rawSql.ts","../src/queryMethods/transform.ts","../src/queryMethods/none.ts","../src/queryMethods/queryMethods.ts","../src/query/db.ts","../src/testTransaction.ts","../src/modules/computed.ts"],"sourcesContent":["import {\n ColumnTypeBase,\n SQLArgs,\n RawSQLBase,\n RawSQLValues,\n TemplateLiteralArgs,\n isTemplateLiteralArgs,\n DynamicSQLArg,\n Expression,\n ExpressionTypeMethod,\n StaticSQLArgs,\n} from 'orchid-core';\nimport { DefaultColumnTypes } from '../columns';\nimport { ToSQLCtx } from './toSQL';\n\n// reuse array to track which variables were used in the SQL, to throw when there are some unused.\nconst used: string[] = [];\nconst literalValues: number[] = [];\n\nexport const templateLiteralToSQL = (\n template: TemplateLiteralArgs,\n ctx: ToSQLCtx,\n quotedAs?: string,\n): string => {\n let sql = '';\n const { values } = ctx;\n const parts = template[0];\n literalValues.length = 0;\n\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n sql += parts[i];\n\n const value = template[i + 1];\n if (value instanceof Expression) {\n sql += value.toSQL(ctx, quotedAs);\n } else {\n values.push(value);\n literalValues.push(sql.length);\n sql += `$${values.length}`;\n }\n }\n\n return sql + parts[i];\n};\n\nexport class RawSQL<\n T extends ColumnTypeBase,\n ColumnTypes = DefaultColumnTypes,\n> extends RawSQLBase<T, ColumnTypes> {\n declare columnTypes: ColumnTypes;\n\n constructor(\n sql: string | TemplateLiteralArgs,\n values?: RawSQLValues,\n type?: T,\n ) {\n super(sql, values);\n if (type) this._type = type;\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n let sql;\n const isTemplate = typeof this._sql !== 'string';\n\n if (isTemplate) {\n sql = templateLiteralToSQL(\n this._sql as TemplateLiteralArgs,\n ctx,\n quotedAs,\n );\n } else {\n sql = this._sql as string;\n }\n\n const data = this._values;\n if (!data) {\n return sql;\n }\n\n const { values } = ctx;\n const arr = sql.split(\"'\");\n const len = arr.length;\n used.length = 0;\n for (let i = 0; i < len; i += 2) {\n arr[i] = arr[i].replace(/\\$\\$?(\\w+)/g, (match, key, i) => {\n if (isTemplate && literalValues.includes(i)) return match;\n\n const value = data[key];\n if (value === undefined) {\n throw new Error(`Query variable \\`${key}\\` is not provided`);\n }\n\n used.push(key);\n\n if (match.length - key.length === 2) {\n if (typeof value !== 'string') {\n throw new Error(\n `Expected string value for $$${key} SQL keyword, got ${typeof value}`,\n );\n }\n\n return `\"${value.replace('\"', '\"\"').replace('.', '\".\"')}\"`;\n }\n\n values.push(value);\n return `$${values.length}`;\n });\n }\n\n if (used.length > 0 && used.length < Object.keys(data).length) {\n for (const key in data) {\n if (!used.includes(key)) {\n throw new Error(`Query variable \\`${key}\\` is unused`);\n }\n }\n }\n\n return arr.join(\"'\");\n }\n}\n\n// `DynamicRawSQL` extends both `Expression` and `ExpressionTypeMethod`, so it needs a separate interface.\nexport interface DynamicRawSQL<T extends ColumnTypeBase>\n extends Expression<T>,\n ExpressionTypeMethod {}\n\n// Calls the given function to get inner SQL each time when converting to SQL.\nexport class DynamicRawSQL<\n T extends ColumnTypeBase,\n ColumnTypes = DefaultColumnTypes,\n> extends Expression<T> {\n declare _type: T;\n declare columnTypes: ColumnTypes;\n\n constructor(public fn: DynamicSQLArg) {\n super();\n }\n\n // Calls the given function to get SQL from it.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return this.fn(raw).toSQL(ctx, quotedAs);\n }\n}\n\nDynamicRawSQL.prototype.type = ExpressionTypeMethod.prototype.type;\n\nexport function raw<T = unknown>(\n ...args: StaticSQLArgs\n): RawSQL<ColumnTypeBase<T>>;\nexport function raw<T = unknown>(\n ...args: [DynamicSQLArg]\n): DynamicRawSQL<ColumnTypeBase<T>>;\nexport function raw(...args: SQLArgs) {\n return isTemplateLiteralArgs(args)\n ? new RawSQL(args)\n : typeof args[0] === 'function'\n ? new DynamicRawSQL(args[0])\n : new RawSQL(args[0].raw, args[0].values);\n}\n\n// Raw SQL count(*) to apply directly to `QueryData.select`.\nexport const countSelect = [new RawSQL('count(*)')];\n","import { Query } from '../query/query';\nimport {\n ColumnDataBase,\n ColumnNameOfTable,\n ColumnTypeBase,\n ForeignKeyTable,\n MaybeArray,\n ErrorMessage,\n PrimaryKeyColumn,\n pushColumnData,\n QueryBaseCommon,\n RawSQLBase,\n setColumnData,\n ValidationContext,\n StaticSQLArgs,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { TableData } from './columnTypes';\nimport { raw, RawSQL } from '../sql/rawSql';\nimport { SearchWeight } from '../sql';\nimport { BaseOperators } from './operators';\n\n// type of data for ColumnType\nexport type ColumnData = ColumnDataBase & {\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: Omit<SingleColumnIndexOptions, 'column'>[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: ForeignKey<string, string[]>[];\n identity?: TableData.Identity;\n // raw SQL for a generated column\n generated?: RawSQLBase;\n};\n\n/**\n * - MATCH FULL will not allow one column of a multicolumn foreign key to be null unless all foreign key columns are null;\n * if they are all null, the row is not required to have a match in the referenced table.\n * - MATCH SIMPLE (default) allows any of the foreign key columns to be null; if any of them are null, the row is not required to have a match in the referenced table.\n * - MATCH PARTIAL - PG docs say it's not implemented.\n */\nexport type ForeignKeyMatch = 'FULL' | 'PARTIAL' | 'SIMPLE';\n\n/**\n * - NO ACTION Produce an error indicating that the deletion or update would create a foreign key constraint violation. If the constraint is deferred, this error will be produced at constraint check time if there still exist any referencing rows. This is the default action.\n * - RESTRICT Produce an error indicating that the deletion or update would create a foreign key constraint violation. This is the same as NO ACTION except that the check is not deferrable.\n * - CASCADE Delete any rows referencing the deleted row, or update the values of the referencing column(s) to the new values of the referenced columns, respectively.\n * - SET NULL Set all the referencing columns, or a specified subset of the referencing columns, to null. A subset of columns can only be specified for ON DELETE actions.\n * - SET DEFAULT Set all the referencing columns, or a specified subset of the referencing columns, to their default values. A subset of columns can only be specified for ON DELETE actions. (There must be a row in the referenced table matching the default values, if they are not null, or the operation will fail.)\n */\nexport type ForeignKeyAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\n// Foreign key type contains a foreign table (by function or a name), columns of this table, and foreign key options.\nexport type ForeignKey<Table extends string, Columns extends string[]> = (\n | {\n fn(): new () => { table: Table; columns: ColumnsShapeBase };\n }\n | {\n table: Table;\n }\n) & {\n columns: Columns;\n} & ForeignKeyOptions;\n\n// Used in migrations to also drop related entities if is set to CASCADE\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\n// Used in migrations to make foreign key SQL\nexport type ForeignKeyOptions = {\n name?: string;\n match?: ForeignKeyMatch;\n onUpdate?: ForeignKeyAction;\n onDelete?: ForeignKeyAction;\n dropMode?: DropMode;\n};\n\n// Index options of a single column, is used in migrations.\nexport type IndexColumnOptions = (\n | { column: string }\n | { expression: string }\n) & {\n collate?: string;\n opclass?: string;\n order?: string;\n // weight for a column in a search index\n weight?: SearchWeight;\n};\n\n// Options of the index, is used in migrations.\nexport type IndexOptions = {\n name?: string;\n unique?: boolean;\n nullsNotDistinct?: boolean;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: 'CASCADE' | 'RESTRICT';\n // set the language for the tsVector, 'english' is a default\n language?: string | RawSQLBase;\n // set the column with language for the tsVector\n languageColumn?: string;\n // create a tsVector index\n tsVector?: boolean;\n};\n\n// Options for the `index` method of a column.\nexport type SingleColumnIndexOptions = IndexColumnOptions & IndexOptions;\n\nexport type ColumnFromDbParams = {\n isNullable?: boolean;\n default?: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n};\n\nconst knownDefaults: Record<string, string> = {\n current_timestamp: 'now()',\n 'transaction_timestamp()': 'now()',\n};\n\nexport const simplifyColumnDefault = (value?: string) => {\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return new RawSQL(knownDefaults[lower] || value);\n }\n return;\n};\n\nexport const instantiateColumn = (\n klass: new (...args: never[]) => ColumnType,\n params: ColumnFromDbParams,\n): ColumnType => {\n const column = new (klass as unknown as new () => ColumnType)();\n\n Object.assign(column.data, {\n ...params,\n default: simplifyColumnDefault(params.default),\n });\n return column as unknown as ColumnType;\n};\n\nexport abstract class ColumnType<\n Type = unknown,\n Ops extends BaseOperators = BaseOperators,\n InputType = Type,\n OutputType = Type,\n QueryType = Type,\n> extends ColumnTypeBase<\n Type,\n Ops,\n InputType,\n OutputType,\n QueryType,\n ColumnData\n> {\n /**\n * Mark the column as a primary key.\n * This column type becomes an argument of the `.find` method.\n * So if the primary key is of `integer` type (`identity` or `serial`), `.find` will accept the number,\n * or if the primary key is of `UUID` type, `.find` will expect a string.\n *\n * Using `primaryKey` on a `uuid` column will automatically add a [gen_random_uuid](https://www.postgresql.org/docs/current/functions-uuid.html) default.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.uuid().primaryKey(),\n * }));\n * }\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n */\n primaryKey<T extends ColumnTypeBase>(this: T): PrimaryKeyColumn<T> {\n return setColumnData(\n this,\n 'isPrimaryKey',\n true,\n ) as unknown as PrimaryKeyColumn<T>;\n }\n\n /**\n * Set the foreignKey for the column.\n *\n * In `snakeCase` mode, columns of both tables are translated to a snake_case.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * otherId: t.integer().foreignKey('otherTableName', 'columnName'),\n * }));\n * });\n * ```\n *\n * In the ORM specify a function returning a table class instead of a name:\n *\n * ```ts\n * export class SomeTable extends BaseTable {\n * readonly table = 'someTable';\n * columns = this.setColumns((t) => ({\n * otherTableId: t.integer().foreignKey(() => OtherTable, 'id'),\n * }));\n * }\n *\n * export class OtherTable extends BaseTable {\n * readonly table = 'otherTable';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * }));\n * }\n * ```\n *\n * Optionally you can pass the third argument to `foreignKey` with options:\n *\n * ```ts\n * type ForeignKeyOptions = {\n * // name of the constraint\n * name?: string;\n * // see database docs for MATCH in FOREIGN KEY\n * match?: 'FULL' | 'PARTIAL' | 'SIMPLE';\n *\n * onUpdate?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * onDelete?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * };\n * ```\n *\n * ## composite foreign key\n *\n * Set foreign key from multiple columns in the current table to corresponding columns in the other table.\n *\n * The first argument is an array of columns in the current table, the second argument is another table name, the third argument is an array of columns in another table, and the fourth argument is for options.\n *\n * Options are the same as in a single-column foreign key.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.integer(),\n * name: t.string(),\n * ...t.foreignKey(\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * ),\n * }));\n * });\n * ```\n *\n * @param fn - function returning a table class\n * @param column - column in the foreign table to connect with\n * @param options - {@link ForeignKeyOptions}\n */\n foreignKey<\n T extends ColumnType,\n Table extends ForeignKeyTable,\n Column extends ColumnNameOfTable<Table>,\n >(\n this: T,\n fn: () => Table,\n column: Column,\n options?: ForeignKeyOptions,\n ): Omit<T, 'foreignKeyData'> & {\n foreignKeyData: ForeignKey<InstanceType<Table>['table'], [Column]>;\n };\n foreignKey<T extends ColumnType, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: ForeignKeyOptions,\n ): Omit<T, 'foreignKeyData'> & {\n foreignKeyData: ForeignKey<Table, [Column]>;\n };\n foreignKey(\n fnOrTable: (() => ForeignKeyTable) | string,\n column: string,\n options: ForeignKeyOptions = {},\n ) {\n const item =\n typeof fnOrTable === 'string'\n ? { table: fnOrTable, columns: [column], ...options }\n : { fn: fnOrTable, columns: [column], ...options };\n return pushColumnData(this, 'foreignKeys', item);\n }\n\n toSQL() {\n return this.dataType;\n }\n\n index<T extends ColumnType>(\n this: T,\n options: Omit<SingleColumnIndexOptions, 'column'> = {},\n ): T {\n return pushColumnData(this, 'indexes', options);\n }\n\n /**\n * `searchIndex` is designed for full text search.\n *\n * It can accept the same options as a regular `index`, but it is `USING GIN` by default, and it is concatenating columns into a `tsvector`.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.string(),\n * body: t.string(),\n * ...t.searchIndex(['title', 'body']),\n * }));\n * });\n * ```\n *\n * Produces the following index ('english' is a default language, see [full text search](/guide/text-search.html#language) for changing it):\n *\n * ```sql\n * CREATE INDEX \"table_title_body_idx\" ON \"table\" USING GIN (to_tsvector('english', concat_ws(' ', \"title\", \"body\")))\n * ```\n *\n * Also, it works well with a generated `tsvector` column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.string(),\n * body: t.string(),\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * }));\n * });\n * ```\n *\n * Produces the following index:\n *\n * ```sql\n * CREATE INDEX \"table_generatedTsVector_idx\" ON \"table\" USING GIN (\"generatedTsVector\")\n * ```\n *\n * @param options - index options\n */\n searchIndex<T extends ColumnType>(\n this: T,\n options?: Omit<SingleColumnIndexOptions, 'tsVector'>,\n ): T {\n return pushColumnData(this, 'indexes', {\n ...options,\n ...(this.dataType === 'tsvector' ? { using: 'GIN' } : { tsVector: true }),\n });\n }\n\n unique<T extends ColumnType>(\n this: T,\n options: Omit<SingleColumnIndexOptions, 'column' | 'unique'> = {},\n ): T {\n return pushColumnData(this, 'indexes', { ...options, unique: true });\n }\n\n comment<T extends ColumnType>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n validationDefault<T extends ColumnType>(this: T, value: T['inputType']): T {\n return setColumnData(this, 'validationDefault', value as unknown);\n }\n\n compression<T extends ColumnType>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends ColumnType>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends ColumnType>(this: T, cb: (q: Query) => void): T {\n return setColumnData(\n this,\n 'modifyQuery',\n cb as (q: QueryBaseCommon) => void,\n );\n }\n\n transform<T extends ColumnType, Transformed>(\n this: T,\n fn: (input: T['inputType'], ctx: ValidationContext) => Transformed,\n ): Omit<T, 'inputType'> & { inputType: Transformed } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['transform', fn]];\n return cloned as Omit<T, 'inputType'> & { inputType: Transformed };\n }\n\n to<T extends ColumnType, ToType extends ColumnType>(\n this: T,\n fn: (input: T['inputType']) => ToType['inputType'] | undefined,\n type: ToType,\n ): ToType {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['to', fn, type], ...cloned.chain];\n return cloned as ToType;\n }\n\n refine<T extends ColumnType, RefinedOutput extends T['inputType']>(\n this: T,\n check: (arg: T['inputType']) => unknown,\n params?: ErrorMessage,\n ): T & { type: RefinedOutput } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['refine', check, cloned]];\n\n if (typeof params === 'string' || params?.message) {\n cloned.data = {\n ...this.data,\n errors: {\n ...this.data.errors,\n refine: typeof params === 'string' ? params : params.message,\n },\n };\n }\n\n return cloned as T & { type: RefinedOutput };\n }\n\n superRefine<T extends ColumnType, RefinedOutput extends T['inputType']>(\n this: T,\n check: (arg: T['inputType'], ctx: ValidationContext) => unknown,\n ): T & { type: RefinedOutput } {\n const cloned = Object.create(this);\n cloned.chain = [...this.chain, ['superRefine', check]];\n return cloned as T & { type: RefinedOutput };\n }\n\n /**\n * Define a generated column. `generated` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * two: t.integer().generated`1 + 1`,\n * }));\n * });\n * ```\n *\n * @param args - raw SQL\n */\n generated<T extends ColumnType>(this: T, ...args: StaticSQLArgs): T {\n return setColumnData(this, 'generated', raw(...args));\n }\n}\n","import { ColumnData, ColumnType, ForeignKey } from './columnType';\nimport { getConstraintKind, TableData } from './columnTypes';\nimport {\n addCode,\n Code,\n columnChainToCode,\n columnDefaultArgumentToCode,\n columnErrorMessagesToCode,\n ColumnsShapeBase,\n ColumnTypeBase,\n objectHasValues,\n quoteObjectKey,\n singleQuote,\n singleQuoteArray,\n toArray,\n RawSQLBase,\n} from 'orchid-core';\n\nconst isDefaultTimeStamp = (item: ColumnTypeBase) => {\n if (item.dataType !== 'timestamptz') return false;\n\n const def = item.data.default;\n if (!(def instanceof RawSQLBase)) return false;\n\n return typeof def._sql === 'string' && def._sql.startsWith('now()');\n};\n\nconst combineCodeElements = (input: Code): Code => {\n if (typeof input === 'string') return input;\n\n const output: Code = [];\n let i = -1;\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (typeof output[i] === 'string') {\n output[i] += item;\n } else {\n output[++i] = item;\n }\n } else {\n output[++i] = combineCodeElements(item);\n }\n }\n\n return output;\n};\n\nexport const columnsShapeToCode = (\n shape: ColumnsShapeBase,\n tableData: TableData,\n t: string,\n): Code[] => {\n const hasTimestamps =\n 'createdAt' in shape &&\n isDefaultTimeStamp(shape.createdAt) &&\n 'updatedAt' in shape &&\n isDefaultTimeStamp(shape.updatedAt);\n\n const code: Code = [];\n\n for (const key in shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n code.push(\n ...combineCodeElements([\n `${quoteObjectKey(key)}: `,\n ...toArray(shape[key].toCode(t)),\n ',',\n ]),\n );\n }\n\n if (hasTimestamps) {\n code.push(`...${t}.timestamps(),`);\n }\n\n const { primaryKey, indexes, constraints } = tableData;\n if (primaryKey) {\n code.push(primaryKeyToCode(primaryKey, t));\n }\n\n if (indexes) {\n for (const index of indexes) {\n code.push(...indexToCode(index, t));\n }\n }\n\n if (constraints) {\n for (const item of constraints) {\n code.push(...constraintToCode(item, t));\n }\n }\n\n return code;\n};\n\nexport const primaryKeyToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.options?.name;\n\n return `...${t}.primaryKey([${primaryKey.columns\n .map(singleQuote)\n .join(', ')}]${name ? `, { name: ${singleQuote(name)} }` : ''}),`;\n};\n\nexport const indexToCode = (index: TableData.Index, t: string): Code[] => {\n const code: Code[] = [];\n\n code.push(`...${t}.index(`);\n\n const columnsMultiline = index.columns.some((column) => {\n for (const key in column) {\n if (key !== 'column' && column[key as keyof typeof column] !== undefined)\n return true;\n }\n return false;\n });\n if (columnsMultiline) {\n const objects: Code[] = [];\n\n for (const column of index.columns) {\n const expr = 'column' in column ? column.column : column.expression;\n\n let hasOptions = false;\n for (const key in column) {\n if (key !== 'column' && key !== 'expression') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Code[] = [\n `${'column' in column ? 'column' : 'expression'}: ${singleQuote(\n expr,\n )},`,\n ];\n if (column.collate !== undefined) {\n props.push(`collate: ${singleQuote(column.collate)},`);\n }\n if (column.opclass !== undefined) {\n props.push(`opclass: ${singleQuote(column.opclass)},`);\n }\n if (column.order !== undefined) {\n props.push(`order: ${singleQuote(column.order)},`);\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, ']']);\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n }\n\n const hasOptions = objectHasValues(index.options);\n if (hasOptions) {\n if (columnsMultiline) {\n const columns = code[code.length - 1] as string[];\n columns[columns.length - 1] += ',';\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key in index.options) {\n const value = index.options[key as keyof typeof index.options];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n if (columnsMultiline) {\n code.push([options, '},']);\n } else {\n code.push(options);\n addCode(code, '}');\n }\n }\n\n if (columnsMultiline) {\n code.push('),');\n } else {\n addCode(code, '),');\n }\n\n return code;\n};\n\nexport const constraintToCode = (\n item: TableData.Constraint,\n t: string,\n): Code => {\n const kind = getConstraintKind(item);\n\n if (kind === 'foreignKey' && item.references) {\n return [\n `...${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name),\n '),',\n ];\n } else if (kind === 'check' && item.check) {\n return [`...${t}.check(${item.check.toCode(t)}),`];\n } else {\n return [`...${t}.constraint({`, constraintPropsToCode(t, item), '}),'];\n }\n};\n\nexport const constraintPropsToCode = (\n t: string,\n item: TableData.Constraint,\n): Code[] => {\n const props: Code[] = [];\n\n if (item.name) {\n props.push(`name: ${singleQuote(item.name)},`);\n }\n\n if (item.references) {\n props.push(\n `references: [`,\n referencesArgsToCode(item.references, false),\n '],',\n );\n }\n\n if (item.check) {\n props.push(`check: ${item.check.toCode(t)},`);\n }\n\n return props;\n};\n\nexport const referencesArgsToCode = (\n {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n }: Exclude<TableData.Constraint['references'], undefined>,\n name: string | false = options?.name || false,\n): Code[] => {\n const args: Code[] = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n args.push(\n `${\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString()\n },`,\n );\n\n args.push(`${singleQuoteArray(foreignColumns)},`);\n\n if (objectHasValues(options) || name) {\n const lines: string[] = [];\n if (name) lines.push(`name: ${singleQuote(name)},`);\n for (const key in options) {\n if (key === 'name') continue;\n const value = options[key as keyof typeof options];\n if (value) lines.push(`${key}: ${singleQuote(value)},`);\n }\n args.push('{', lines, '},');\n }\n\n return args;\n};\n\nexport const columnForeignKeysToCode = (\n foreignKeys: ForeignKey<string, string[]>[],\n): Code[] => {\n const code: Code[] = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n foreignKey: ForeignKey<string, string[]>,\n): Code[] => {\n const code: Code = [];\n\n if ('fn' in foreignKey) {\n code.push(foreignKey.fn.toString());\n } else {\n code.push(singleQuote(foreignKey.table));\n }\n addCode(code, `, ${singleQuote(foreignKey.columns[0])}`);\n\n const hasOptions =\n foreignKey.name ||\n foreignKey.match ||\n foreignKey.onUpdate ||\n foreignKey.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (foreignKey.name) arr.push(`name: ${singleQuote(foreignKey.name)},`);\n if (foreignKey.match) arr.push(`match: ${singleQuote(foreignKey.match)},`);\n if (foreignKey.onUpdate)\n arr.push(`onUpdate: ${singleQuote(foreignKey.onUpdate)},`);\n if (foreignKey.onDelete)\n arr.push(`onDelete: ${singleQuote(foreignKey.onDelete)},`);\n\n addCode(code, ', {');\n code.push(arr);\n addCode(code, '}');\n }\n\n return code;\n};\n\nexport const columnIndexesToCode = (\n indexes: Exclude<ColumnData['indexes'], undefined>,\n): Code[] => {\n const code: Code[] = [];\n for (const index of indexes) {\n addCode(code, `.${index.unique ? 'unique' : 'index'}(`);\n\n const arr: string[] = [];\n\n if (index.collate) arr.push(`collate: ${singleQuote(index.collate)},`);\n if (index.opclass) arr.push(`opclass: ${singleQuote(index.opclass)},`);\n if (index.order) arr.push(`order: ${singleQuote(index.order)},`);\n if (index.name) arr.push(`name: ${singleQuote(index.name)},`);\n if (index.using) arr.push(`using: ${singleQuote(index.using)},`);\n if (index.include)\n arr.push(\n `include: ${\n typeof index.include === 'string'\n ? singleQuote(index.include)\n : `[${index.include.map(singleQuote).join(', ')}]`\n },`,\n );\n if (index.nullsNotDistinct) arr.push(`nullsNotDistinct: true,`);\n if (index.with) arr.push(`with: ${singleQuote(index.with)},`);\n if (index.tablespace)\n arr.push(`tablespace: ${singleQuote(index.tablespace)},`);\n if (index.where) arr.push(`where: ${singleQuote(index.where)},`);\n\n if (arr.length) {\n addCode(code, '{');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnCheckToCode = (t: string, check: RawSQLBase): string => {\n return `.check(${check.toCode(t)})`;\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Code[] = [];\n\n if (dataType === 'integer') {\n code.push(`identity(`);\n } else {\n code.push(`${dataType}().identity(`);\n }\n\n const props: string[] = [];\n if (identity.always) props.push(`always: true,`);\n if (identity.incrementBy) props.push(`incrementBy: ${identity.incrementBy},`);\n if (identity.startWith) props.push(`startWith: ${identity.startWith},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache) props.push(`cache: ${identity.cache},`);\n\n if (props.length) {\n addCode(code, '{');\n code.push(props, '}');\n }\n\n addCode(code, ')');\n\n return code;\n};\n\nexport const columnCode = (\n type: ColumnType,\n t: string,\n code: Code,\n data = type.data,\n skip?: Record<'encodeFn', unknown>,\n): Code => {\n code = toArray(code);\n\n let prepend = `${t}.`;\n if (data.name) {\n prepend += `name(${singleQuote(data.name)}).`;\n }\n\n if (typeof code[0] === 'string') {\n code[0] = `${prepend}${code[0]}`;\n } else {\n code[0].unshift(prepend);\n }\n\n if (data.isPrimaryKey) addCode(code, '.primaryKey()');\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(data.foreignKeys)) {\n addCode(code, part);\n }\n }\n\n if (data.isHidden) addCode(code, '.hidden()');\n\n if (data.isNullable) addCode(code, '.nullable()');\n\n if (type.encodeFn && type.encodeFn !== skip?.encodeFn)\n addCode(code, `.encode(${type.encodeFn.toString()})`);\n\n if (type.parseFn && !('hideFromCode' in type.parseFn))\n addCode(code, `.parse(${type.parseFn.toString()})`);\n\n if (data.as) addCode(code, `.as(${data.as.toCode(t)})`);\n\n if (data.default !== undefined) {\n addCode(code, `.default(${columnDefaultArgumentToCode(t, data.default)})`);\n }\n\n if (data.indexes) {\n for (const part of columnIndexesToCode(data.indexes)) {\n addCode(code, part);\n }\n }\n\n if (data.comment) addCode(code, `.comment(${singleQuote(data.comment)})`);\n\n if (data.check) {\n addCode(code, columnCheckToCode(t, data.check));\n }\n\n if (data.errors) {\n for (const part of columnErrorMessagesToCode(data.errors)) {\n addCode(code, part);\n }\n }\n\n const { validationDefault } = data;\n if (validationDefault) {\n addCode(\n code,\n `.validationDefault(${\n typeof validationDefault === 'function'\n ? validationDefault.toString()\n : typeof validationDefault === 'string'\n ? singleQuote(validationDefault)\n : JSON.stringify(validationDefault)\n })`,\n );\n }\n\n if (data.compression)\n addCode(code, `.compression(${singleQuote(data.compression)})`);\n\n if (data.collate) addCode(code, `.collate(${singleQuote(data.collate)})`);\n\n if (data.modifyQuery)\n addCode(code, `.modifyQuery(${data.modifyQuery.toString()})`);\n\n return columnChainToCode(type.chain, t, code);\n};\n","import { SelectableOrExpression } from '../common/utils';\nimport { QueryData } from './data';\nimport { ToSQLCtx } from './toSQL';\nimport { ColumnsShapeBase, ColumnTypeBase } from 'orchid-core';\n\n/**\n * Acts as {@link simpleExistingColumnToSQL} except that the column is optional and will return quoted key if no column.\n */\nexport function simpleColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column?: ColumnTypeBase,\n quotedAs?: string,\n): string {\n return column\n ? column.data.computed\n ? column.data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${column.data.name || key}\"`\n : `\"${key}\"`;\n}\n\n// Takes a column name without dot, and the optional column object.\n// Handles computed column, uses column.data.name when set, prefixes regular column with `quotedAs`.\nexport function simpleExistingColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column: ColumnTypeBase,\n quotedAs?: string,\n): string {\n return column.data.computed\n ? column.data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${column.data.name || key}\"`;\n}\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: Pick<QueryData, 'joinedShapes' | 'joinOverrides'>,\n shape: ColumnsShapeBase,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n if (key === '*') {\n if (data.joinedShapes?.[table]) {\n return select ? `row_to_json(\"${table}\".*)` : `\"${table}\".r`;\n }\n return column;\n }\n\n const tableName = data.joinOverrides?.[table] || table;\n const quoted = `\"${table}\"`;\n\n const col =\n quoted === quotedAs ? shape[key] : data.joinedShapes?.[tableName]?.[key];\n\n if (col) {\n if (col.data.name) {\n return `\"${tableName}\".\"${col.data.name}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quoted)}`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n return simpleColumnToSQL(ctx, column, shape[column], quotedAs);\n};\n\nexport const columnToSqlWithAs = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n if (key === '*') {\n if (data.joinedShapes?.[table]) {\n return select\n ? `row_to_json(\"${table}\".*) \"${table}\"`\n : `\"${table}\".r \"${table}\"`;\n }\n return column;\n }\n\n const tableName = data.joinOverrides?.[table] || table;\n const quoted = `\"${table}\"`;\n\n const col =\n quoted === quotedAs\n ? data.shape[key]\n : data.joinedShapes?.[tableName][key];\n if (col) {\n if (col.data.name && col.data.name !== key) {\n return `\"${tableName}\".\"${col.data.name}\" \"${key}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quoted)} \"${key}\"`;\n }\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return select\n ? `row_to_json(\"${column}\".*) \"${column}\"`\n : `\"${column}\".r \"${column}\"`;\n }\n\n const col = data.shape[column];\n if (col) {\n if (col.data.name && col.data.name !== column) {\n return `${quotedAs ? `${quotedAs}.` : ''}\"${\n col.data.name\n }\" AS \"${column}\"`;\n }\n\n if (col.data.computed) {\n return `${col.data.computed.toSQL(ctx, quotedAs)} \"${column}\"`;\n }\n }\n\n return `${quotedAs ? `${quotedAs}.` : ''}\"${column}\"`;\n};\n\nexport const ownColumnToSql = (\n data: QueryData,\n column: string,\n quotedAs?: string,\n) => {\n const name = data.shape[column]?.data.name;\n return `${quotedAs ? `${quotedAs}.` : ''}\"${name || column}\"${\n name && name !== column ? ` AS \"${column}\"` : ''\n }`;\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: Pick<QueryData, 'shape' | 'joinedShapes'>,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n shape: ColumnsShapeBase = data.shape,\n select?: true,\n) => {\n return typeof expr === 'string'\n ? columnToSql(ctx, data, shape, expr, quotedAs, select)\n : expr.toSQL(ctx, quotedAs);\n};\n\nexport const quoteSchemaAndTable = (\n schema: string | undefined,\n table: string,\n) => {\n return schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n","import { Query } from './query/query';\nimport { ColumnsShapeBase } from 'orchid-core';\n\nexport abstract class OrchidOrmError extends Error {\n abstract query: Query;\n}\n\n/**\n * When we search for a single record, and it is not found, it can either throw an error, or return `undefined`.\n *\n * Unlike other database libraries, `Orchid ORM` decided to throw errors by default when using methods `take`, `find`, `findBy`, `get` and the record is not found.\n * It is a [good practice](https://github.com/goldbergyoni/nodebestpractices/blob/master/sections/errorhandling/centralizedhandling.md) to catch common errors in a centralized place (see [global error handling](https://orchid-orm.netlify.app/guide/error-handling.html#global-error-handling)), and this allows for a more concise code.\n *\n * If it's more suitable to get the `undefined` value instead of throwing, use `takeOptional`, `findOptional`, `findByOptional`, `getOptional` instead.\n */\nexport class NotFoundError extends OrchidOrmError {\n constructor(public query: Query, message = 'Record is not found') {\n super(message);\n }\n}\n\nexport class OrchidOrmInternalError extends Error {\n constructor(public query: Query, message?: string) {\n super(message);\n }\n}\n\nexport type QueryErrorName =\n | 'parseComplete'\n | 'bindComplete'\n | 'closeComplete'\n | 'noData'\n | 'portalSuspended'\n | 'replicationStart'\n | 'emptyQuery'\n | 'copyDone'\n | 'copyData'\n | 'rowDescription'\n | 'parameterDescription'\n | 'parameterStatus'\n | 'backendKeyData'\n | 'notification'\n | 'readyForQuery'\n | 'commandComplete'\n | 'dataRow'\n | 'copyInResponse'\n | 'copyOutResponse'\n | 'authenticationOk'\n | 'authenticationMD5Password'\n | 'authenticationCleartextPassword'\n | 'authenticationSASL'\n | 'authenticationSASLContinue'\n | 'authenticationSASLFinal'\n | 'error'\n | 'notice';\n\nexport abstract class QueryError<\n T extends { shape: ColumnsShapeBase } = { shape: ColumnsShapeBase },\n> extends OrchidOrmInternalError {\n message!: string;\n name!: QueryErrorName;\n stack: string | undefined;\n code: string | undefined;\n detail: string | undefined;\n severity: string | undefined;\n hint: string | undefined;\n position: string | undefined;\n internalPosition: string | undefined;\n internalQuery: string | undefined;\n where: string | undefined;\n schema: string | undefined;\n table: string | undefined;\n column: string | undefined;\n dataType: string | undefined;\n constraint: string | undefined;\n file: string | undefined;\n line: string | undefined;\n routine: string | undefined;\n\n get isUnique() {\n return this.code === '23505';\n }\n\n columnsCache?: { [K in keyof T['shape']]?: true };\n get columns() {\n if (this.columnsCache) return this.columnsCache;\n\n const columns: { [K in keyof T['shape']]?: true } = {};\n\n if (this.detail) {\n const list = this.detail.match(/\\((.*)\\)=/)?.[1];\n if (list) {\n list.split(', ').forEach((item) => {\n const column = (\n item.startsWith('\"') ? item.slice(1, -1) : item\n ) as keyof T['shape'];\n\n columns[column] = true;\n });\n }\n }\n\n return (this.columnsCache = columns);\n }\n}\n\nexport class MoreThanOneRowError extends OrchidOrmInternalError {\n constructor(query: Query, message?: string) {\n super(query, message);\n }\n}\n\nexport class UnhandledTypeError extends OrchidOrmInternalError {\n constructor(public query: Query, value: never) {\n super(query, `Unhandled type: ${JSON.stringify(value)} received`);\n }\n}\n","import {\n GetStringArg,\n OnQueryBuilder,\n QueryMethods,\n WhereResult,\n} from '../queryMethods';\nimport { QueryData } from '../sql';\nimport { ColumnType } from '../columns';\nimport { AliasOrTable } from '../common/utils';\nimport { Db } from './db';\nimport { RelationsBase } from '../relations';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n ColumnShapeOutput,\n ColumnsShapeBase,\n ColumnTypeBase,\n EmptyObject,\n Expression,\n QueryCatch,\n QueryThen,\n Spread,\n StringKey,\n} from 'orchid-core';\nimport { QueryBase } from './queryBase';\n\nexport type SelectableBase = Record<\n PropertyKey,\n { as: string; column: ColumnTypeBase }\n>;\n\nexport type SelectableFromShape<\n Shape extends ColumnsShapeBase,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape as `${Table}.${StringKey<K>}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport type WithDataItem = { table: string; shape: ColumnsShapeBase };\nexport type WithDataBase = Record<never, WithDataItem>;\n\nexport type Query = QueryBase &\n QueryMethods<unknown> & {\n queryBuilder: Db;\n columnTypes: unknown;\n onQueryBuilder: typeof OnQueryBuilder;\n table?: string;\n shape: ColumnsShapeBase;\n singlePrimaryKey: string;\n primaryKeys: string[];\n inputType: Record<string, unknown>;\n q: QueryData;\n result: ColumnsShapeBase;\n selectable: SelectableBase;\n then: QueryThen<unknown>;\n catch: QueryCatch<unknown>;\n windows: EmptyObject;\n defaultSelectColumns: string[];\n relations: RelationsBase;\n withData: WithDataBase;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n };\n\nexport type SelectableOfType<T extends QueryBase, Type> = StringKey<\n {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['type'] extends Type | null\n ? K\n : never;\n }[keyof T['selectable']]\n>;\n\nexport type SelectableOrExpressionOfType<\n T extends Query,\n C extends ColumnTypeBase,\n> =\n | SelectableOfType<T, C['type']>\n | Expression<ColumnTypeBase<C['type'] | null>>;\n\nexport type QueryWithTable = Query & { table: string };\n\nexport type QueryReturnType =\n | 'all'\n | 'one'\n | 'oneOrThrow'\n | 'rows'\n | 'pluck'\n | 'value'\n | 'valueOrThrow'\n | 'rowCount'\n | 'void';\n\nexport const queryTypeWithLimitOne = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n} as Record<QueryReturnType, true | undefined>;\n\nexport const isQueryReturnsAll = (q: Query) =>\n !q.q.returnType || q.q.returnType === 'all';\n\nexport type QueryReturnsAll<T extends QueryReturnType> = (\n QueryReturnType extends T ? 'all' : T\n) extends 'all'\n ? true\n : false;\n\nexport type GetQueryResult<\n ReturnType extends QueryReturnType,\n Result extends ColumnsShapeBase,\n> = QueryReturnsAll<ReturnType> extends true\n ? ColumnShapeOutput<Result>[]\n : ReturnType extends 'one'\n ? ColumnShapeOutput<Result> | undefined\n : ReturnType extends 'oneOrThrow'\n ? ColumnShapeOutput<Result>\n : ReturnType extends 'value'\n ? Result extends { value: ColumnType }\n ? Result['value']['outputType'] | undefined\n : never\n : ReturnType extends 'valueOrThrow'\n ? Result extends { value: ColumnType }\n ? Result['value']['outputType']\n : never\n : ReturnType extends 'rows'\n ? ColumnShapeOutput<Result>[keyof Result][][]\n : ReturnType extends 'pluck'\n ? Result extends { pluck: ColumnType }\n ? Result['pluck']['outputType'][]\n : never\n : ReturnType extends 'rowCount'\n ? number\n : ReturnType extends 'void'\n ? void\n : never;\n\nexport type AddQuerySelect<\n T extends Pick<Query, 'result' | 'meta' | 'returnType'>,\n Result extends ColumnsShapeBase,\n Data = GetQueryResult<T['returnType'], Result>,\n> = T['meta']['hasSelect'] extends true\n ? MergeSelect<T, Result, Data>\n : SetSelect<T, Result, Data>;\n\ntype MergeSelect<\n T extends Pick<Query, 'result'>,\n Result extends ColumnsShapeBase,\n Data,\n Merged extends ColumnsShapeBase = {\n [K in keyof T['result']]: K extends keyof Result ? unknown : T['result'][K];\n } & Result,\n> = {\n [K in keyof T]: K extends 'result'\n ? Merged\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\ntype SetSelect<\n T extends Pick<Query, 'result' | 'meta'>,\n Result extends ColumnsShapeBase,\n Data,\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & { hasSelect: true }\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport type SetQueryReturns<\n T extends Query,\n R extends QueryReturnType,\n Data = GetQueryResult<R, T['result']>,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? R\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n// Change the query type to return multiple object records.\n// It wraps the query with `WhereResult` to allow updating and deleting all records when the `all` method is used.\nexport type SetQueryReturnsAll<T extends Query> = SetQueryReturns<\n WhereResult<T>,\n 'all'\n>;\n\nexport type SetQueryReturnsOneOptional<T extends Query> = SetQueryReturns<\n T,\n 'one'\n>;\n\nexport type SetQueryReturnsOne<T extends Query> = SetQueryReturns<\n T,\n 'oneOrThrow'\n>;\n\nexport type SetQueryReturnsRows<T extends Query> = SetQueryReturns<T, 'rows'>;\n\nexport type SetQueryReturnsPluck<\n T extends Query,\n S extends keyof T['selectable'] | Expression,\n> = SetQueryReturnsPluckColumn<\n T,\n S extends keyof T['selectable']\n ? T['selectable'][S]['column']\n : S extends Expression\n ? S['_type']\n : never\n>;\n\nexport type SetQueryReturnsPluckColumn<\n T extends Query,\n C extends ColumnTypeBase,\n> = Omit<T, 'result' | 'returnType' | 'then' | 'catch'> & {\n meta: {\n hasSelect: true;\n };\n result: { pluck: C };\n returnType: 'pluck';\n then: QueryThen<C['outputType'][]>;\n catch: QueryCatch<C['outputType'][]>;\n};\n\nexport type SetQueryReturnsValueOptional<\n T extends Query,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsValue<T, Arg, 'value'>;\n\nexport type SetQueryReturnsValue<\n T extends Query,\n Arg extends GetStringArg<T>,\n ReturnType extends 'value' | 'valueOrThrow' = 'valueOrThrow',\n Column extends ColumnTypeBase = Arg extends keyof T['selectable']\n ? T['selectable'][Arg]['column']\n : Arg extends Query\n ? Arg['result']['value']\n : never,\n> = SetQueryReturnsColumn<T, Column, ReturnType> & Column['operators'];\n\nexport type SetQueryReturnsColumnOptional<\n T extends QueryBase,\n Column extends ColumnTypeBase,\n> = SetQueryReturnsColumn<T, Column, 'value'>;\n\nexport type SetQueryReturnsColumn<\n T extends QueryBase,\n Column extends ColumnTypeBase,\n ReturnType extends 'value' | 'valueOrThrow' = 'valueOrThrow',\n Data = ReturnType extends 'value'\n ? Column['outputType'] | undefined\n : Column['outputType'],\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & { hasSelect: true }\n : K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? ReturnType\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport type SetQueryReturnsRowCount<T extends Query> = SetQueryReturns<\n T,\n 'rowCount'\n>;\n\nexport type SetQueryReturnsVoid<T extends Query> = SetQueryReturns<T, 'void'>;\n\n// Set the kind of the query, can be 'select', 'update', 'create', etc.\n// `update` method is using the kind of query to allow only 'select' as a callback return for a column.\nexport type SetQueryKind<T extends Query, Kind extends string> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : T[K];\n};\n\nexport type SetQueryTableAlias<\n T extends Pick<Query, 'selectable' | 'table' | 'meta'> & {\n shape: ColumnsShapeBase;\n },\n As extends string,\n> = {\n [K in keyof T]: K extends 'selectable'\n ? Omit<\n T['selectable'],\n `${AliasOrTable<T>}.${StringKey<keyof T['shape']>}`\n > & {\n [K in keyof T['shape'] as `${As}.${StringKey<keyof T['shape']>}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : K extends 'meta'\n ? Omit<T['meta'], 'as'> & {\n as: As;\n }\n : T[K];\n};\n\nexport type SetQueryWith<\n T extends Query,\n WithData extends Record<string, WithDataItem>,\n> = { [K in keyof T]: K extends 'withData' ? WithData : T[K] };\n\nexport type AddQueryWith<\n T extends Query,\n With extends WithDataItem,\n> = SetQueryWith<T, Spread<[T['withData'], { [K in With['table']]: With }]>>;\n","import { rawOrColumnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: QueryBase,\n distinct: Exclude<SelectQueryData['distinct'], undefined>,\n quotedAs?: string,\n) => {\n ctx.sql.push('DISTINCT');\n\n if (distinct.length) {\n const columns = distinct?.map((item) =>\n rawOrColumnToSql(ctx, table.q, item, quotedAs),\n );\n ctx.sql.push(`ON (${columns?.join(', ') || ''})`);\n }\n};\n","import { JsonItem, SelectItem } from './types';\nimport { RawSQL } from './rawSql';\nimport { Query } from '../query/query';\nimport { addValue, columnToSql, columnToSqlWithAs } from './common';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../errors';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { SelectableOrExpression } from '../common/utils';\nimport { Expression, isExpression } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nconst jsonColumnOrMethodToSql = (\n ctx: ToSQLCtx,\n table: Query,\n column: string | JsonItem,\n values: unknown[],\n quotedAs?: string,\n) => {\n return typeof column === 'string'\n ? columnToSql(ctx, table.q, table.q.shape, column, quotedAs)\n : jsonToSql(ctx, table, column, values, quotedAs);\n};\n\nexport const jsonToSql = (\n ctx: ToSQLCtx,\n table: Query,\n item: JsonItem,\n values: unknown[],\n quotedAs?: string,\n): string => {\n const json = item.__json;\n if (json[0] === 'pathQuery') {\n const [, , , column, path, options] = json;\n return `jsonb_path_query(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, ${addValue(values, path)}${\n options?.vars ? `, ${addValue(values, options.vars)}` : ''\n }${options?.silent ? ', true' : ''})`;\n } else if (json[0] === 'set') {\n const [, , , column, path, value, options] = json;\n return `jsonb_set(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, '{${path.join(', ')}}', ${addValue(values, JSON.stringify(value))}${\n options?.createIfMissing ? ', true' : ''\n })`;\n } else if (json[0] === 'insert') {\n const [, , , column, path, value, options] = json;\n return `jsonb_insert(${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )}, '{${path.join(', ')}}', ${addValue(values, JSON.stringify(value))}${\n options?.insertAfter ? ', true' : ''\n })`;\n } else if (json[0] === 'remove') {\n const [, , , column, path] = json;\n return `${jsonColumnOrMethodToSql(\n ctx,\n table,\n column,\n values,\n quotedAs,\n )} #- '{${path.join(', ')}}'`;\n }\n return '';\n};\n\nexport const pushSelectSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs?: string,\n) => {\n ctx.sql.push(selectToSql(ctx, table, query, quotedAs));\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs?: string,\n): string => {\n if (query.select) {\n const list: string[] = [];\n for (const item of query.select) {\n if (typeof item === 'string') {\n list.push(selectedStringToSQL(ctx, table, query, quotedAs, item));\n } else if ('selectAs' in item) {\n const obj = item.selectAs as Record<\n string,\n SelectableOrExpression | Query\n >;\n for (const as in obj) {\n const value = obj[as];\n if (typeof value === 'object' || typeof value === 'function') {\n if (isExpression(value)) {\n list.push(`${value.toSQL(ctx, quotedAs)} AS \"${as}\"`);\n } else {\n pushSubQuerySql(ctx, value as Query, as, list, quotedAs);\n }\n } else {\n list.push(\n `${columnToSql(\n ctx,\n table.q,\n table.q.shape,\n value as string,\n quotedAs,\n true,\n )} AS \"${as}\"`,\n );\n }\n }\n } else {\n list.push(selectedObjectToSQL(ctx, table, quotedAs, item));\n }\n }\n return list.join(', ');\n }\n\n return selectAllSql(table, query, quotedAs);\n};\n\nexport const selectedStringToSQL = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<SelectQueryData, 'select' | 'join'>,\n quotedAs: string | undefined,\n item: string,\n) =>\n item === '*'\n ? selectAllSql(table, query, quotedAs)\n : columnToSqlWithAs(ctx, table.q, item, quotedAs, true);\n\nexport function selectedObjectToSQL(\n ctx: ToSQLCtx,\n table: Query,\n quotedAs: string | undefined,\n item: JsonItem | Expression,\n) {\n if ('__json' in item) {\n return `${jsonToSql(ctx, table, item, ctx.values, quotedAs)} \"${\n item.__json[1]\n }\"`;\n }\n\n const sql = item.toSQL(ctx, quotedAs);\n return ctx.aliasValue ? `${sql} r` : sql;\n}\n\nexport const selectAllSql = (\n table: QueryBase,\n query: Pick<SelectQueryData, 'join'>,\n quotedAs?: string,\n) => {\n return query.join?.length\n ? table.internal.columnsForSelectAll\n ?.map((item) => `${quotedAs}.${item}`)\n .join(', ') || `${quotedAs}.*`\n : table.internal.columnsForSelectAll?.join(', ') || '*';\n};\n\nconst pushSubQuerySql = (\n ctx: ToSQLCtx,\n query: Query,\n as: string,\n list: string[],\n quotedAs?: string,\n) => {\n const { returnType = 'all' } = query.q;\n\n if (query.q.joinedForSelect) {\n let sql;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n sql = `row_to_json(\"${query.q.joinedForSelect}\".*)`;\n break;\n case 'all':\n case 'pluck':\n case 'value':\n case 'valueOrThrow':\n case 'rows':\n sql = `\"${query.q.joinedForSelect}\".r`;\n break;\n case 'rowCount':\n case 'void':\n return;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n if (sql) list.push(`${coalesce(ctx, query, sql, quotedAs)} \"${as}\"`);\n return;\n }\n\n switch (returnType) {\n case 'all':\n case 'one':\n case 'oneOrThrow':\n query = query._json() as unknown as typeof query;\n break;\n case 'pluck': {\n const { select } = query.q;\n const first = select?.[0];\n if (!select || !first) {\n throw new OrchidOrmInternalError(\n query,\n `Nothing was selected for pluck`,\n );\n }\n\n const cloned = query.clone();\n cloned.q.select = [{ selectAs: { c: first } }] as SelectItem[];\n query = cloned._wrap(cloned.baseQuery.clone()) as unknown as typeof query;\n query._getOptional(new RawSQL(`COALESCE(json_agg(\"c\"), '[]')`));\n break;\n }\n case 'value':\n case 'valueOrThrow':\n case 'rows':\n case 'rowCount':\n case 'void':\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${makeSQL(query, ctx).text})`,\n quotedAs,\n )} AS \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: Query,\n sql: string,\n quotedAs?: string,\n) => {\n const { coalesceValue } = query.q;\n if (coalesceValue !== undefined) {\n const value = isExpression(coalesceValue)\n ? coalesceValue.toSQL(ctx, quotedAs)\n : addValue(ctx.values, coalesceValue);\n return `COALESCE(${sql}, ${value})`;\n }\n\n return sql;\n};\n","import { OrderItem, OrderTsQueryConfig, SortDir } from './types';\nimport { addValue, columnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { emptyObject } from 'orchid-core';\nimport { isExpression } from 'orchid-core';\n\nexport const pushOrderBySql = (\n ctx: ToSQLCtx,\n data: QueryData,\n quotedAs: string | undefined,\n order: Exclude<SelectQueryData['order'], undefined>,\n) => {\n ctx.sql.push(\n `ORDER BY ${order\n .map((item) => orderByToSql(ctx, data, item, quotedAs))\n .join(', ')}`,\n );\n};\n\nexport const orderByToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n order: OrderItem,\n quotedAs?: string,\n) => {\n if (typeof order === 'string') {\n return addOrder(ctx, data, order, quotedAs);\n }\n\n if (isExpression(order)) {\n return order.toSQL(ctx, quotedAs);\n }\n\n const sql: string[] = [];\n for (const key in order) {\n const value = order[key];\n sql.push(addOrder(ctx, data, key, quotedAs, value as SortDir));\n }\n return sql.join(', ');\n};\n\nconst addOrder = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n dir?: SortDir | OrderTsQueryConfig,\n): string => {\n if (data.sources?.[column]) {\n const search = data.sources[column];\n const order: OrderTsQueryConfig =\n dir ||\n (!search.order || search.order === true ? emptyObject : search.order);\n\n return `${order.coverDensity ? 'ts_rank_cd' : 'ts_rank'}(${\n order.weights ? `${addValue(ctx.values, `{${order.weights}}`)}, ` : ''\n }${search.vectorSQL}, \"${column}\"${\n order.normalization !== undefined\n ? `, ${addValue(ctx.values, order.normalization)}`\n : ''\n }) ${order.dir || 'DESC'}`;\n }\n\n return `${columnToSql(ctx, data, data.shape, column, quotedAs)} ${\n dir || 'ASC'\n }`;\n};\n","import { WindowDeclaration } from './types';\nimport { rawOrColumnToSql } from './common';\nimport { orderByToSql } from './orderBy';\nimport { QueryData } from './data';\nimport { Expression, isExpression } from 'orchid-core';\nimport { ToSQLCtx } from './toSQL';\n\nexport const windowToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n window: string | WindowDeclaration | Expression,\n quotedAs?: string,\n) => {\n if (typeof window === 'string') return `\"${window}\"`;\n\n if (isExpression(window)) return `(${window.toSQL(ctx, quotedAs)})`;\n\n const sql: string[] = [];\n if (window.partitionBy) {\n sql.push(\n `PARTITION BY ${\n Array.isArray(window.partitionBy)\n ? window.partitionBy\n .map((partitionBy) =>\n rawOrColumnToSql(ctx, data, partitionBy, quotedAs),\n )\n .join(', ')\n : rawOrColumnToSql(ctx, data, window.partitionBy, quotedAs)\n }`,\n );\n }\n\n if (window.order) {\n sql.push(`ORDER BY ${orderByToSql(ctx, data, window.order, quotedAs)}`);\n }\n\n return `(${sql.join(' ')})`;\n};\n","import { Query } from '../query/query';\nimport {\n SimpleJoinItem,\n WhereInItem,\n WhereItem,\n WhereJsonPathEqualsItem,\n WhereOnItem,\n WhereOnJoinItem,\n WhereSearchItem,\n} from './types';\nimport {\n addValue,\n columnToSql,\n simpleColumnToSQL,\n simpleExistingColumnToSQL,\n} from './common';\nimport { getClonedQueryData, getQueryAs } from '../common/utils';\nimport { processJoinItem } from './join';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { JoinedShapes, QueryData } from './data';\nimport { Expression, isExpression, MaybeArray, toArray } from 'orchid-core';\nimport { Operator } from '../columns/operators';\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, false);\n if (res) {\n ctx.sql.push('WHERE', res);\n }\n};\n\nexport const pushWhereToSql = (\n sql: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, not);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n): string | undefined => {\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n return ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs, not))\n .join(' OR ');\n } else if (query.and) {\n return processAnds(query.and, ctx, table, query, quotedAs, not);\n } else {\n return undefined;\n }\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes'>,\n quotedAs?: string,\n not?: boolean,\n): string => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs, not);\n }\n return ands.join(' AND ');\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: Pick<QueryData, 'and' | 'or' | 'shape' | 'joinedShapes' | 'language'>,\n data: WhereItem,\n quotedAs?: string,\n not?: boolean,\n) => {\n const prefix = not ? 'NOT ' : '';\n\n if (typeof data === 'function') {\n const qb = Object.create(table);\n qb.q = getClonedQueryData(query as QueryData);\n qb.q.and = qb.q.or = undefined;\n qb.q.isSubQuery = true;\n\n const res = data(qb);\n const expr = res instanceof Expression ? res : res.q.expr;\n if (!(res instanceof Expression) && res.q.expr) {\n const q =\n 'relationConfig' in res\n ? res.relationConfig.joinQuery(table, res)\n : res.clone();\n\n q.q.select = [expr as Expression];\n ands.push(`${prefix}(${makeSQL(q as Query, ctx).text})`);\n } else {\n pushWhereToSql(ands, ctx, res as Query, (res as Query).q, quotedAs, not);\n }\n\n return;\n }\n\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n const sql = whereToSql(\n ctx,\n query,\n query.q,\n query.table && `\"${query.table}\"`,\n );\n if (sql) {\n ands.push(`${prefix}(${sql})`);\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`${prefix}(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as Record<string, unknown>)[key];\n if (value === undefined) continue;\n\n if (key === 'AND') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(processAnds(arr, ctx, table, query, quotedAs, not));\n } else if (key === 'OR') {\n const arr = (value as MaybeArray<WhereItem>[]).map(toArray);\n ands.push(\n arr\n .map((and) => processAnds(and, ctx, table, query, quotedAs, not))\n .join(' OR '),\n );\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(processAnds(arr, ctx, table, query, quotedAs, !not));\n } else if (key === 'ON') {\n if (Array.isArray(value)) {\n const item = value as WhereJsonPathEqualsItem;\n const leftColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[0],\n quotedAs,\n );\n\n const leftPath = item[1];\n const rightColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[2],\n quotedAs,\n );\n\n const rightPath = item[3];\n\n ands.push(\n `${prefix}jsonb_path_query_first(${leftColumn}, ${addValue(\n ctx.values,\n leftPath,\n )}) = jsonb_path_query_first(${rightColumn}, ${addValue(\n ctx.values,\n rightPath,\n )})`,\n );\n } else {\n const item = value as WhereOnItem;\n const leftColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item.on[0],\n `\"${getJoinItemSource(item.joinFrom)}\"`,\n );\n\n const joinTo = getJoinItemSource(item.joinTo);\n const joinedShape = (query.joinedShapes as JoinedShapes)[joinTo];\n\n let op;\n let rightColumn;\n if (item.on.length === 2) {\n op = '=';\n rightColumn = columnToSql(\n ctx,\n query,\n joinedShape,\n item.on[1],\n `\"${joinTo}\"`,\n );\n } else {\n op = item.on[1];\n rightColumn = columnToSql(\n ctx,\n query,\n joinedShape,\n item.on[2],\n `\"${joinTo}\"`,\n );\n }\n\n ands.push(`${prefix}${leftColumn} ${op} ${rightColumn}`);\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, prefix, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as { args: SimpleJoinItem['args']; isSubQuery: boolean }[];\n\n for (const args of joinItems) {\n const { target, conditions } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n ands.push(\n `${prefix}EXISTS (SELECT 1 FROM ${target} WHERE ${conditions})`,\n );\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${prefix}${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (typeof value === 'object' && value && !(value instanceof Date)) {\n if (isExpression(value)) {\n ands.push(\n `${prefix}${columnToSql(\n ctx,\n query,\n query.shape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column = query.shape[key];\n let quotedColumn: string | undefined;\n if (column) {\n quotedColumn = simpleExistingColumnToSQL(ctx, key, column, quotedAs);\n } else if (!column) {\n const index = key.indexOf('.');\n if (index !== -1) {\n const table = key.slice(0, index);\n const quoted = `\"${table}\"`;\n const name = key.slice(index + 1);\n\n column = (\n quotedAs === quoted\n ? query.shape[name]\n : query.joinedShapes?.[table]?.[name]\n ) as typeof column;\n\n quotedColumn = simpleColumnToSQL(ctx, name, column, quoted);\n } else {\n quotedColumn = undefined;\n }\n\n if (!column || !quotedColumn) {\n // TODO: custom error classes\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n }\n\n if (value instanceof ctx.queryBuilder.constructor) {\n ands.push(\n `${prefix}${quotedColumn} = (${(value as Query).toSQL(ctx).text})`,\n );\n } else {\n for (const op in value) {\n const operator = column.operators[op];\n if (!operator) {\n // TODO: custom error classes\n throw new Error(`Unknown operator ${op} provided to condition`);\n }\n\n if (value[op as keyof typeof value] === undefined) continue;\n\n ands.push(\n `${prefix}${(operator as unknown as Operator<unknown>)._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n } else {\n ands.push(\n `${prefix}${columnToSql(ctx, query, query.shape, key, quotedAs)} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\n );\n }\n }\n};\n\nconst getJoinItemSource = (joinItem: WhereOnJoinItem) => {\n return typeof joinItem === 'string' ? joinItem : getQueryAs(joinItem);\n};\n\nconst pushIn = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n ands: string[],\n prefix: string,\n quotedAs: string | undefined,\n arg: {\n columns: string[];\n values: unknown[][] | Query | Expression;\n },\n) => {\n // if there are multiple columns, make `(col1, col2) IN ((1, 2), (3, 4))`,\n // otherwise, make `col IN (1, 2, 3)`\n const multiple = arg.columns.length > 1;\n\n let value: string;\n\n if (Array.isArray(arg.values)) {\n value = `${arg.values\n .map(\n multiple\n ? (arr) =>\n `(${arr.map((value) => addValue(ctx.values, value)).join(', ')})`\n : (arr) =>\n `${arr.map((value) => addValue(ctx.values, value)).join(', ')}`,\n )\n .join(', ')}`;\n\n value = `(${value})`;\n } else if (isExpression(arg.values)) {\n value = arg.values.toSQL(ctx, quotedAs);\n } else {\n const sql = makeSQL(arg.values, ctx);\n value = `(${sql.text})`;\n }\n\n const columnsSql = arg.columns\n .map((column) => columnToSql(ctx, query, query.shape, column, quotedAs))\n .join(', ');\n\n ands.push(\n `${prefix}${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`,\n );\n};\n","import { quoteSchemaAndTable, rawOrColumnToSql, columnToSql } from './common';\nimport { JoinItem, SimpleJoinItem } from './types';\nimport { Query, QueryWithTable } from '../query/query';\nimport { whereToSql } from './where';\nimport { ToSQLCtx } from './toSQL';\nimport { JoinedShapes, QueryData, SelectQueryData } from './data';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { QueryBase } from '../query/queryBase';\nimport { ColumnsShapeBase, Expression, isExpression } from 'orchid-core';\n\ntype ItemOf3Or4Length =\n | [\n _: unknown,\n leftColumn: string | Expression,\n rightColumn: string | Expression,\n ]\n | [\n _: unknown,\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n item: Pick<SimpleJoinItem, 'args' | 'isSubQuery'>,\n quotedAs: string | undefined,\n): { target: string; conditions?: string } => {\n let target: string;\n let conditions: string | undefined;\n\n const { args } = item;\n const [first] = args;\n if (typeof first === 'string') {\n if (first in table.relations) {\n const { query: toQuery, joinQuery } =\n table.relations[first].relationConfig;\n\n const jq = joinQuery(table, toQuery);\n const { q: j } = jq;\n\n const tableName = (\n typeof j.from === 'string' ? j.from : jq.table\n ) as string;\n\n target = quoteSchemaAndTable(j.schema, tableName);\n\n const as = j.as || first;\n const joinAs = `\"${as}\"`;\n if (as !== tableName) {\n target += ` AS ${joinAs}`;\n }\n\n const queryData = {\n shape: j.shape,\n joinedShapes: {\n ...query.joinedShapes,\n ...j.joinedShapes,\n [(table.q.as || table.table) as string]: table.shape,\n },\n and: j.and ? [...j.and] : [],\n or: j.or ? [...j.or] : [],\n };\n\n if (args[1]) {\n const arg = (args[1] as (q: unknown) => QueryBase)(\n new ctx.queryBuilder.onQueryBuilder(jq, j, table),\n ).q;\n\n if (arg.and) queryData.and.push(...arg.and);\n if (arg.or) queryData.or.push(...arg.or);\n }\n\n conditions = whereToSql(ctx, jq, queryData, joinAs);\n } else {\n target = `\"${first}\"`;\n const joinShape = (query.joinedShapes as JoinedShapes)[first];\n conditions = processArgs(\n args,\n ctx,\n table,\n query,\n first,\n target,\n joinShape,\n quotedAs,\n );\n }\n } else {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n target = quotedFrom || quoteSchemaAndTable(joinQuery.schema, first.table);\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const addAs = qAs && qAs !== joinAs;\n\n const joinedShape = first.shape;\n if (item.isSubQuery) {\n const subQuery = first.toSQL({\n values: ctx.values,\n });\n\n target = `(${subQuery.text}) ${qAs || joinAs}`;\n if (addAs) joinAs = qAs;\n } else {\n if (addAs) {\n joinAs = qAs;\n target += ` AS ${qAs}`;\n }\n }\n\n conditions = processArgs(\n args,\n ctx,\n table,\n query,\n first,\n joinAs,\n joinedShape,\n quotedAs,\n );\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!item.isSubQuery) {\n const whereSql = whereToSql(\n ctx,\n first,\n {\n ...joinQuery,\n joinedShapes: {\n ...query.joinedShapes,\n ...joinQuery.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.shape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (conditions) conditions += ` AND ${whereSql}`;\n else conditions = whereSql;\n }\n }\n }\n\n return { target, conditions };\n};\n\nconst processArgs = (\n args: SimpleJoinItem['args'],\n ctx: ToSQLCtx,\n table: QueryBase,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n first:\n | string\n | (QueryWithTable & {\n joinQueryAfterCallback?(fromQuery: Query, toQuery: Query): Query;\n }),\n joinAs: string,\n joinShape: ColumnsShapeBase,\n quotedAs?: string,\n) => {\n if (args.length === 2) {\n const arg = args[1];\n if (typeof arg === 'function') {\n const joinedShapes = {\n ...query.joinedShapes,\n [(table.q.as || table.table) as string]: table.shape,\n };\n\n let q: QueryBase;\n let data;\n if (typeof first === 'string') {\n const name = first;\n const query = table.q;\n const shape = query.withShapes?.[name];\n if (!shape) {\n throw new Error('Cannot get shape of `with` statement');\n }\n q = Object.create(table);\n q.q = {\n type: undefined,\n shape,\n adapter: query.adapter,\n handleResult: query.handleResult,\n returnType: 'all',\n logger: query.logger,\n } as SelectQueryData;\n data = { shape, joinedShapes };\n } else {\n q = first;\n\n if (first.joinQueryAfterCallback) {\n let base = q.baseQuery;\n if (q.q.as) {\n base = base.as(q.q.as);\n }\n\n const { q: query } = first.joinQueryAfterCallback(\n table as Query,\n base,\n );\n if (query.and) {\n pushQueryArray(q, 'and', query.and);\n }\n if (query.or) {\n pushQueryArray(q, 'or', query.or);\n }\n }\n\n data = {\n ...first.q,\n joinedShapes: { ...first.q.joinedShapes, ...joinedShapes },\n };\n }\n\n const jq = arg(new ctx.queryBuilder.onQueryBuilder(q, data, table));\n\n if (jq.q.joinedShapes !== joinedShapes) {\n jq.q.joinedShapes = {\n ...jq.q.joinedShapes,\n ...joinedShapes,\n };\n }\n\n return whereToSql(ctx, jq as Query, jq.q, joinAs);\n } else {\n return getObjectOrRawConditions(\n ctx,\n query,\n arg,\n quotedAs,\n joinAs,\n joinShape,\n );\n }\n } else if (args.length >= 3) {\n return getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf3Or4Length,\n joinShape,\n );\n }\n\n return undefined;\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n target: string,\n quotedAs: string | undefined,\n args: ItemOf3Or4Length,\n joinShape: ColumnsShapeBase,\n): string => {\n const [, leftColumn, opOrRightColumn, maybeRightColumn] = args;\n\n const op = maybeRightColumn ? opOrRightColumn : '=';\n const rightColumn = maybeRightColumn ? maybeRightColumn : opOrRightColumn;\n\n return `${rawOrColumnToSql(\n ctx,\n query,\n leftColumn,\n target,\n joinShape,\n )} ${op} ${rawOrColumnToSql(ctx, query, rightColumn, quotedAs, query.shape)}`;\n};\n\nconst getObjectOrRawConditions = (\n ctx: ToSQLCtx,\n query: Pick<QueryData, 'shape' | 'joinedShapes'>,\n data: Record<string, string | Expression> | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: ColumnsShapeBase,\n): string => {\n if (data === true) {\n return 'true';\n } else if (isExpression(data)) {\n return data.toSQL(ctx, quotedAs);\n } else {\n const pairs: string[] = [];\n const shape = query.shape;\n\n for (const key in data) {\n const value = data[key];\n\n pairs.push(\n `${columnToSql(\n ctx,\n query,\n joinShape,\n key,\n joinAs,\n )} = ${rawOrColumnToSql(ctx, query, value, quotedAs, shape)}`,\n );\n }\n\n return pairs.join(', ');\n }\n};\n\nexport const pushJoinSql = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n for (const item of query.join) {\n if (Array.isArray(item)) {\n const q = item[1];\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n const as = item[2];\n ctx.sql.push(\n `${item[0]} LATERAL (${q.toSQL(ctx).text}) \"${\n query.joinOverrides?.[as] || as\n }\" ON true`,\n );\n ctx.aliasValue = aliasValue;\n } else {\n const { target, conditions } = processJoinItem(\n ctx,\n table,\n query,\n item,\n quotedAs,\n );\n\n ctx.sql.push(item.type, target);\n if (conditions) ctx.sql.push('ON', conditions);\n }\n }\n};\n\nconst skipQueryKeysForSubQuery: Record<string, boolean> = {\n adapter: true,\n updateData: true,\n parsers: true,\n as: true,\n and: true,\n or: true,\n returnType: true,\n joinedShapes: true,\n returnsOne: true,\n};\n\nexport const getIsJoinSubQuery = (query: QueryData, baseQuery: QueryData) => {\n for (const key in query) {\n if (\n !skipQueryKeysForSubQuery[key] &&\n (query as Record<string, unknown>)[key] !==\n (baseQuery as Record<string, unknown>)[key]\n ) {\n return true;\n }\n }\n return false;\n};\n","import { ToSQLCtx } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { templateLiteralToSQL } from './rawSql';\nimport { Expression, TemplateLiteralArgs } from 'orchid-core';\n\nexport const pushHavingSql = (\n ctx: ToSQLCtx,\n query: SelectQueryData,\n quotedAs?: string,\n) => {\n const conditions = havingToSql(ctx, query, quotedAs);\n if (conditions?.length) ctx.sql.push('HAVING', conditions);\n};\n\nexport const havingToSql = (\n ctx: ToSQLCtx,\n query: SelectQueryData,\n quotedAs?: string,\n): string | undefined => {\n return query.having\n ?.map((it) =>\n 'raw' in it[0]\n ? templateLiteralToSQL(it as TemplateLiteralArgs, ctx, quotedAs)\n : it\n .map((item) => (item as Expression).toSQL(ctx, quotedAs))\n .join(' AND '),\n )\n .join(' AND ');\n};\n","import { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData } from './data';\nimport { isExpression } from 'orchid-core';\n\nexport const pushWithSql = (\n ctx: ToSQLCtx,\n withData: Exclude<QueryData['with'], undefined>,\n) => {\n if (!withData.length) return;\n\n ctx.sql.push(\n 'WITH',\n withData\n .map((withItem) => {\n const [name, options, query] = withItem;\n\n let inner: string;\n if (isExpression(query)) {\n inner = query.toSQL(ctx, `\"${name}\"`);\n } else {\n inner = makeSQL(query, ctx).text;\n }\n\n return `${options.recursive ? 'RECURSIVE ' : ''}\"${name}\"${\n options.columns\n ? `(${options.columns.map((x) => `\"${x}\"`).join(', ')})`\n : ''\n } AS ${\n options.materialized\n ? 'MATERIALIZED '\n : options.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`;\n })\n .join(', '),\n );\n};\n","import { Query, QueryWithTable, SelectableBase } from '../query/query';\nimport { RelationQuery } from '../relations';\nimport { SelectableOrExpression } from '../common/utils';\nimport { SelectQueryData } from './data';\nimport {\n ColumnTypeBase,\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\n// used in `from` logic to decide if convert query to sql or just write table name\nexport const checkIfASimpleQuery = (q: Query) => {\n if (\n (q.q.returnType && q.q.returnType !== 'all') ||\n q.internal.columnsForSelectAll ||\n q.q.and?.length ||\n q.q.or?.length\n )\n return false;\n\n const keys = Object.keys(q.q) as (keyof SelectQueryData)[];\n return !keys.some((key) => queryKeysOfNotSimpleQuery.includes(key));\n};\n\nconst queryKeysOfNotSimpleQuery: (keyof SelectQueryData)[] = [\n 'with',\n 'as',\n 'from',\n 'select',\n 'distinct',\n 'fromOnly',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n\nexport type WithItem = [\n as: string,\n options: WithOptions,\n query: Query | Expression,\n];\n\nexport type WithOptions = {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n};\n\nexport type JsonItem<\n As extends string = string,\n Type extends ColumnTypeBase = ColumnTypeBase,\n> = {\n __json:\n | [\n kind: 'set',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n value: unknown,\n options?: {\n createIfMissing?: boolean;\n },\n ]\n | [\n kind: 'insert',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n value: unknown,\n options?: {\n insertAfter?: boolean;\n },\n ]\n | [\n kind: 'remove',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: Array<string | number>,\n ]\n | [\n kind: 'pathQuery',\n as: As,\n type: Type,\n column: string | JsonItem,\n path: string,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ];\n};\n\nexport type SelectItem = string | SelectAs | JsonItem | Expression;\n\nexport type SelectAs = {\n selectAs: Record<string, string | Query | Expression>;\n};\n\nexport type OrderTsQueryConfig =\n | true\n | {\n coverDensity?: boolean;\n weights?: number[];\n normalization?: number;\n dir?: SortDir;\n };\n\nexport type QuerySourceItem = {\n queryAs: string;\n as?: string;\n textSQL?: MaybeArray<string>;\n langSQL?: string;\n vectorSQL?: string;\n order?: OrderTsQueryConfig;\n} & (\n | {\n language?: string;\n }\n | {\n languageColumn: string;\n }\n) &\n (\n | {\n text: string | Expression;\n }\n | {\n in: MaybeArray<string> | Record<string, SearchWeight>;\n }\n | {\n vector: string;\n }\n ) &\n (\n | {\n query: string | Expression;\n }\n | {\n plainQuery: string | Expression;\n }\n | {\n phraseQuery: string | Expression;\n }\n | {\n tsQuery: string | Expression;\n }\n );\n\nexport type JoinItem = SimpleJoinItem | JoinLateralItem;\n\nexport type SimpleJoinItem = {\n type: string;\n args:\n | [relation: string]\n | [\n arg: string | QueryWithTable,\n conditions:\n | Record<string, string | Expression>\n | Expression\n | ((q: unknown) => QueryBase)\n | true,\n ]\n | [\n arg: string | QueryWithTable,\n leftColumn: string | Expression,\n rightColumn: string | Expression,\n ]\n | [\n arg: string | QueryWithTable,\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n // available only for QueryWithTable as first argument\n isSubQuery: boolean;\n};\n\nexport type JoinLateralItem = [type: string, joined: Query, as: string];\n\nexport type WhereItem =\n | (Omit<\n Record<\n string,\n unknown | Record<string, unknown | Query | Expression> | Expression\n >,\n 'NOT' | 'AND' | 'OR' | 'IN' | 'EXISTS' | 'ON' | 'ON_JSON_PATH_EQUALS'\n > & {\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<SimpleJoinItem['args']>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n })\n | ((q: unknown) => QueryBase | RelationQuery | Expression)\n | Query\n | Expression;\n\nexport type WhereInItem = {\n columns: string[];\n values: unknown[][] | Query | Expression;\n};\n\nexport type WhereJsonPathEqualsItem = [\n leftColumn: string,\n leftPath: string,\n rightColumn: string,\n rightPath: string,\n];\n\nexport type WhereOnItem = {\n joinFrom: WhereOnJoinItem;\n joinTo: WhereOnJoinItem;\n on:\n | [leftFullColumn: string, rightFullColumn: string]\n | [leftFullColumn: string, op: string, rightFullColumn: string];\n};\n\nexport type WhereOnJoinItem = { table?: string; q: { as?: string } } | string;\n\nexport type SearchWeight = 'A' | 'B' | 'C' | 'D';\n\nexport type WhereSearchItem = {\n as: string;\n vectorSQL: string;\n};\n\nexport type SortDir = 'ASC' | 'DESC' | 'ASC NULLS FIRST' | 'DESC NULLS LAST';\n\nexport type OrderItem = string | Record<string, SortDir> | Expression;\n\nexport type ColumnOperators<\n S extends SelectableBase,\n Column extends keyof S,\n> = {\n [O in keyof S[Column]['column']['operators']]?:\n | S[Column]['column']['operators'][O]['_opType'];\n};\n\nexport type HavingItem = TemplateLiteralArgs | Expression[];\n\nexport type WindowItem = Record<string, WindowDeclaration | Expression>;\n\nexport type WindowDeclaration = {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n};\n\nexport type UnionItem = Query | Expression;\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport type OnConflictItem = string | string[] | Expression;\n\nexport type OnConflictMergeUpdate =\n | string\n | string[]\n | Record<string, unknown>\n | Expression;\n","import { addValue, columnToSql, quoteSchemaAndTable } from './common';\nimport { checkIfASimpleQuery, QuerySourceItem } from './types';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\nimport { isExpression, isRawSQL, MaybeArray } from 'orchid-core';\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n table: QueryBase,\n data: SelectQueryData,\n quotedAs?: string,\n) => {\n let sql = 'FROM ';\n if (data.fromOnly) sql += 'ONLY ';\n\n const from = getFrom(ctx, table, data, quotedAs);\n sql += from;\n\n if (data.as && quotedAs && quotedAs !== from) {\n sql += ` AS ${quotedAs}`;\n }\n\n for (const as in data.sources) {\n const source = data.sources[as];\n\n const lang = getSearchLang(ctx, data, source, quotedAs);\n source.vectorSQL = getTsVector(ctx, data, lang, source, quotedAs);\n\n let fn;\n let query;\n if ('query' in source) {\n fn = 'websearch_to_tsquery';\n query = source.query;\n } else if ('plainQuery' in source) {\n fn = 'plainto_tsquery';\n query = source.plainQuery;\n } else if ('phraseQuery' in source) {\n fn = 'phraseto_tsquery';\n query = source.phraseQuery;\n } else {\n fn = 'to_tsquery';\n query = source.tsQuery;\n }\n\n let querySql;\n if (typeof query === 'string') {\n ctx.values.push(query);\n querySql = `$${ctx.values.length}`;\n } else {\n querySql = `${query.toSQL(ctx, quotedAs)}`;\n }\n\n sql += `, ${fn}(${lang}, ${querySql}) \"${as}\"`;\n }\n\n ctx.sql.push(sql);\n};\n\nconst getFrom = (\n ctx: ToSQLCtx,\n table: QueryBase,\n query: SelectQueryData,\n quotedAs?: string,\n) => {\n if (query.from) {\n const { from } = query;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n return from.toSQL(ctx, quotedAs);\n }\n\n if (!from.table) {\n const sql = makeSQL(from, ctx);\n return `(${sql.text})`;\n }\n\n // if query contains more than just schema return (SELECT ...)\n if (!checkIfASimpleQuery(from)) {\n const sql = makeSQL(from, ctx);\n return `(${sql.text})`;\n }\n\n return quoteSchemaAndTable(from.q.schema, from.table);\n }\n\n return quoteSchemaAndTable(query.schema, from);\n }\n\n return quoteSchemaAndTable(query.schema, table.table as string);\n};\n\nexport const getSearchLang = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n return (source.langSQL ??=\n 'languageColumn' in source\n ? columnToSql(ctx, data, data.shape, source.languageColumn, quotedAs)\n : isRawSQL(source.language)\n ? source.language.toSQL(ctx)\n : addValue(ctx.values, source.language || data.language || 'english'));\n};\n\nexport const getSearchText = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n forHeadline?: boolean,\n): MaybeArray<string> => {\n let sql = source.textSQL;\n if (sql) return sql;\n\n if ('in' in source) {\n if (typeof source.in === 'string') {\n sql = columnToSql(ctx, data, data.shape, source.in, quotedAs);\n } else if (Array.isArray(source.in)) {\n sql = `concat_ws(' ', ${source.in\n .map((column) => columnToSql(ctx, data, data.shape, column, quotedAs))\n .join(', ')})`;\n } else {\n sql = [];\n for (const key in source.in) {\n sql.push(columnToSql(ctx, data, data.shape, key, quotedAs));\n }\n }\n } else if ('vector' in source) {\n if (forHeadline) {\n throw new Error(\n 'Cannot use a search based on a vector column for a search headline',\n );\n }\n\n sql = columnToSql(ctx, data, data.shape, source.vector, quotedAs);\n } else {\n if (typeof source.text === 'string') {\n sql = addValue(ctx.values, source.text);\n } else {\n sql = source.text.toSQL(ctx, quotedAs);\n }\n }\n\n return (source.textSQL = sql);\n};\n\nconst getTsVector = (\n ctx: ToSQLCtx,\n data: QueryData,\n lang: string,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n const text = getSearchText(ctx, data, source, quotedAs);\n\n if ('in' in source) {\n if (typeof source.in === 'string' || Array.isArray(source.in)) {\n return `to_tsvector(${lang}, ${text})`;\n } else {\n let tsVector = '';\n let i = 0;\n for (const key in source.in) {\n tsVector =\n (tsVector ? `${tsVector} || ` : '') +\n `setweight(to_tsvector(${lang}, ${text[i++]}), ${addValue(\n ctx.values,\n source.in[key],\n )})`;\n }\n return tsVector;\n }\n } else if ('vector' in source) {\n return text as string;\n } else {\n return `to_tsvector(${lang}, ${text})`;\n }\n};\n","import { addValue, ownColumnToSql } from './common';\nimport { pushWhereStatementSql } from './where';\nimport { Query } from '../query/query';\nimport { selectToSql } from './select';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { InsertQueryData, QueryData, QueryHookSelect } from './data';\nimport { emptyArray, Expression, isExpression } from 'orchid-core';\nimport { ColumnData } from '../columns';\nimport { joinSubQuery, resolveSubQueryCallback } from '../common/utils';\nimport { Db } from '../query/db';\nimport { RawSQL } from './rawSql';\n\n// reuse array for the columns list\nconst quotedColumns: string[] = [];\n\nexport const pushInsertSql = (\n ctx: ToSQLCtx,\n q: Query,\n query: InsertQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const { columns, shape } = query;\n quotedColumns.length = columns.length;\n for (let i = 0, len = columns.length; i < len; i++) {\n quotedColumns[i] = `\"${shape[columns[i]]?.data.name || columns[i]}\"`;\n }\n\n let runtimeDefaults: (() => unknown)[] | undefined;\n if (q.internal.runtimeDefaultColumns) {\n runtimeDefaults = [];\n for (const key of q.internal.runtimeDefaultColumns) {\n if (!columns.includes(key)) {\n const column = shape[key];\n quotedColumns.push(`\"${column.data.name || key}\"`);\n runtimeDefaults.push(column.data.runtimeDefault as () => unknown);\n }\n }\n }\n\n let values = query.values;\n if (quotedColumns.length === 0) {\n const key = Object.keys(q.shape)[0];\n const column = q.shape[key];\n quotedColumns[0] = `\"${column?.data.name || key}\"`;\n\n // for `create({})` case: `{}` is transformed into `[[]]`,\n // we replace it with `[[undefined]]`, and it generates SQL `VALUES (DEFAULT)`\n if (Array.isArray(values) && Array.isArray(values[0])) {\n values = [[undefined]];\n }\n }\n\n ctx.sql.push(`INSERT INTO ${quotedAs}(${quotedColumns.join(', ')})`);\n\n const QueryClass = ctx.queryBuilder.constructor as Db;\n\n if (query.kind === 'object') {\n let sql = '';\n for (let i = 0; i < (values as unknown[][]).length; i++) {\n if (i) sql += ', ';\n sql += `(${encodeRow(\n ctx,\n q,\n QueryClass,\n (values as unknown[][])[i],\n runtimeDefaults,\n quotedAs,\n )})`;\n }\n\n ctx.sql.push(`VALUES ${sql}`);\n } else if (query.kind === 'raw') {\n if (isExpression(values)) {\n let valuesSql = values.toSQL(ctx, quotedAs);\n\n if (runtimeDefaults) {\n valuesSql += `, ${runtimeDefaults\n .map((fn) => addValue(ctx.values, fn()))\n .join(', ')}`;\n }\n\n ctx.sql.push(`VALUES (${valuesSql})`);\n } else {\n let sql;\n\n if (runtimeDefaults) {\n const { values: v } = ctx;\n sql = (values as Expression[])\n .map(\n (raw) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n `(${raw.toSQL(ctx, quotedAs)}, ${runtimeDefaults!\n .map((fn) => addValue(v, fn()))\n .join(', ')})`,\n )\n .join(', ');\n } else {\n sql = (values as Expression[])\n .map((raw) => `(${raw.toSQL(ctx, quotedAs)})`)\n .join(', ');\n }\n\n ctx.sql.push(`VALUES ${sql}`);\n }\n } else {\n const { from, values: v } = values as { from: Query; values?: unknown[][] };\n const q = from.clone();\n\n if (v) {\n pushQueryValue(\n q,\n 'select',\n new RawSQL(\n encodeRow(ctx, q, QueryClass, v[0], runtimeDefaults, quotedAs),\n ),\n );\n }\n\n ctx.sql.push(makeSQL(q, { values: ctx.values }).text);\n }\n\n if (query.onConflict) {\n ctx.sql.push('ON CONFLICT');\n\n const { expr, type } = query.onConflict;\n if (expr) {\n if (typeof expr === 'string') {\n ctx.sql.push(`(\"${shape[expr]?.data.name || expr}\")`);\n } else if (Array.isArray(expr)) {\n ctx.sql.push(\n `(${expr.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else {\n ctx.sql.push(expr.toSQL(ctx, quotedAs));\n }\n } else if (type === 'merge') {\n // TODO: optimize, unique columns could be stored in Query.internal\n // consider saving a cache of columns for this case into Query.internal\n\n const { indexes } = q.internal;\n\n const quotedUniques = columns.reduce((arr: string[], key, i) => {\n const unique =\n // check column index\n (shape[key]?.data as ColumnData).indexes?.some(\n (index) => index.unique,\n ) ||\n // check table composite indexes\n indexes?.some((index) =>\n index.columns.some(\n (item) => 'column' in item && item.column === key,\n ),\n );\n\n if (unique) arr.push(quotedColumns[i]);\n return arr;\n }, []);\n\n ctx.sql.push(`(${quotedUniques.join(', ')})`);\n }\n\n if (type === 'ignore') {\n ctx.sql.push('DO NOTHING');\n } else if (type === 'merge') {\n let set: string;\n\n const { update } = query.onConflict;\n if (update) {\n if (typeof update === 'string') {\n const name = shape[update]?.data.name || update;\n set = `\"${name}\" = excluded.\"${name}\"`;\n } else if (Array.isArray(update)) {\n set = update.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '');\n } else if (isExpression(update)) {\n set = update.toSQL(ctx, quotedAs);\n } else {\n const arr: string[] = [];\n for (const key in update) {\n arr.push(\n `\"${shape[key]?.data.name || key}\" = ${addValue(\n ctx.values,\n update[key],\n )}`,\n );\n }\n set = arr.join(', ');\n }\n } else {\n set = quotedColumns\n .map((column) => `${column} = excluded.${column}`)\n .join(', ');\n }\n\n ctx.sql.push('DO UPDATE SET', set);\n }\n }\n\n pushWhereStatementSql(ctx, q, query, quotedAs);\n return pushReturningSql(ctx, q, query, quotedAs, query.afterCreateSelect);\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n q: Query,\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n) => {\n const arr = row.map((value) => {\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q, value as (q: Query) => Query);\n }\n\n if (value && typeof value === 'object') {\n if (value instanceof Expression) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof QueryClass) {\n return `(${joinSubQuery(q, value as Query).toSQL(ctx).text})`;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(ctx.values, value);\n });\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(ctx.values, fn()));\n }\n }\n\n return arr.join(', ');\n};\n\nexport const pushReturningSql = (\n ctx: ToSQLCtx,\n q: Query,\n data: QueryData,\n quotedAs: string,\n hookSelect?: QueryHookSelect,\n keyword = 'RETURNING', // noop update can use this function for `SELECT` list\n): QueryHookSelect | undefined => {\n const { select } = data;\n if (!hookSelect?.length && !select) return hookSelect;\n\n let selected: string | undefined;\n let hookFiltered: string[] | undefined;\n if (select) {\n selected = selectToSql(ctx, q, data, quotedAs);\n if (hookSelect) {\n if (select.includes('*')) {\n hookFiltered = emptyArray;\n } else {\n hookFiltered = [];\n for (const column of hookSelect) {\n if (\n !hookFiltered.includes(column) &&\n !select?.includes(column) &&\n !select?.includes(`${quotedAs}.${column}`)\n ) {\n hookFiltered.push(column);\n }\n }\n }\n }\n } else {\n hookFiltered = [];\n for (const column of hookSelect as string[]) {\n if (!hookFiltered.includes(column)) hookFiltered.push(column);\n }\n }\n\n ctx.sql.push(keyword);\n if (hookFiltered?.length) {\n if (selected) ctx.sql.push(`${selected},`);\n ctx.sql.push(\n hookFiltered\n .map((column) => ownColumnToSql(data, column, quotedAs))\n .join(', '),\n );\n } else {\n ctx.sql.push(selected as string);\n }\n\n return hookFiltered;\n};\n","import { Query } from '../query/query';\nimport { addValue, quoteSchemaAndTable } from './common';\nimport { pushReturningSql } from './insert';\nimport { pushWhereStatementSql } from './where';\nimport { pushLimitSQL, ToSQLCtx } from './toSQL';\nimport {\n QueryHookSelect,\n SelectQueryData,\n UpdateQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from './data';\nimport { isExpression, pushOrNewArray } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { joinSubQuery } from '../common/utils';\nimport { JsonItem } from './types';\nimport { jsonToSql } from './select';\nimport { countSelect } from './rawSql';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: UpdateQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const quotedTable = quoteSchemaAndTable(query.schema, table.table as string);\n\n const set: string[] = [];\n processData(ctx, table, set, query.updateData, quotedAs);\n\n // if no values to set, make an `SELECT` query\n if (!set.length) {\n if (!query.select) {\n query.select = countSelect;\n }\n\n const hookSelect = pushReturningSql(\n ctx,\n table,\n query,\n quotedAs,\n query.afterUpdateSelect,\n 'SELECT',\n );\n\n ctx.sql.push(`FROM ${quotedTable}`);\n pushWhereStatementSql(ctx, table, query, quotedAs);\n pushLimitSQL(ctx.sql, ctx.values, query as unknown as SelectQueryData);\n\n return hookSelect;\n }\n\n ctx.sql.push(`UPDATE ${quotedTable}`);\n\n if (quotedTable !== quotedAs) {\n ctx.sql.push(`AS ${quotedAs}`);\n }\n\n ctx.sql.push('SET');\n ctx.sql.push(set.join(', '));\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n return pushReturningSql(ctx, table, query, quotedAs, query.afterUpdateSelect);\n};\n\nconst processData = (\n ctx: ToSQLCtx,\n table: Query,\n set: string[],\n data: UpdateQueryDataItem[],\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n const QueryClass = ctx.queryBuilder.constructor as Db;\n\n for (const item of data) {\n if (typeof item === 'function') {\n const result = item(data);\n if (result) append = pushOrNewArray(append, result);\n } else if (isExpression(item)) {\n set.push(item.toSQL(ctx, quotedAs));\n } else {\n const shape = table.q.shape;\n for (const key in item) {\n const value = item[key];\n if (value === undefined) continue;\n\n set.push(\n `\"${shape[key].data.name || key}\" = ${processValue(\n ctx,\n table,\n QueryClass,\n key,\n value,\n quotedAs,\n )}`,\n );\n }\n }\n }\n\n if (append) processData(ctx, table, set, append, quotedAs);\n};\n\nconst processValue = (\n ctx: ToSQLCtx,\n table: Query,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if ((value as JsonItem).__json) {\n return jsonToSql(ctx, table, value as JsonItem, ctx.values, quotedAs);\n } else if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof QueryClass) {\n return `(${joinSubQuery(table, value as Query).toSQL(ctx).text})`;\n } else if ('op' in value && 'arg' in value) {\n return `\"${table.q.shape[key].data.name || key}\" ${\n (value as { op: string }).op\n } ${addValue(ctx.values, (value as { arg: unknown }).arg)}`;\n }\n }\n\n return addValue(ctx.values, value);\n};\n","import { Query } from '../query/query';\nimport { pushWhereStatementSql } from './where';\nimport { pushReturningSql } from './insert';\nimport { processJoinItem } from './join';\nimport { ToSQLCtx } from './toSQL';\nimport { DeleteQueryData, QueryHookSelect } from './data';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: DeleteQueryData,\n quotedAs: string,\n): QueryHookSelect | undefined => {\n const from = `\"${table.table}\"`;\n ctx.sql.push(`DELETE FROM ${from}`);\n\n if (from !== quotedAs) {\n ctx.sql.push(`AS ${quotedAs}`);\n }\n\n let conditions: string | undefined;\n if (query.join?.length) {\n const items: { target: string; conditions?: string }[] = [];\n for (const item of query.join) {\n // skip join lateral: it's not supported here, and it's not clean if it's supported in DELETE by the db\n if (!Array.isArray(item)) {\n items.push(processJoinItem(ctx, table, query, item, quotedAs));\n }\n }\n\n if (items.length) {\n ctx.sql.push(`USING ${items.map((item) => item.target).join(', ')}`);\n\n conditions = items\n .map((item) => item.conditions)\n .filter(Boolean)\n .join(' AND ');\n }\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n\n if (conditions?.length) {\n if (query.and?.length || query.or?.length) {\n ctx.sql.push('AND', conditions);\n } else {\n ctx.sql.push('WHERE', conditions);\n }\n }\n\n return pushReturningSql(ctx, table, query, quotedAs, query.afterDeleteSelect);\n};\n","import { quoteSchemaAndTable } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { TruncateQueryData } from './data';\n\nexport const pushTruncateSql = (\n ctx: ToSQLCtx,\n table: string,\n query: TruncateQueryData,\n) => {\n ctx.sql.push('TRUNCATE', quoteSchemaAndTable(query.schema, table));\n\n if (query.restartIdentity) ctx.sql.push('RESTART IDENTITY');\n if (query.cascade) ctx.sql.push('CASCADE');\n};\n","import { addValue } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { ColumnInfoQueryData } from './data';\nimport { Query } from '../query/query';\n\nexport const pushColumnInfoSql = (\n ctx: ToSQLCtx,\n table: Query,\n query: ColumnInfoQueryData,\n) => {\n ctx.sql.push(\n `SELECT * FROM information_schema.columns WHERE table_name = ${addValue(\n ctx.values,\n table.table,\n )} AND table_catalog = current_database() AND table_schema = ${\n query.schema || 'current_schema()'\n }`,\n );\n\n if (query.column) {\n ctx.sql.push(\n `AND column_name = ${addValue(\n ctx.values,\n table.q.shape[query.column]?.data.name || query.column,\n )}`,\n );\n }\n};\n","const singleQuoteRegex = /'/g;\nconst doubleQuoteRegex = /\"/g;\n\n// eslint-disable-next-line\ntype Value = any;\n\nconst quoteValue = (value: Value): string => {\n const type = typeof value;\n if (type === 'number') return String(value);\n else if (type === 'string')\n return `\"${(value as string)\n .replace(doubleQuoteRegex, '\\\\\"')\n .replace(singleQuoteRegex, \"''\")}\"`;\n else if (type === 'boolean') return value ? 'true' : 'false';\n else if (value instanceof Date) return `\"${value.toISOString()}\"`;\n else if (Array.isArray(value)) return quoteArray(value);\n else if (value === null || value === undefined) return 'NULL';\n else\n return `\"${JSON.stringify(value)\n .replace(doubleQuoteRegex, '\\\\\"')\n .replace(singleQuoteRegex, \"''\")}\"`;\n};\n\nconst quoteArray = (array: Value[]) => `'{${array.map(quoteValue).join(',')}}'`;\n\nexport const quote = (value: Value): string => {\n const type = typeof value;\n if (type === 'number') return `${value}`;\n else if (type === 'string') return quoteString(value);\n else if (type === 'boolean') return value ? 'true' : 'false';\n else if (value instanceof Date) return `'${value.toISOString()}'`;\n else if (Array.isArray(value)) return quoteArray(value);\n else if (value === null || value === undefined) return 'NULL';\n else return `'${JSON.stringify(value).replace(singleQuoteRegex, \"''\")}'`;\n};\n\nexport const quoteString = (value: string) => {\n return `'${(value as string).replace(singleQuoteRegex, \"''\")}'`;\n};\n","import { ToSQLCtx } from './toSQL';\nimport { CopyQueryData } from './data';\nimport { Query } from '../query/query';\nimport { quoteString } from '../quote';\nimport { pushWhereStatementSql } from './where';\n\nexport const pushCopySql = (\n ctx: ToSQLCtx,\n table: Query,\n query: CopyQueryData,\n quotedAs?: string,\n) => {\n const { sql } = ctx;\n const { copy } = query;\n\n const columns = copy.columns\n ? `(${copy.columns\n .map((item) => `\"${query.shape[item]?.data.name || item}\"`)\n .join(', ')})`\n : '';\n\n const target = 'from' in copy ? copy.from : copy.to;\n\n sql.push(\n `COPY \"${table.table as string}\"${columns} ${\n 'from' in copy ? 'FROM' : 'TO'\n } ${\n typeof target === 'string'\n ? quoteString(target)\n : `PROGRAM ${quoteString(target.program)}`\n }`,\n );\n\n if (Object.keys(copy).length > (copy.columns ? 2 : 1)) {\n const options: string[] = [];\n\n if (copy.format) options.push(`FORMAT ${copy.format}`);\n if (copy.freeze) options.push(`FREEZE ${copy.freeze}`);\n if (copy.delimiter)\n options.push(`DELIMITER ${quoteString(copy.delimiter)}`);\n if (copy.null) options.push(`NULL ${quoteString(copy.null)}`);\n if (copy.header) options.push(`HEADER ${copy.header}`);\n if (copy.quote) options.push(`QUOTE ${quoteString(copy.quote)}`);\n if (copy.escape) options.push(`ESCAPE ${quoteString(copy.escape)}`);\n if (copy.forceQuote)\n options.push(\n `FORCE_QUOTE ${\n copy.forceQuote === '*'\n ? '*'\n : `(${copy.forceQuote.map((x) => `\"${x}\"`).join(', ')})`\n }`,\n );\n if (copy.forceNotNull)\n options.push(\n `FORCE_NOT_NULL (${copy.forceNotNull.map((x) => `\"${x}\"`).join(', ')})`,\n );\n if (copy.forceNull)\n options.push(\n `FORCE_NULL (${copy.forceNull.map((x) => `\"${x}\"`).join(', ')})`,\n );\n if (copy.encoding) options.push(`ENCODING ${quoteString(copy.encoding)}`);\n\n sql.push(`WITH (${options.join(', ')})`);\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n};\n","import { Query, queryTypeWithLimitOne } from '../query/query';\nimport { addValue, columnToSql } from './common';\nimport { JoinItem } from './types';\nimport { pushDistinctSql } from './distinct';\nimport { pushSelectSql } from './select';\nimport { windowToSql } from './window';\nimport { pushJoinSql } from './join';\nimport { pushWhereStatementSql } from './where';\nimport { pushHavingSql } from './having';\nimport { pushWithSql } from './with';\nimport { pushFromAndAs } from './fromAndAs';\nimport { pushInsertSql } from './insert';\nimport { pushUpdateSql } from './update';\nimport { pushDeleteSql } from './delete';\nimport { pushTruncateSql } from './truncate';\nimport { pushColumnInfoSql } from './columnInfo';\nimport { pushOrderBySql } from './orderBy';\nimport { QueryData, SelectQueryData } from './data';\nimport { pushCopySql } from './copy';\nimport { isExpression, Sql } from 'orchid-core';\nimport { Db } from '../query/db';\n\nexport type ToSQLCtx = {\n queryBuilder: Db;\n sql: string[];\n values: unknown[];\n // selected value in JOIN LATERAL will have an alias to reference it from SELECT\n aliasValue?: true;\n};\n\nexport type toSQLCacheKey = typeof toSQLCacheKey;\nexport const toSQLCacheKey = Symbol('toSQLCache');\n\nexport type ToSQLOptions = {\n clearCache?: boolean;\n values?: unknown[];\n};\n\ntype ToSqlOptionsInternal = ToSQLOptions & {\n aliasValue?: true;\n};\n\nexport const toSQL = (table: Query, options?: ToSQLOptions): Sql => {\n return (\n (!options?.clearCache && table.q[toSQLCacheKey]) ||\n (table.q[toSQLCacheKey] = makeSQL(table, options))\n );\n};\n\nexport const makeSQL = (table: Query, options?: ToSqlOptionsInternal): Sql => {\n const query = table.q;\n const sql: string[] = [];\n const values = options?.values || [];\n const ctx: ToSQLCtx = {\n queryBuilder: table.queryBuilder,\n sql,\n values,\n aliasValue: options?.aliasValue,\n };\n\n if (query.with) {\n pushWithSql(ctx, query.with);\n }\n\n if (query.type) {\n if (query.type === 'truncate') {\n if (!table.table) throw new Error('Table is missing for truncate');\n\n pushTruncateSql(ctx, table.table, query);\n return { text: sql.join(' '), values };\n }\n\n if (query.type === 'columnInfo') {\n if (!table.table) throw new Error('Table is missing for truncate');\n\n pushColumnInfoSql(ctx, table, query);\n return { text: sql.join(' '), values };\n }\n\n if (!table.table) throw new Error(`Table is missing for ${query.type}`);\n\n const quotedAs = `\"${query.as || table.table}\"`;\n\n if (query.type === 'insert') {\n return {\n hookSelect: pushInsertSql(ctx, table, query, `\"${table.table}\"`),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'update') {\n return {\n hookSelect: pushUpdateSql(ctx, table, query, quotedAs),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'delete') {\n return {\n hookSelect: pushDeleteSql(ctx, table, query, quotedAs),\n text: sql.join(' '),\n values,\n };\n }\n\n if (query.type === 'copy') {\n pushCopySql(ctx, table, query, quotedAs);\n return { text: sql.join(' '), values };\n }\n }\n\n const quotedAs = (query.as || table.table) && `\"${query.as || table.table}\"`;\n\n sql.push('SELECT');\n\n if (query.distinct) {\n pushDistinctSql(ctx, table, query.distinct, quotedAs);\n }\n\n pushSelectSql(ctx, table, query, quotedAs);\n\n if (table.table || query.from) {\n pushFromAndAs(ctx, table, query, quotedAs);\n }\n\n if (query.join) {\n pushJoinSql(\n ctx,\n table,\n query as QueryData & { join: JoinItem[] },\n quotedAs,\n );\n }\n\n if (query.and || query.or) {\n pushWhereStatementSql(ctx, table, query, quotedAs);\n }\n\n if (query.group) {\n const group = query.group.map((item) =>\n isExpression(item)\n ? item.toSQL(ctx, quotedAs)\n : columnToSql(ctx, table.q, table.q.shape, item as string, quotedAs),\n );\n sql.push(`GROUP BY ${group.join(', ')}`);\n }\n\n if (query.having) pushHavingSql(ctx, query, quotedAs);\n\n if (query.window) {\n const window: string[] = [];\n query.window.forEach((item) => {\n for (const key in item) {\n window.push(\n `\"${key}\" AS ${windowToSql(ctx, query, item[key], quotedAs)}`,\n );\n }\n });\n sql.push(`WINDOW ${window.join(', ')}`);\n }\n\n if (query.union) {\n query.union.forEach((item) => {\n let itemSql: string;\n if (isExpression(item.arg)) {\n itemSql = item.arg.toSQL(ctx, quotedAs);\n } else {\n const argSql = makeSQL(item.arg, { values });\n itemSql = argSql.text;\n }\n sql.push(`${item.kind} ${item.wrap ? `(${itemSql})` : itemSql}`);\n });\n }\n\n if (query.order) {\n pushOrderBySql(ctx, query, quotedAs, query.order);\n }\n\n pushLimitSQL(sql, values, query);\n\n if (query.offset) {\n sql.push(`OFFSET ${addValue(values, query.offset)}`);\n }\n\n if (query.for) {\n sql.push('FOR', query.for.type);\n const { tableNames } = query.for;\n if (tableNames) {\n sql.push(\n 'OF',\n isExpression(tableNames)\n ? tableNames.toSQL(ctx, quotedAs)\n : tableNames.map((x) => `\"${x}\"`).join(', '),\n );\n }\n if (query.for.mode) sql.push(query.for.mode);\n }\n\n return { text: sql.join(' '), values };\n};\n\nexport function pushLimitSQL(\n sql: string[],\n values: unknown[],\n q: SelectQueryData,\n) {\n if (!q.returnsOne) {\n if (queryTypeWithLimitOne[q.returnType]) {\n sql.push(`LIMIT 1`);\n } else if (q.limit) {\n sql.push(`LIMIT ${addValue(values, q.limit)}`);\n }\n }\n}\n","import { Query, QueryReturnType } from '../query/query';\nimport { QueryLogger, QueryLogObject } from '../queryMethods';\nimport { Adapter, QueryResult } from '../adapter';\nimport { toSQLCacheKey } from './toSQL';\nimport {\n HavingItem,\n JoinItem,\n OnConflictItem,\n OnConflictMergeUpdate,\n OrderItem,\n QuerySourceItem,\n SelectItem,\n UnionItem,\n UnionKind,\n WhereItem,\n WindowItem,\n WithItem,\n} from './types';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n ColumnsShapeBase,\n ColumnTypeBase,\n MaybeArray,\n Sql,\n getValueKey,\n ColumnsParsers,\n Expression,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { BaseOperators } from '../columns/operators';\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = Record<string, ColumnsShapeBase>;\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport type JoinedParsers = Record<string, ColumnsParsers>;\n// Keep track of joined table names.\n// When joining the same table second time, this allows to add a numeric suffix to avoid name collisions.\nexport type JoinOverrides = Record<string, string>;\n\nexport type QueryBeforeHook = (query: Query) => void | Promise<void>;\nexport type QueryAfterHook<Data = unknown> = (\n data: Data,\n query: Query,\n) => void | Promise<void>;\nexport type QueryHookSelect = string[];\n\nexport type CommonQueryData = {\n adapter: Adapter;\n shape: ColumnsShapeBase;\n patchResult?(q: Query, queryResult: QueryResult): Promise<void>;\n handleResult(\n q: Query,\n returnType: QueryReturnType,\n result: QueryResult,\n isSubQuery?: true,\n ): unknown;\n returnType: QueryReturnType;\n wrapInTransaction?: boolean;\n throwOnNotFound?: boolean;\n with?: WithItem[];\n withShapes?: Record<string, ColumnsShapeBase>;\n joinTo?: QueryBase;\n joinedShapes?: JoinedShapes;\n joinedParsers?: JoinedParsers;\n joinedForSelect?: string;\n innerJoinLateral?: true;\n joinOverrides?: JoinOverrides;\n schema?: string;\n select?: SelectItem[];\n // expr when a single value is returned from the query, when using `get`, or functions.\n expr?: Expression;\n as?: string;\n from?: string | Query | Expression;\n sources?: Record<string, QuerySourceItem>;\n and?: WhereItem[];\n or?: WhereItem[][];\n coalesceValue?: unknown | Expression;\n parsers?: ColumnsParsers;\n notFoundDefault?: unknown;\n defaults?: Record<string, unknown>;\n // run functions before any query\n before?: QueryBeforeHook[];\n // run functions after any query\n after?: QueryAfterHook[];\n // run functions before create\n beforeCreate?: QueryBeforeHook[];\n // run functions after create in transaction\n afterCreate?: QueryAfterHook[];\n // run functions after create commit\n afterCreateCommit?: QueryAfterHook[];\n // additional select for afterCreate hooks\n afterCreateSelect?: QueryHookSelect;\n // run functions before update\n beforeUpdate?: QueryBeforeHook[];\n // run functions after update in transaction\n afterUpdate?: QueryAfterHook[];\n // run functions after update commit\n afterUpdateCommit?: QueryAfterHook[];\n // additional select for afterUpdate hooks\n afterUpdateSelect?: QueryHookSelect;\n // run functions before delete\n beforeDelete?: QueryBeforeHook[];\n // run functions after delete in transaction\n afterDelete?: QueryAfterHook[];\n // run functions after delete commit\n afterDeleteCommit?: QueryAfterHook[];\n // additional select for afterDelete hooks\n afterDeleteSelect?: QueryHookSelect;\n // log settings\n log?: QueryLogObject;\n // logger with `log`, `warn`, `error`\n logger: QueryLogger;\n // convert query into prepared statement automatically as an optimization\n autoPreparedStatements?: boolean;\n // cache `toSQL` output\n [toSQLCacheKey]?: Sql;\n // functions to transform query result after loading data\n transform?: ((input: unknown) => unknown)[];\n // default language for the full text search\n language?: string;\n // Is true for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `isSubQuery` is true,\n // the join will be applied after callback is resolved.\n isSubQuery?: true;\n /**\n * Stores current operator functions available for the query.\n * Is needed to remove these operators from query object when changing the query type, see {@link setQueryOperators}.\n */\n operators?: BaseOperators;\n /**\n * Used by {@link setQueryOperators} to store the original `baseQuery` before extending it with operators.\n */\n originalQuery?: Query;\n};\n\nexport type SelectQueryData = CommonQueryData & {\n type: undefined;\n distinct?: SelectableOrExpression[];\n fromOnly?: boolean;\n join?: JoinItem[];\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: { arg: UnionItem; kind: UnionKind; wrap?: boolean }[];\n order?: OrderItem[];\n returnsOne?: true;\n limit?: number;\n offset?: number;\n for?: {\n type: 'UPDATE' | 'NO KEY UPDATE' | 'SHARE' | 'KEY SHARE';\n tableNames?: string[] | Expression;\n mode?: 'NO WAIT' | 'SKIP LOCKED';\n };\n // column type for query with 'value' or 'valueOrThrow' return type\n [getValueKey]?: ColumnTypeBase;\n};\n\nexport type CreateKind = 'object' | 'raw' | 'from';\n\nexport type InsertQueryData = CommonQueryData & {\n type: 'insert';\n kind: CreateKind;\n columns: string[];\n values:\n | unknown[][]\n | MaybeArray<Expression>\n | {\n from: Query;\n values?: unknown[][];\n };\n using?: JoinItem[];\n join?: JoinItem[];\n onConflict?:\n | {\n type: 'ignore';\n expr?: OnConflictItem;\n }\n | {\n type: 'merge';\n expr?: OnConflictItem;\n update?: OnConflictMergeUpdate;\n };\n};\n\nexport type UpdateQueryDataObject = Record<\n string,\n Expression | { op: string; arg: unknown } | unknown\n>;\n\nexport type UpdatedAtDataInjector = (\n data: UpdateQueryDataItem[],\n) => UpdateQueryDataItem | void;\n\nexport type UpdateQueryDataItem =\n | UpdateQueryDataObject\n | Expression\n | UpdatedAtDataInjector;\n\nexport type UpdateQueryData = CommonQueryData & {\n type: 'update';\n updateData: UpdateQueryDataItem[];\n};\n\nexport type DeleteQueryData = CommonQueryData & {\n type: 'delete';\n join?: JoinItem[];\n};\n\nexport type TruncateQueryData = CommonQueryData & {\n type: 'truncate';\n restartIdentity?: boolean;\n cascade?: boolean;\n};\n\nexport type ColumnInfoQueryData = CommonQueryData & {\n type: 'columnInfo';\n column?: string;\n};\n\nexport type CopyQueryData = CommonQueryData & {\n type: 'copy';\n copy: CopyOptions;\n};\n\nexport type CopyOptions<Column = string> = {\n columns?: Column[];\n format?: 'text' | 'csv' | 'binary';\n freeze?: boolean;\n delimiter?: string;\n null?: string;\n header?: boolean | 'match';\n quote?: string;\n escape?: string;\n forceQuote?: Column[] | '*';\n forceNotNull?: Column[];\n forceNull?: Column[];\n encoding?: string;\n} & (\n | {\n from: string | { program: string };\n }\n | {\n to: string | { program: string };\n }\n);\n\nexport type QueryData =\n | SelectQueryData\n | InsertQueryData\n | UpdateQueryData\n | DeleteQueryData\n | TruncateQueryData\n | ColumnInfoQueryData\n | CopyQueryData;\n\nexport const cloneQueryArrays = (q: QueryData) => {\n if (q.with) q.with = q.with.slice(0);\n if (q.select) q.select = q.select.slice(0);\n if (q.and) q.and = q.and.slice(0);\n if (q.or) q.or = q.or.slice(0);\n if (q.before) q.before = q.before.slice(0);\n if (q.after) q.after = q.after.slice(0);\n if (q.joinedShapes) q.joinedShapes = { ...q.joinedShapes };\n\n // may have data for updating timestamps on any kind of query\n if ((q as UpdateQueryData).updateData) {\n (q as UpdateQueryData).updateData = (q as UpdateQueryData).updateData.slice(\n 0,\n );\n }\n\n if (q.type === undefined) {\n if (q.distinct) q.distinct = q.distinct.slice(0);\n if (q.join) q.join = q.join.slice(0);\n if (q.group) q.group = q.group.slice(0);\n if (q.having) q.having = q.having.slice(0);\n if (q.window) q.window = q.window.slice(0);\n if (q.union) q.union = q.union.slice(0);\n if (q.order) q.order = q.order.slice(0);\n } else if (q.type === 'insert') {\n q.columns = q.columns.slice(0);\n q.values = Array.isArray(q.values) ? q.values.slice(0) : q.values;\n if (q.using) q.using = q.using.slice(0);\n if (q.join) q.join = q.join.slice(0);\n if (q.beforeCreate) q.beforeCreate = q.beforeCreate.slice(0);\n if (q.afterCreate) {\n q.afterCreate = q.afterCreate.slice(0);\n if (q.afterCreateSelect) {\n q.afterCreateSelect = q.afterCreateSelect.slice(0);\n }\n }\n } else if (q.type === 'update') {\n if (q.beforeUpdate) q.beforeUpdate = q.beforeUpdate.slice(0);\n if (q.afterUpdate) {\n q.afterUpdate = q.afterUpdate.slice(0);\n if (q.afterUpdateSelect) {\n q.afterUpdateSelect = q.afterUpdateSelect.slice(0);\n }\n }\n } else if (q.type === 'delete') {\n if (q.beforeDelete) q.beforeDelete = q.beforeDelete.slice(0);\n if (q.afterDelete) {\n q.afterDelete = q.afterDelete.slice(0);\n if (q.afterDeleteSelect) {\n q.afterDeleteSelect = q.afterDeleteSelect.slice(0);\n }\n }\n }\n};\n","import { cloneQueryArrays, QueryData, toSQLCacheKey } from '../sql';\nimport type { Query } from '../query/query';\nimport type { ColumnTypeBase, StringKey } from 'orchid-core';\nimport { RelationQuery } from '../relations';\nimport { Expression } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nexport type AliasOrTable<T extends Pick<Query, 'table' | 'meta'>> =\n T['meta']['as'] extends string\n ? T['meta']['as']\n : T['table'] extends string\n ? T['table']\n : never;\n\nexport type SelectableOrExpression<\n T extends QueryBase = QueryBase,\n C extends ColumnTypeBase = ColumnTypeBase,\n> = '*' | StringKey<keyof T['selectable']> | Expression<C>;\n\nexport type ExpressionOutput<\n T extends Query,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['selectable']\n ? T['selectable'][Expr]['column']\n : Expr extends Expression<infer ColumnTypeBase>\n ? ColumnTypeBase\n : never;\n\nexport const getClonedQueryData = (query: QueryData): QueryData => {\n const cloned = { ...query };\n delete cloned[toSQLCacheKey];\n if (cloned.parsers) cloned.parsers = { ...cloned.parsers };\n cloneQueryArrays(cloned);\n return cloned as QueryData;\n};\n\nexport const getQueryAs = (q: { table?: string; q: { as?: string } }) => {\n return q.q.as || (q.table as string);\n};\n\nexport const makeRegexToFindInSql = (value: string) => {\n return new RegExp(`${value}(?=(?:[^']*'[^']*')*[^']*$)`, 'g');\n};\n\n/**\n * In `select`, `update`, `create` it's possible to pass a callback with a sub-query.\n * This function resolves such sub-query.\n *\n * @param q - main query object to pass to a callback as argument\n * @param cb - sub-query callback\n */\nexport const resolveSubQueryCallback = (\n q: Query,\n cb: (q: Query) => Query,\n): Query => {\n const { isSubQuery } = q.q;\n q.q.isSubQuery = true;\n const result = cb(q);\n q.q.isSubQuery = isSubQuery;\n return result;\n};\n\n/**\n * After getting a query from a sub-query callback,\n * join it to the main query in case it's a relation query.\n *\n * If it's not a relation query, it will be returned as is.\n *\n * @param q - main query object\n * @param sub - sub-query query object\n */\nexport const joinSubQuery = (q: Query, sub: Query): Query => {\n if (!('relationConfig' in sub)) return sub;\n\n return (sub as unknown as RelationQuery).relationConfig.joinQuery(q, sub);\n};\n","import { QueryData } from '../sql';\nimport { emptyObject, pushOrNewArrayToObject } from 'orchid-core';\nimport { OrchidOrmInternalError } from '../errors';\nimport { Query } from './query';\nimport { QueryBase } from './queryBase';\nimport { getClonedQueryData } from '../common/utils';\n\n/**\n * Push all elements of given array into the array in the query data,\n * set given array if there is no array yet in the query data.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - array with values\n */\nexport const pushQueryArray = <T extends { q: QueryData }>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n if (!q.q[key as keyof typeof q.q])\n (q.q as Record<string, unknown>)[key] = value;\n else\n (q.q[key as keyof typeof q.q] as unknown[]).push(...(value as unknown[]));\n return q as T;\n};\n\n/**\n * Push new element into array in the query data, create the array if it doesn't yet exist.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - new element to push\n */\nexport const pushQueryValue = <T extends { q: QueryData }>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObject(\n q.q as unknown as Record<string, unknown[]>,\n key,\n value,\n );\n return q;\n};\n\n/**\n * Set value into the object in query data, create the object if it doesn't yet exist.\n *\n * @param q - query\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setQueryObjectValue = <T extends { q: QueryData }>(\n q: T,\n object: string,\n key: string,\n value: unknown,\n): T => {\n if (!q.q[object as keyof typeof q.q])\n (q.q as unknown as Record<string, Record<string, unknown>>)[object] = {\n [key]: value,\n };\n else\n (q.q as unknown as Record<string, Record<string, unknown>>)[object][key] =\n value;\n return q as unknown as T;\n};\n\n/**\n * Throw runtime error when delete or update has no where conditions\n *\n * @param q - query\n * @param method - 'update' or 'delete'\n */\nexport const throwIfNoWhere = (q: Query, method: string): void => {\n if (!q.q.or && !q.q.and) {\n throw new OrchidOrmInternalError(\n q,\n `Dangerous ${method} without conditions`,\n );\n }\n};\n\n// Pick an alias for a search query to reference it later in WHERE, in ORDER BY, in headline.\n// If the alias is taken, it tries \"@q\", \"@q1\", \"@q2\" and so on.\nexport const saveSearchAlias = (\n q: QueryBase,\n as: string,\n key: 'joinedShapes' | 'withShapes',\n): string => {\n const shapes = q.q[key];\n if (shapes?.[as]) {\n let suffix = 2;\n while (shapes[(as = `${as}${suffix}`)]) {\n suffix++;\n }\n }\n\n setQueryObjectValue(q, key, as, emptyObject);\n\n return as;\n};\n\n/**\n * Extend query prototype with new methods.\n * The query and its data are cloned (with Object.create).\n *\n * @param q - query object to extend from\n * @param methods - methods to add\n */\nexport const extendQuery = <\n T extends Query,\n Methods extends Record<string, unknown>,\n>(\n q: T,\n methods: Methods,\n): T & Methods => {\n const base = Object.create(q.baseQuery);\n base.baseQuery = base;\n\n Object.assign(base, methods);\n\n const cloned = Object.create(base);\n cloned.q = getClonedQueryData(q.q);\n\n return cloned as T & Methods;\n};\n","import { Query, SetQueryReturnsColumn } from '../query/query';\nimport { ToSQLCtx } from '../sql';\nimport { addValue } from '../sql/common';\nimport {\n ColumnTypeBase,\n Expression,\n getValueKey,\n isExpression,\n OperatorToSQL,\n} from 'orchid-core';\nimport { BooleanColumn } from './boolean';\nimport { extendQuery } from '../query/queryUtils';\n\n// Operator function type.\n// Table.count().gt(10) <- here `.gt(10)` is this operator function.\n// It discards previously defined column type operators and applies new ones,\n// for a case when operator gives a different column type.\nexport type Operator<Value, Column extends ColumnTypeBase = ColumnTypeBase> = {\n <T extends Query>(this: T, arg: Value): Omit<\n SetQueryReturnsColumn<T, Column>,\n keyof T['result']['value']['operators']\n > &\n Column['operators'];\n // argument type of the function\n _opType: Value;\n // function to turn the operator expression into SQL\n _op: OperatorToSQL<Value, ToSQLCtx>;\n};\n\n// any column has 'operators' record that implements this type\nexport type BaseOperators = Record<string, Operator<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Extend query object with given operator methods, so that user can call `gt` after calling `count`.\n// If query already has the same operators, nothing is changed.\n// Previously defined operators, if any, are dropped form the query.\n// Adds new operators, saves `Query.baseQuery` into `QueryData.originalQuery`, saves operators to `QueryData.operators`.\nexport function setQueryOperators(q: Query, operators: BaseOperators) {\n if (q.q.operators) {\n if (q.q.operators === operators) return q;\n\n q.baseQuery = q.q.originalQuery as Query;\n } else {\n q.q.originalQuery = q.baseQuery;\n }\n\n q.q.operators = operators;\n return extendQuery(q, operators);\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst make = <Value = any>(\n _op: (key: string, value: Value, ctx: ToSQLCtx, quotedAs?: string) => string,\n): Operator<Value> => {\n return Object.assign(\n function (this: Query, value: Value) {\n const expr = this.q.expr as Expression;\n (expr._chain ??= []).push(_op, value);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (this.q.parsers?.[getValueKey]) {\n this.q.parsers[getValueKey] = undefined;\n }\n\n return setQueryOperators(this, boolean);\n },\n {\n _op,\n },\n ) as unknown as Operator<Value>;\n};\n\n// Handles array, expression object, query object to insert into sql.\n// Saves values to `ctx.values`.\nconst quoteValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n jsonArray?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (!jsonArray && Array.isArray(arg)) {\n return `(${arg.map((value) => addValue(ctx.values, value)).join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `(${(arg as Query).toSQL({ values: ctx.values }).text})`;\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\n// common operators that exist for any types\ntype Base<Value> = {\n equals: Operator<Value | Query | Expression, BooleanColumn>;\n not: Operator<Value | Query | Expression, BooleanColumn>;\n in: Operator<Value[] | Query | Expression, BooleanColumn>;\n notIn: Operator<Value[] | Query | Expression, BooleanColumn>;\n};\n\nconst base = {\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NULL`\n : `${key} = ${quoteValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NOT NULL`\n : `${key} <> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n in: make(\n (key, value, ctx, quotedAs) =>\n `${key} IN ${quoteValue(value, ctx, quotedAs)}`,\n ),\n notIn: make(\n (key, value, ctx, quotedAs) =>\n `NOT ${key} IN ${quoteValue(value, ctx, quotedAs)}`,\n ),\n} as Base<unknown>;\n\n// Boolean type operators\ntype Bool = Base<boolean> & {\n and: Operator<\n SetQueryReturnsColumn<Query, BooleanColumn> & BooleanColumn['operators'],\n BooleanColumn\n >;\n or: Operator<\n SetQueryReturnsColumn<Query, BooleanColumn> & BooleanColumn['operators'],\n BooleanColumn\n >;\n};\n\nconst boolean = {\n ...base,\n and: make(\n (key, value, ctx, quotedAs) =>\n `${key} AND ${value.q.expr.toSQL(ctx, quotedAs)}`,\n ),\n or: make(\n (key, value, ctx, quotedAs) =>\n `(${key}) OR (${value.q.expr.toSQL(ctx, quotedAs)})`,\n ),\n} as unknown as Bool;\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\ntype Ord<Value> = Base<Value> & {\n lt: Operator<Value | Query | Expression, BooleanColumn>;\n lte: Operator<Value | Query | Expression, BooleanColumn>;\n gt: Operator<Value | Query | Expression, BooleanColumn>;\n gte: Operator<Value | Query | Expression, BooleanColumn>;\n between: Operator<\n [Value | Query | Expression, Value | Query | Expression],\n BooleanColumn\n >;\n};\n\ntype Numeric = Ord<number>;\n\nconst numeric = {\n ...base,\n lt: make(\n (key, value, ctx, quotedAs) =>\n `${key} < ${quoteValue(value, ctx, quotedAs)}`,\n ),\n lte: make(\n (key, value, ctx, quotedAs) =>\n `${key} <= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gt: make(\n (key, value, ctx, quotedAs) =>\n `${key} > ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gte: make(\n (key, value, ctx, quotedAs) =>\n `${key} >= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n between: make<[unknown, unknown]>(\n (key, [from, to], ctx, quotedAs) =>\n `${key} BETWEEN ${quoteValue(from, ctx, quotedAs)} AND ${quoteValue(\n to,\n ctx,\n quotedAs,\n )}`,\n ),\n} as Numeric;\n\n// Text type operators\ntype Text = Base<string> & {\n contains: Operator<string | Query | Expression, BooleanColumn>;\n containsSensitive: Operator<string | Query | Expression, BooleanColumn>;\n startsWith: Operator<string | Query | Expression, BooleanColumn>;\n startsWithSensitive: Operator<string | Query | Expression, BooleanColumn>;\n endsWith: Operator<string | Query | Expression, BooleanColumn>;\n endsWithSensitive: Operator<string | Query | Expression, BooleanColumn>;\n};\n\nconst text = {\n ...base,\n contains: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n containsSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE ${quoteValue(value, ctx, quotedAs)} || '%'`,\n ),\n endsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteValue(value, ctx, quotedAs)}`,\n ),\n endsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteValue(value, ctx, quotedAs)}`,\n ),\n} as Text;\n\n// JSON type operators\ntype Json = Base<unknown> & {\n jsonPath: Operator<\n [path: string, op: string, value: unknown | Query | Expression],\n BooleanColumn\n >;\n jsonSupersetOf: Operator<unknown | Query | Expression, BooleanColumn>;\n jsonSubsetOf: Operator<unknown | Query | Expression, BooleanColumn>;\n};\n\nconst json = {\n ...base,\n jsonPath: make<[string, string, unknown]>(\n (key, [path, op, value], ctx, quotedAs) =>\n `jsonb_path_query_first(${key}, '${path}') #>> '{}' ${op} ${quoteValue(\n value,\n ctx,\n quotedAs,\n true,\n )}`,\n ),\n jsonSupersetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n jsonSubsetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n} as Json;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators = {\n any: base,\n boolean,\n number: numeric,\n date: numeric,\n time: numeric,\n text,\n json,\n array: base,\n} as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any: Base<any>;\n boolean: Bool;\n number: Numeric;\n date: Ord<Date | string>;\n time: Ord<string>;\n text: Text;\n json: Json;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n array: Base<any>;\n};\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n numberTypeMethods,\n Code,\n Expression,\n joinTruthy,\n BaseNumberData,\n numberDataToCode,\n setColumnData,\n addCode,\n ColumnWithDefault,\n ColumnTypeBase,\n NumberTypeMethods,\n assignMethodsToClass,\n} from 'orchid-core';\nimport { columnCode, identityToCode } from './code';\nimport type { TableData } from './columnTypes';\nimport { Operators } from './operators';\n\nexport type NumberColumn = ColumnType<number, typeof Operators.number>;\n\nexport type NumberColumnData = BaseNumberData & {\n identity: TableData.Identity;\n};\n\nexport type SerialColumnData = NumberColumnData & {\n default: Expression;\n};\n\nexport interface NumberBaseColumn\n extends ColumnType<number, typeof Operators.number>,\n NumberTypeMethods {}\n\nexport abstract class NumberBaseColumn extends ColumnType<\n number,\n typeof Operators.number\n> {\n declare data: NumberColumnData;\n operators = Operators.number;\n}\n\nassignMethodsToClass(NumberBaseColumn, numberTypeMethods);\n\nexport abstract class IntegerBaseColumn extends NumberBaseColumn {\n declare data: NumberColumnData;\n constructor() {\n super();\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn extends ColumnType<\n string,\n typeof Operators.number\n> {\n operators = Operators.number;\n declare data: ColumnData;\n}\n\nexport class DecimalBaseColumn<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n> extends ColumnType<string, typeof Operators.number> {\n declare data: ColumnData & {\n numericPrecision: Precision;\n numericScale: Scale;\n };\n operators = Operators.number;\n dataType = 'decimal' as const;\n\n constructor(numericPrecision?: Precision, numericScale?: Scale) {\n super();\n this.data.numericPrecision = numericPrecision as Precision;\n this.data.numericScale = numericScale as Scale;\n }\n\n toCode(t: string): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n t,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n );\n }\n\n toSQL() {\n const { numericPrecision, numericScale } = this.data;\n\n return joinTruthy(\n this.dataType,\n numericPrecision\n ? numericScale\n ? `(${numericPrecision}, ${numericScale})`\n : `(${numericPrecision})`\n : undefined,\n );\n }\n}\n\nconst skipNumberMethods = { int: true } as const;\n\nconst intToCode = (column: ColumnType, t: string): Code => {\n let code: Code[];\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, column.dataType);\n } else {\n code = [`${column.dataType}()`];\n }\n\n addCode(code, numberDataToCode(column.data, skipNumberMethods));\n\n return columnCode(column, t, code);\n};\n\nexport type IdentityColumn<T extends ColumnTypeBase> = ColumnWithDefault<\n T,\n Expression\n>;\n\n// signed two-byte integer\nexport class SmallIntColumn extends IntegerBaseColumn {\n dataType = 'smallint' as const;\n parseItem = parseInt;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed four-byte integer\nexport class IntegerColumn extends IntegerBaseColumn {\n dataType = 'integer' as const;\n parseItem = parseInt;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed eight-byte integer\nexport class BigIntColumn extends NumberAsStringBaseColumn {\n dataType = 'bigint' as const;\n toCode(t: string): Code {\n return intToCode(this, t);\n }\n\n identity<T extends ColumnType>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n> extends DecimalBaseColumn<Precision, Scale> {}\n\n// single precision floating-point number (4 bytes)\nexport class RealColumn extends NumberBaseColumn {\n dataType = 'real' as const;\n parseItem = parseFloat;\n toCode(t: string): Code {\n return columnCode(this, t, `real()${numberDataToCode(this.data)}`);\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn extends NumberAsStringBaseColumn {\n dataType = 'double precision' as const;\n toCode(t: string): Code {\n return columnCode(this, t, `doublePrecision()`);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn extends IntegerBaseColumn {\n dataType = 'smallint' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor() {\n super();\n this.data.int = true;\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `smallSerial()${numberDataToCode(this.data, skipNumberMethods)}`,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn extends IntegerBaseColumn {\n dataType = 'integer' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor() {\n super();\n this.data.int = true;\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `serial()${numberDataToCode(this.data, skipNumberMethods)}`,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn extends NumberAsStringBaseColumn {\n dataType = 'bigint' as const;\n declare data: SerialColumnData;\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `bigSerial()`);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport { NumberBaseColumn } from './number';\nimport {\n stringTypeMethods,\n Code,\n joinTruthy,\n StringTypeData,\n stringDataToCode,\n PrimaryKeyColumn,\n TemplateLiteralArgs,\n getDefaultLanguage,\n RawSQLBase,\n assignMethodsToClass,\n ColumnTypeBase,\n StaticSQLArgs,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { RawSQL } from '../sql/rawSql';\nimport { SearchWeight } from '../sql';\nimport { Operators } from './operators';\n\nexport type StringColumn = ColumnType<string, typeof Operators.text>;\n\nexport type TextColumnData = StringTypeData;\n\ntype TextMethods = typeof stringTypeMethods;\n\nexport interface TextBaseColumn\n extends ColumnType<string, typeof Operators.text>,\n TextMethods {}\n\nexport abstract class TextBaseColumn extends ColumnType<\n string,\n typeof Operators.text\n> {\n declare data: TextColumnData;\n operators = Operators.text;\n}\n\nassignMethodsToClass(TextBaseColumn, stringTypeMethods);\n\nexport abstract class LimitedTextBaseColumn<\n Limit extends number | undefined = undefined,\n> extends TextBaseColumn {\n declare data: TextColumnData & { maxChars: Limit };\n\n constructor(limit?: Limit) {\n super();\n this.data.maxChars = limit as Limit;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.maxChars !== undefined && `(${this.data.maxChars})`,\n );\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Limit extends number | undefined = undefined,\n> extends LimitedTextBaseColumn<Limit> {\n dataType = 'varchar' as const;\n toCode(t: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data)}`,\n );\n }\n}\n\n// character(n), char(n) fixed-length, blank padded\nexport class CharColumn<\n Limit extends number | undefined = undefined,\n> extends LimitedTextBaseColumn<Limit> {\n dataType = 'char' as const;\n toCode(t: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `char(${maxChars ?? ''})${stringDataToCode(this.data)}`,\n );\n }\n}\n\nconst setTextColumnData = (\n column: { data: TextColumnData & { minArg?: number; maxArg?: number } },\n minArg?: number,\n maxArg?: number,\n) => {\n if (minArg !== undefined) {\n column.data.min = column.data.minArg = minArg;\n if (maxArg !== undefined) {\n column.data.max = column.data.maxArg = maxArg;\n }\n }\n};\n\nconst textColumnToCode = (\n column: TextBaseColumn & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n t: string,\n) => {\n const data = { ...column.data };\n let args = '';\n if (data.minArg !== undefined && data.min === data.minArg) {\n args += data.minArg;\n delete data.min;\n if (data.maxArg !== undefined && data.max === data.maxArg) {\n args += `, ${data.maxArg}`;\n delete data.max;\n }\n }\n return columnCode(\n column,\n t,\n `${column.dataType}(${args})${stringDataToCode(data)}`,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn extends TextBaseColumn {\n static instance = new TextColumn();\n\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(minArg?: number, maxArg?: number) {\n super();\n setTextColumnData(this, minArg, maxArg);\n }\n\n toCode(t: string): Code {\n return textColumnToCode(this, t);\n }\n}\n\n// To store binary strings\nexport class ByteaColumn extends ColumnType<Buffer, typeof Operators.text> {\n dataType = 'bytea' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `bytea()`);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'point' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `point()`);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'line' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `line()`);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'lseg' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `lseg()`);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'box' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `box()`);\n }\n}\n\n// path\t16+16n bytes\tClosed path (similar to polygon)\t((x1,y1),...)\n// path\t16+16n bytes\tOpen path\t[(x1,y1),...]\nexport class PathColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'path' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `path()`);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'polygon' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `polygon()`);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'circle' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `circle()`);\n }\n}\n\nexport class MoneyColumn extends NumberBaseColumn {\n dataType = 'money' as const;\n\n toCode(t: string): Code {\n return columnCode(this, t, `money()`);\n }\n\n parseFn = Object.assign(\n function (input: unknown) {\n return parseFloat((input as string).replace(/,/g, '').replace(/\\$/g, ''));\n },\n {\n hideFromCode: true,\n },\n );\n}\n\n// cidr\t7 or 19 bytes\tIPv4 and IPv6 networks\nexport class CidrColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'cidr' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `cidr()`);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'inet' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `inet()`);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'macaddr' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `macaddr()`);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column extends ColumnType<string, typeof Operators.text> {\n dataType = 'macaddr8' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `macaddr8()`);\n }\n}\n\n// Bit strings are strings of 1's and 0's.\n// They can be used to store or visualize bit masks.\n// There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.\nexport class BitColumn<Length extends number> extends ColumnType<\n string,\n typeof Operators.text\n> {\n dataType = 'bit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: Length };\n\n constructor(length: Length) {\n super();\n this.data.length = length;\n }\n\n toCode(t: string): Code {\n const { length } = this.data;\n return columnCode(this, t, `bit(${length})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Length extends number | undefined = undefined,\n> extends ColumnType<string, typeof Operators.text> {\n dataType = 'bit varying' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: Length };\n\n constructor(length?: Length) {\n super();\n this.data.length = length as Length;\n }\n\n toCode(t: string): Code {\n const { length } = this.data;\n return columnCode(this, t, `bitVarying(${length ?? ''})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | Record<string, SearchWeight>;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'tsvector' as const;\n operators = Operators.text;\n\n constructor(public defaultLanguage = getDefaultLanguage()) {\n super();\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `tsvector()`);\n }\n\n /**\n * For `tsvector` column type, it can also accept language (optional) and columns:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('post', (t) => ({\n * id: t.id(),\n * title: t.text(),\n * body: t.text(),\n * // join title and body into a single ts_vector\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * // with language:\n * spanishTsVector: t\n * .tsvector()\n * .generated('spanish', ['title', 'body'])\n * .searchIndex(),\n * }));\n * });\n * ```\n *\n * @param args\n */\n generated<T extends ColumnType>(\n this: T,\n ...args:\n | StaticSQLArgs\n | [language: string, columns: TsVectorGeneratedColumns]\n | [columns: TsVectorGeneratedColumns]\n ): T {\n const first = args[0];\n if (typeof first === 'string' || !('raw' in first)) {\n const target = typeof first === 'string' ? (args[1] as string[]) : first;\n\n let sql;\n if (Array.isArray(target)) {\n const columns =\n target.length === 1\n ? `\"${target[0]}\"`\n : target\n .map((column) => `coalesce(\"${column}\", '')`)\n .join(` || ' ' || `);\n\n sql = `to_tsvector('${\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn).defaultLanguage\n }', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '') +\n `setweight(to_tsvector(coalesce(\"${key}\", '')), '${target[key]}')`;\n }\n }\n\n const arr = [sql] as string[] & { raw: string[] };\n arr.raw = arr;\n args = [arr] as unknown as TemplateLiteralArgs;\n }\n\n return super.generated(...(args as TemplateLiteralArgs)) as unknown as T;\n }\n}\n\n// A tsquery value stores lexemes that are to be searched for\nexport class TsQueryColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'tsquery' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `tsquery()`);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSQL(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'uuid' as const;\n operators = Operators.text;\n\n primaryKey<T extends ColumnTypeBase>(\n this: T,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n PrimaryKeyColumn<T> & { data: { default: RawSQLBase } } {\n const column = super.primaryKey();\n if (!column.data.default) column.data.default = uuidDefault;\n return column as unknown as PrimaryKeyColumn<T> & {\n data: { default: RawSQLBase };\n };\n }\n\n toCode(t: string): Code {\n const { data } = this;\n return columnCode(\n this,\n t,\n `uuid()`,\n // don't output the default default\n data.default instanceof RawSQLBase && data.default._sql === uuidDefaultSQL\n ? { ...data, default: undefined }\n : data,\n );\n }\n}\n\n// xml data type can be used to store XML data\nexport class XMLColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'xml' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `xml()`);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn extends TextBaseColumn {\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(minArg?: number, maxArg?: number) {\n super();\n setTextColumnData(this, minArg, maxArg);\n }\n\n toCode(t: string): Code {\n return textColumnToCode(this, t);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n assignMethodsToClass,\n Code,\n DateColumnData,\n dateDataToCode,\n DateTypeMethods,\n dateTypeMethods,\n EncodeColumn,\n joinTruthy,\n ParseColumn,\n} from 'orchid-core';\nimport { IntegerColumn } from './number';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\n// common interface for Date and DateTime columns\nexport interface DateBaseColumn\n extends ColumnType<\n string,\n typeof Operators.date,\n string | number | Date,\n string,\n string | number | Date\n >,\n DateTypeMethods {}\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (input: string | number | Date) => {\n return typeof input === 'number' ? new Date(input) : input;\n};\n\n// when generating code, don't output `encodeFn` because it is a default\nconst skipDateMethodsFromToCode = { encodeFn: dateTimeEncode };\n\n// parse a date string to number, with respect to null\nconst parseToNumber = (value: unknown) =>\n value ? Date.parse(value as string) : value;\n\n// parse a date string to date object, with respect to null\nconst parseToDate = (value: unknown) =>\n value ? new Date(value as string) : value;\n\n// common class for Date and DateTime columns\nexport abstract class DateBaseColumn extends ColumnType<\n string,\n typeof Operators.date,\n string | number | Date,\n string,\n string | number | Date\n> {\n declare data: DateColumnData;\n operators = Operators.date;\n encodeFn = dateTimeEncode;\n\n asNumber() {\n return this.parse(parseToNumber).as(\n new IntegerColumn() as never,\n ) as unknown as EncodeColumn<IntegerColumn, string | number | Date>;\n }\n\n asDate<T extends ColumnType>(this: T): ParseColumn<T, Date> {\n return this.parse(parseToDate) as ParseColumn<T, Date>;\n }\n}\n\nassignMethodsToClass(DateBaseColumn, dateTypeMethods);\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn extends DateBaseColumn {\n dataType = 'date' as const;\n toCode(t: string): Code {\n return columnCode(\n this,\n t,\n `date()${dateDataToCode(this.data)}`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Precision extends number | undefined = undefined,\n> extends DateBaseColumn {\n declare data: DateColumnData & { dateTimePrecision: Precision };\n\n constructor(dateTimePrecision?: Precision) {\n super();\n this.data.dateTimePrecision = dateTimePrecision as Precision;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n );\n }\n}\n\nexport abstract class DateTimeTzBaseClass<\n Precision extends number | undefined = undefined,\n> extends DateTimeBaseClass<Precision> {\n abstract baseDataType: string;\n\n toSQL() {\n return joinTruthy(\n this.baseDataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n ' with time zone',\n );\n }\n}\n\nconst timestampToCode = <P extends number | undefined>(\n self: TimestampColumn<P> | TimestampTZColumn<P>,\n t: string,\n) => {\n const { dateTimePrecision: p } = self.data;\n return columnCode(\n self,\n t,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data)}`,\n self.data,\n skipDateMethodsFromToCode,\n );\n};\n\n// timestamp [ (p) ] [ without time zone ]\t8 bytes\tboth date and time (no time zone)\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampColumn<\n Precision extends number | undefined,\n> extends DateTimeBaseClass<Precision> {\n dataType = 'timestamp' as const;\n toCode(t: string): Code {\n return timestampToCode(this, t);\n }\n}\n\n// timestamp [ (p) ] with time zone\t8 bytes\tboth date and time, with time zone\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampTZColumn<\n Precision extends number | undefined,\n> extends DateTimeTzBaseClass<Precision> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(t: string): Code {\n return timestampToCode(this, t);\n }\n}\n\nexport interface TimeColumn\n extends ColumnType<string, typeof Operators.time>,\n DateTypeMethods {}\n\n// time [ (p) ] [ without time zone ]\t8 bytes\ttime of day (no date)\t00:00:00\t24:00:00\t1 microsecond\nexport class TimeColumn<\n Precision extends number | undefined = undefined,\n> extends ColumnType<string, typeof Operators.time> {\n declare data: DateColumnData & { dateTimePrecision: Precision };\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(dateTimePrecision?: Precision) {\n super();\n this.data.dateTimePrecision = dateTimePrecision as Precision;\n }\n\n toCode(t: string): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n t,\n `time(${dateTimePrecision || ''})${dateDataToCode(this.data)}`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nassignMethodsToClass(TimeColumn, dateTypeMethods);\n\nexport type TimeInterval = {\n years?: number;\n months?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n};\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<\n Fields extends string | undefined = undefined,\n Precision extends number | undefined = undefined,\n> extends ColumnType<TimeInterval, typeof Operators.date> {\n declare data: ColumnData & { fields: Fields; precision: Precision };\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(fields?: Fields, precision?: Precision) {\n super();\n this.data.fields = fields as Fields;\n this.data.precision = precision as Precision;\n }\n\n toCode(t: string): Code {\n const { fields, precision } = this.data;\n return columnCode(\n this,\n t,\n `interval(${[fields && `'${fields}'`, precision && String(precision)]\n .filter((part) => part)\n .join(', ')})`,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.fields && ` ${this.data.fields}`,\n this.data.precision !== undefined && ` (${this.data.precision})`,\n );\n }\n}\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code, NullableColumn } from 'orchid-core';\nimport { Operators } from './operators';\n\n// 1 byte, true or false\nexport class BooleanColumn extends ColumnType<\n boolean,\n typeof Operators.boolean\n> {\n static instance = new BooleanColumn();\n\n dataType = 'boolean' as const;\n operators = Operators.boolean;\n\n toCode(t: string): Code {\n return columnCode(this, t, 'boolean()');\n }\n\n parseItem = (input: string) => input[0] === 't';\n}\n\nexport type BooleanNullable = NullableColumn<BooleanColumn>;\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code } from 'orchid-core';\nimport { Operators } from './operators';\n\nexport class EnumColumn<\n U extends string = string,\n T extends [U, ...U[]] = [U],\n> extends ColumnType<T[number], typeof Operators.any> {\n operators = Operators.any;\n dataType = 'enum';\n\n constructor(public enumName: string, public options: T) {\n super();\n }\n\n toCode(t: string, migration?: boolean): Code {\n const options = migration\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, t, `enum('${this.enumName}'${options})`);\n }\n\n toSQL() {\n const name = this.enumName;\n const index = name.indexOf('.');\n return `\"${\n index === -1 ? name : `${name.slice(0, index)}\".\"${name.slice(index + 1)}`\n }\"`;\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\nimport {\n addCode,\n Code,\n JSONType,\n JSONTypes,\n jsonTypes,\n JSONUnknown,\n toArray,\n} from 'orchid-core';\n\n// skip adding the default `encode` function to code\nconst toCodeSkip = { encodeFn: JSON.stringify };\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<Type extends JSONType = JSONUnknown> extends ColumnType<\n Type['type'],\n typeof Operators.json\n> {\n dataType = 'jsonb' as const;\n operators = Operators.json;\n declare data: ColumnData & { schema: Type };\n\n constructor(\n schemaOrFn:\n | Type\n | ((j: JSONTypes) => Type) = new JSONUnknown() as unknown as Type,\n ) {\n super();\n\n this.data.schema =\n typeof schemaOrFn === 'function' ? schemaOrFn(jsonTypes) : schemaOrFn;\n }\n\n toCode(t: string): Code {\n const { schema } = this.data;\n\n let schemaCode;\n if (!(schema instanceof JSONUnknown)) {\n schemaCode = toArray(schema.toCode(t));\n addCode(schemaCode, ',');\n }\n\n return columnCode(\n this,\n t,\n schemaCode ? [`json((${t}) =>`, schemaCode, ')'] : [`json()`],\n this.data,\n toCodeSkip,\n );\n }\n}\n\n// Encode data of both types with JSON.stringify\nJSONColumn.prototype.encodeFn = JSON.stringify;\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn extends ColumnType<string, typeof Operators.text> {\n dataType = 'json' as const;\n operators = Operators.text;\n toCode(t: string): Code {\n return columnCode(this, t, `jsonText()`, this.data, toCodeSkip);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n arrayTypeMethods,\n addCode,\n Code,\n ColumnTypeBase,\n ArrayMethodsData,\n arrayDataToCode,\n assignMethodsToClass,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\nexport type ArrayData<Item extends ColumnTypeBase> = ColumnData &\n ArrayMethodsData & {\n item: Item;\n };\n\ntype ArrayMethods = typeof arrayTypeMethods;\n\nexport interface ArrayColumn<Item extends ColumnTypeBase>\n extends ColumnType<\n Item['type'][],\n typeof Operators.array,\n Item['inputType'][],\n Item['outputType'][],\n Item['queryType'][]\n >,\n ArrayMethods {}\n\nexport class ArrayColumn<Item extends ColumnTypeBase> extends ColumnType<\n Item['type'][],\n typeof Operators.array,\n Item['inputType'][],\n Item['outputType'][],\n Item['queryType'][]\n> {\n dataType = 'array' as const;\n operators = Operators.array;\n declare data: ArrayData<Item>;\n\n constructor(item: Item) {\n super();\n this.data.item = item;\n }\n\n toSQL() {\n return `${this.data.item.toSQL()}[]`;\n }\n\n toCode(this: ArrayColumn<Item>, t: string): Code {\n const code: Code[] = ['array('];\n addCode(code, this.data.item.toCode(t));\n addCode(code, `)${arrayDataToCode(this.data)}`);\n return columnCode(this, t, code);\n }\n\n parseFn = Object.assign(\n (input: unknown) => {\n const entries: unknown[] = [];\n parseArray(\n input as string,\n 0,\n (input as string).length,\n entries,\n false,\n this.data.item,\n );\n return entries;\n },\n {\n hideFromCode: true,\n },\n );\n}\n\nconst parseArray = (\n input: string,\n pos: number,\n len: number,\n entries: unknown[],\n nested: boolean,\n item: ColumnTypeBase,\n): number => {\n if (input[0] === '[') {\n while (pos < len) {\n let char = input[pos++];\n if (char === '\\\\') {\n char = input[pos++];\n }\n if (char === '=') break;\n }\n }\n\n let quote = false;\n let start = pos;\n while (pos < len) {\n let char = input[pos++];\n const escaped = char === '\\\\';\n if (escaped) {\n char = input[pos++];\n }\n\n if (char === '\"' && !escaped) {\n if (quote) {\n pushEntry(input, start, pos, entries, item);\n } else {\n start = pos;\n }\n quote = !quote;\n } else if (char === ',' && !quote) {\n if (start !== pos) {\n pushEntry(input, start, pos, entries, item);\n }\n start = pos;\n } else if (char === '{' && !quote) {\n let array: unknown[];\n let nestedItem = item;\n if (nested) {\n array = [];\n entries.push(array);\n if ('item' in item.data) {\n nestedItem = (item as ArrayColumn<ColumnType>).data\n .item as ColumnType;\n }\n } else {\n array = entries;\n }\n pos = parseArray(input, pos, len, array, true, nestedItem);\n start = pos + 1;\n } else if (char === '}' && !quote) {\n if (start !== pos) {\n pushEntry(input, start, pos, entries, item);\n }\n start = pos + 1;\n break;\n }\n }\n\n return pos;\n};\n\nassignMethodsToClass(ArrayColumn, arrayTypeMethods);\n\nconst pushEntry = (\n input: string,\n start: number,\n pos: number,\n entries: unknown[],\n item: ColumnTypeBase,\n) => {\n let entry: unknown = input.slice(start, pos - 1);\n if (entry === 'NULL') {\n entry = null;\n } else if (item.parseItem) {\n entry = item.parseItem(entry as string);\n }\n entries.push(entry);\n};\n","import { ColumnType } from './columnType';\nimport { Code, singleQuote } from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators } from './operators';\n\n// for a user-defined type, or for unsupported yet type from some module\nexport class CustomTypeColumn extends ColumnType<\n unknown,\n typeof Operators.any\n> {\n operators = Operators.any;\n\n constructor(public dataType: string) {\n super();\n this.data.isOfCustomType = true;\n }\n\n toCode(t: string): Code {\n return columnCode(this, t, `type(${singleQuote(this.dataType)})`);\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn extends CustomTypeColumn {\n toCode(t: string): Code {\n return columnCode(this, t, `domain(${singleQuote(this.dataType)})`);\n }\n}\n","import {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IdentityColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CharColumn,\n CidrColumn,\n CircleColumn,\n CitextColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n MoneyColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TextColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n VarCharColumn,\n XMLColumn,\n} from './string';\nimport {\n DateColumn,\n IntervalColumn,\n TimeColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\nimport { BooleanColumn } from './boolean';\nimport { EnumColumn } from './enum';\nimport { JSONColumn, JSONTextColumn } from './json';\nimport {\n ColumnNameOfTable,\n EmptyObject,\n emptyObject,\n ForeignKeyTable,\n makeTimestampsHelpers,\n MaybeArray,\n name,\n setDefaultLanguage,\n setDefaultNowFn,\n TemplateLiteralArgs,\n toArray,\n RawSQLBase,\n JSONType,\n JSONTypes,\n JSONUnknown,\n ColumnTypesBase,\n TimestampHelpers,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { ArrayColumn } from './array';\nimport {\n ColumnType,\n DropMode,\n IndexColumnOptions,\n IndexOptions,\n ForeignKeyOptions,\n} from './columnType';\nimport { makeRegexToFindInSql } from '../common/utils';\nimport { CustomTypeColumn, DomainColumn } from './customType';\nimport { RawSQL } from '../sql/rawSql';\n\nexport type TableData = {\n primaryKey?: TableData.PrimaryKey;\n indexes?: TableData.Index[];\n constraints?: TableData.Constraint[];\n};\n\nexport namespace TableData {\n export type PrimaryKey = {\n columns: string[];\n options?: { name?: string };\n };\n\n export type Index = {\n columns: IndexColumnOptions[];\n options: IndexOptions;\n };\n\n export type Constraint = {\n name?: string;\n check?: Check;\n identity?: Identity;\n references?: References;\n dropMode?: DropMode;\n };\n\n export type Check = RawSQLBase;\n\n export type References = {\n columns: string[];\n fnOrTable: (() => ForeignKeyTable) | string;\n foreignColumns: string[];\n options?: ForeignKeyOptions;\n };\n\n export type Identity = {\n always?: boolean;\n } & Omit<SequenceOptions, 'dataType' | 'ownedBy'>;\n\n export type SequenceOptions = {\n dataType?: 'smallint' | 'integer' | 'bigint';\n incrementBy?: number;\n startWith?: number;\n min?: number;\n max?: number;\n cache?: number;\n cycle?: boolean;\n ownedBy?: string;\n };\n}\n\nexport const getConstraintKind = (\n it: TableData.Constraint,\n): 'constraint' | 'foreignKey' | 'check' => {\n let num = 0;\n for (const key in it) {\n if (\n (key === 'references' || key === 'check') &&\n it[key as keyof typeof it] !== undefined\n ) {\n num++;\n }\n }\n return num === 1 ? (it.references ? 'foreignKey' : 'check') : 'constraint';\n};\n\nexport const newTableData = (): TableData => ({});\n\nlet tableData: TableData = newTableData();\n\nexport const getTableData = () => tableData;\n\nexport const resetTableData = (data: TableData = newTableData()) => {\n tableData = data;\n};\n\nexport const getColumnTypes = <ColumnTypes, Shape extends ColumnsShapeBase>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n data: TableData = newTableData(),\n) => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n\n resetTableData(data);\n return fn(types);\n};\n\nexport type DefaultColumnTypes = TimestampHelpers & {\n name<T extends ColumnTypesBase>(this: T, name: string): T;\n\n sql<T extends ColumnTypesBase>(\n this: T,\n sql: TemplateStringsArray,\n ...values: unknown[]\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n sql: string,\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n values: Record<string, unknown>,\n sql: string,\n ): RawSQLBase<ColumnType, T>;\n sql<T extends ColumnTypesBase>(\n this: T,\n values: Record<string, unknown>,\n ): (...sql: TemplateLiteralArgs) => RawSQLBase<ColumnType, T>;\n sql(\n ...args:\n | [sql: TemplateStringsArray, ...values: unknown[]]\n | [sql: string]\n | [values: Record<string, unknown>, sql?: string]\n ): ((...sql: TemplateLiteralArgs) => RawSQLBase) | RawSQLBase;\n\n smallint(): SmallIntColumn;\n integer(): IntegerColumn;\n bigint(): BigIntColumn;\n numeric<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n >(\n precision?: Precision,\n scale?: Scale,\n ): DecimalColumn<Precision, Scale>;\n decimal<\n Precision extends number | undefined = undefined,\n Scale extends number | undefined = undefined,\n >(\n precision?: Precision,\n scale?: Scale,\n ): DecimalColumn<Precision, Scale>;\n real(): RealColumn;\n doublePrecision(): DoublePrecisionColumn;\n identity(options?: TableData.Identity): IdentityColumn<IntegerColumn>;\n smallSerial(): IdentityColumn<SmallSerialColumn>;\n serial(): SerialColumn;\n bigSerial(): BigSerialColumn;\n money(): MoneyColumn;\n varchar<Limit extends number | undefined = undefined>(\n limit?: Limit,\n ): VarCharColumn<Limit>;\n char<Limit extends number | undefined = undefined>(\n limit?: Limit,\n ): CharColumn<Limit>;\n text(min: number, max: number): TextColumn;\n // `varchar` column with optional limit defaulting to 255.\n string<Limit extends number = 255>(limit?: Limit): VarCharColumn<Limit>;\n citext(min: number, max: number): CitextColumn;\n bytea(): ByteaColumn;\n date(): DateColumn;\n timestampNoTZ<Precision extends number>(\n precision?: Precision,\n ): TimestampColumn<Precision>;\n timestamp<Precision extends number | undefined = undefined>(\n precision?: Precision,\n ): TimestampTZColumn<Precision>;\n time<Precision extends number | undefined = undefined>(\n precision?: Precision,\n ): TimeColumn<Precision>;\n interval<\n Fields extends string | undefined = undefined,\n Precision extends number | undefined = undefined,\n >(\n fields?: Fields,\n precision?: Precision,\n ): IntervalColumn<Fields, Precision>;\n boolean(): BooleanColumn;\n enum<U extends string, T extends [U, ...U[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<U, T>;\n point(): PointColumn;\n line(): LineColumn;\n lseg(): LsegColumn;\n box(): BoxColumn;\n path(): PathColumn;\n polygon(): PolygonColumn;\n circle(): CircleColumn;\n cidr(): CidrColumn;\n inet(): InetColumn;\n macaddr(): MacAddrColumn;\n macaddr8(): MacAddr8Column;\n bit<Length extends number>(length: Length): BitColumn<Length>;\n bitVarying<Length extends number | undefined = undefined>(\n length?: Length,\n ): BitVaryingColumn<Length>;\n tsvector(): TsVectorColumn;\n tsquery(): TsQueryColumn;\n uuid(): UUIDColumn;\n xml(): XMLColumn;\n json<Type extends JSONType = JSONUnknown>(\n schemaOrFn?: Type | ((j: JSONTypes) => Type),\n ): JSONColumn<Type>;\n jsonText(): JSONTextColumn;\n array<Item extends ColumnType>(item: Item): ArrayColumn<Item>;\n type(dataType: string): CustomTypeColumn;\n domain(dataType: string): DomainColumn;\n\n primaryKey(columns: string[], options?: { name?: string }): EmptyObject;\n\n index(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n unique(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n /**\n * See {@link ColumnType.searchIndex}\n */\n searchIndex(\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ): EmptyObject;\n\n constraint<\n Table extends (() => ForeignKeyTable) | string,\n Columns extends Table extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<Table>>,\n ...ColumnNameOfTable<ReturnType<Table>>[],\n ]\n : [string, ...string[]],\n >({\n name,\n references,\n check,\n dropMode,\n }: {\n name?: string;\n references?: [\n columns: string[],\n fnOrTable: Table,\n foreignColumns: Columns,\n options?: ForeignKeyOptions,\n ];\n check?: RawSQLBase;\n dropMode?: DropMode;\n }): EmptyObject;\n\n foreignKey<\n Table extends (() => ForeignKeyTable) | string,\n Columns extends Table extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<Table>>,\n ...ColumnNameOfTable<ReturnType<Table>>[],\n ]\n : [string, ...string[]],\n >(\n columns: string[],\n fnOrTable: Table,\n foreignColumns: Columns,\n options?: ForeignKeyOptions & { name?: string; dropMode?: DropMode },\n ): EmptyObject;\n\n check(check: RawSQLBase): EmptyObject;\n};\n\nexport const columnTypes: DefaultColumnTypes = {\n name,\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sql(...args: any[]): any {\n const arg = args[0];\n if (Array.isArray(arg)) {\n return new RawSQL(args as TemplateLiteralArgs);\n }\n\n if (typeof args[0] === 'string') {\n return new RawSQL(args[0]);\n }\n\n if (args[1] !== undefined) {\n return new RawSQL(args[1], arg);\n }\n\n return (...args: TemplateLiteralArgs) =>\n new RawSQL(args, arg as Record<string, unknown>);\n },\n\n smallint() {\n return new SmallIntColumn();\n },\n integer() {\n return new IntegerColumn();\n },\n bigint() {\n return new BigIntColumn();\n },\n numeric(precision, scale) {\n return new DecimalColumn(precision, scale);\n },\n decimal(precision, scale) {\n return new DecimalColumn(precision, scale);\n },\n real() {\n return new RealColumn();\n },\n doublePrecision() {\n return new DoublePrecisionColumn();\n },\n identity(options) {\n return new IntegerColumn().identity(options);\n },\n smallSerial() {\n return new SmallSerialColumn();\n },\n serial() {\n return new SerialColumn();\n },\n bigSerial() {\n return new BigSerialColumn();\n },\n money() {\n return new MoneyColumn();\n },\n varchar(limit) {\n return new VarCharColumn(limit);\n },\n char(limit) {\n return new CharColumn(limit);\n },\n text(min, max) {\n return new TextColumn(min, max);\n },\n string<Limit extends number = 255>(limit = 255 as Limit) {\n return new VarCharColumn(limit);\n },\n citext(min, max) {\n return new CitextColumn(min, max);\n },\n bytea() {\n return new ByteaColumn();\n },\n date() {\n return new DateColumn();\n },\n timestampNoTZ(precision) {\n return new TimestampColumn(precision);\n },\n timestamp(precision) {\n return new TimestampTZColumn(precision);\n },\n time(precision) {\n return new TimeColumn(precision);\n },\n interval(fields, precision) {\n return new IntervalColumn(fields, precision);\n },\n boolean() {\n return new BooleanColumn();\n },\n enum(dataType, type) {\n return new EnumColumn(dataType, type);\n },\n point() {\n return new PointColumn();\n },\n line() {\n return new LineColumn();\n },\n lseg() {\n return new LsegColumn();\n },\n box() {\n return new BoxColumn();\n },\n path() {\n return new PathColumn();\n },\n polygon() {\n return new PolygonColumn();\n },\n circle() {\n return new CircleColumn();\n },\n cidr() {\n return new CidrColumn();\n },\n inet() {\n return new InetColumn();\n },\n macaddr() {\n return new MacAddrColumn();\n },\n macaddr8() {\n return new MacAddr8Column();\n },\n bit(length) {\n return new BitColumn(length);\n },\n bitVarying(length) {\n return new BitVaryingColumn(length);\n },\n tsvector() {\n return new TsVectorColumn();\n },\n tsquery() {\n return new TsQueryColumn();\n },\n uuid() {\n return new UUIDColumn();\n },\n xml() {\n return new XMLColumn();\n },\n json(schemaOrFn) {\n return new JSONColumn(schemaOrFn);\n },\n jsonText() {\n return new JSONTextColumn();\n },\n array(item) {\n return new ArrayColumn(item);\n },\n type(dataType) {\n return new CustomTypeColumn(dataType);\n },\n domain(dataType) {\n return new DomainColumn(dataType);\n },\n\n primaryKey(columns, options) {\n tableData.primaryKey = { columns, options };\n return emptyObject;\n },\n\n index(columns, options = {}) {\n const index = {\n columns: toArray(columns).map((column) =>\n typeof column === 'string' ? { column } : column,\n ),\n options,\n };\n\n (tableData.indexes ??= []).push(index);\n return emptyObject;\n },\n\n unique(columns, options) {\n return this.index(columns, { ...options, unique: true });\n },\n\n /**\n * See {@link ColumnType.searchIndex}\n */\n searchIndex(columns, options) {\n return this.index(columns, { ...options, tsVector: true });\n },\n\n constraint({ name, references, check, dropMode }) {\n (tableData.constraints ??= []).push({\n name,\n references: references\n ? {\n columns: references[0],\n fnOrTable: references[1],\n foreignColumns: references[2],\n options: references[3],\n }\n : undefined,\n check,\n dropMode,\n });\n return emptyObject;\n },\n\n foreignKey(columns, fnOrTable, foreignColumns, options) {\n (tableData.constraints ??= []).push({\n name: options?.name,\n references: {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n },\n dropMode: options?.dropMode,\n });\n return emptyObject;\n },\n\n check(check) {\n (tableData.constraints ??= []).push({\n check,\n });\n return emptyObject;\n },\n\n ...makeTimestampsHelpers(\n makeRegexToFindInSql('\\\\bupdatedAt\\\\b\"?\\\\s*='),\n '\"updatedAt\"',\n makeRegexToFindInSql('\\\\bupdated_at\\\\b\"?\\\\s*='),\n '\"updated_at\"',\n ),\n};\n\nRawSQL.prototype.columnTypes = columnTypes;\n","import { ColumnType } from './columnType';\nimport { ColumnsShapeBase, ColumnTypeBase } from 'orchid-core';\nimport { Operators } from './operators';\n\nexport type ColumnsShape = Record<string, ColumnType>;\n\nexport abstract class ColumnsObject<\n Shape extends ColumnsShapeBase,\n> extends ColumnType<\n { [K in keyof Shape]: Shape[K]['type'] },\n typeof Operators.any,\n { [K in keyof Shape]: Shape[K]['inputType'] },\n { [K in keyof Shape]: Shape[K]['outputType'] },\n { [K in keyof Shape]: Shape[K]['queryType'] }\n> {\n dataType = 'object' as const;\n operators = Operators.any;\n\n constructor(public shape: Shape) {\n super();\n }\n}\n\nexport abstract class ArrayOfColumnsObjects<\n Shape extends ColumnsShapeBase,\n> extends ColumnType<\n { [K in keyof Shape]: Shape[K]['type'] }[],\n typeof Operators.any,\n { [K in keyof Shape]: Shape[K]['inputType'] }[],\n { [K in keyof Shape]: Shape[K]['outputType'] }[],\n { [K in keyof Shape]: Shape[K]['queryType'] }[]\n> {\n dataType = 'array' as const;\n operators = Operators.any;\n\n constructor(public shape: Shape) {\n super();\n }\n}\n\nexport abstract class PluckResultColumnType<\n C extends ColumnTypeBase,\n> extends ColumnTypeBase<\n C['type'][],\n typeof Operators.any,\n C['inputType'][],\n C['outputType'][],\n C['queryType'][]\n> {}\n","import { ColumnType } from './columnType';\nimport { Query } from '../query/query';\nimport { CreateCtx, UpdateCtx } from '../queryMethods';\nimport { Operators } from './operators';\n\nexport abstract class VirtualColumn extends ColumnType<\n unknown,\n typeof Operators.any\n> {\n dataType = '';\n operators = Operators.any;\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ): void;\n\n update?(q: Query, ctx: UpdateCtx, set: Record<string, unknown>): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { RawSQL } from '../sql/rawSql';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn extends VirtualColumn {\n static instance = new UnknownColumn();\n}\n\nRawSQL.prototype._type = UnknownColumn.instance;\n","import { ColumnType } from './columnType';\nimport { BooleanColumn } from './boolean';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CharColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n MoneyColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TextColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n VarCharColumn,\n XMLColumn,\n} from './string';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport { JSONColumn, JSONTextColumn } from './json';\nimport {\n DateColumn,\n IntervalColumn,\n TimeColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\n\nexport const columnsByType: Record<\n string,\n new (...args: never[]) => ColumnType\n> = {\n bool: BooleanColumn,\n boolean: BooleanColumn,\n bytea: ByteaColumn,\n char: CharColumn,\n int8: BigIntColumn,\n bigint: BigIntColumn,\n int2: SmallIntColumn,\n smallint: SmallIntColumn,\n int4: IntegerColumn,\n integer: IntegerColumn,\n text: TextColumn,\n json: JSONTextColumn,\n xml: XMLColumn,\n point: PointColumn,\n lseg: LsegColumn,\n path: PathColumn,\n box: BoxColumn,\n polygon: PolygonColumn,\n line: LineColumn,\n cidr: CidrColumn,\n float4: RealColumn,\n real: RealColumn,\n float8: DoublePrecisionColumn,\n 'double precision': DoublePrecisionColumn,\n circle: CircleColumn,\n macaddr8: MacAddr8Column,\n money: MoneyColumn,\n macaddr: MacAddrColumn,\n inet: InetColumn,\n bpchar: CharColumn,\n character: CharColumn,\n varchar: VarCharColumn,\n 'character varying': VarCharColumn,\n date: DateColumn,\n time: TimeColumn,\n 'time without time zone': TimeColumn,\n timestamp: TimestampColumn,\n 'timestamp without time zone': TimestampColumn,\n timestamptz: TimestampTZColumn,\n 'timestamp with time zone': TimestampTZColumn,\n interval: IntervalColumn,\n bit: BitColumn,\n varbit: BitVaryingColumn,\n 'bit varying': BitVaryingColumn,\n numeric: DecimalColumn,\n decimal: DecimalColumn,\n uuid: UUIDColumn,\n tsvector: TsVectorColumn,\n tsquery: TsQueryColumn,\n jsonb: JSONColumn,\n smallserial: SmallSerialColumn,\n serial: SerialColumn,\n bigserial: BigSerialColumn,\n};\n","import pg, { Pool, PoolClient, PoolConfig } from 'pg';\nimport { AdapterBase, QueryInput, QueryResultRow, Sql } from 'orchid-core';\nconst { types } = pg;\n\nexport type TypeParsers = Record<number, (input: string) => unknown>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type QueryResult<T extends QueryResultRow = any> = {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type QueryArraysResult<R extends any[] = any[]> = {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n};\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.TIME,\n types.builtins.CIRCLE,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nconst returnArg = (arg: unknown) => arg;\n\nexport type AdapterConfig = Omit<PoolConfig, 'types' | 'connectionString'> & {\n schema?: string;\n databaseURL?: string;\n};\n\nexport type AdapterOptions = AdapterConfig & {\n types?: TypeParsers;\n};\n\nexport class Adapter implements AdapterBase {\n types: TypeParsers;\n pool: Pool;\n config: PoolConfig;\n schema?: string;\n\n constructor({ types = defaultTypeParsers, ...config }: AdapterOptions) {\n this.types = types;\n\n let schema = config.schema;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!schema) {\n schema = url.searchParams.get('schema') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (schema) this.schema = schema === 'public' ? undefined : schema;\n\n this.config = config;\n this.pool = new pg.Pool(config);\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return performQuery(\n this.pool,\n query,\n types,\n this.schema,\n ) as unknown as Promise<QueryResult<T>>;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryArraysResult<R>> {\n return performQuery(\n this.pool,\n query,\n types,\n this.schema,\n 'array',\n ) as unknown as Promise<QueryArraysResult<R>>;\n }\n\n async transaction<Result>(\n begin: Sql,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n const client = await this.pool.connect();\n try {\n await setSearchPath(client, this.schema);\n await performQueryOnClient(client, begin, this.types);\n let result;\n try {\n result = await cb(new TransactionAdapter(this, client, this.types));\n } catch (err) {\n await performQueryOnClient(client, { text: 'ROLLBACK' }, this.types);\n throw err;\n }\n await performQueryOnClient(client, { text: 'COMMIT' }, this.types);\n return result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ntype ConnectionSchema = { connection: { schema?: string } };\n\nconst setSearchPath = (client: PoolClient, schema?: string) => {\n if ((client as unknown as ConnectionSchema).connection.schema !== schema) {\n (client as unknown as ConnectionSchema).connection.schema = schema;\n return client.query(`SET search_path = ${schema || 'public'}`);\n }\n return;\n};\n\nconst performQuery = async (\n pool: Pool,\n query: QueryInput,\n types?: TypeParsers,\n schema?: string,\n rowMode?: 'array',\n) => {\n const client = await pool.connect();\n try {\n await setSearchPath(client, schema);\n return await performQueryOnClient(client, query, types, rowMode);\n } finally {\n client.release();\n }\n};\n\nconst performQueryOnClient = (\n client: PoolClient,\n query: QueryInput,\n types?: TypeParsers,\n rowMode?: 'array',\n) => {\n const params = {\n text: typeof query === 'string' ? query : query.text,\n values: typeof query === 'string' ? undefined : query.values,\n rowMode,\n types: types\n ? {\n getTypeParser(id: number) {\n return types[id] || returnArg;\n },\n }\n : defaultTypesConfig,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return client.query(params as any);\n};\n\nexport class TransactionAdapter implements Adapter {\n pool: Pool;\n config: PoolConfig;\n\n constructor(\n public adapter: Adapter,\n public client: PoolClient,\n public types: TypeParsers,\n ) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async query<T extends QueryResultRow = any>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return await performQueryOnClient(this.client, query, types);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryArraysResult<R>> {\n return await performQueryOnClient(this.client, query, types, 'array');\n }\n\n async transaction<Result>(\n _: Sql,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close() {\n return this.adapter.close();\n }\n}\n","import { Query, SetQueryReturnsColumn } from '../query/query';\nimport {\n ColumnTypeBase,\n emptyObject,\n Expression,\n getValueKey,\n setParserToQuery,\n toArray,\n} from 'orchid-core';\nimport { SelectableOrExpression } from './utils';\nimport { OrderItem, SelectQueryData, ToSQLCtx, WhereItem } from '../sql';\nimport { addValue, columnToSql, rawOrColumnToSql } from '../sql/common';\nimport { pushOrderBySql } from '../sql/orderBy';\nimport { whereToSql } from '../sql/where';\nimport { windowToSql } from '../sql/window';\nimport { OrderArg, WhereArg, WindowArgDeclaration } from '../queryMethods';\nimport { BooleanNullable } from '../columns';\nimport { BaseOperators, setQueryOperators } from '../columns/operators';\n\n// Additional SQL options that can be accepted by any aggregate function.\nexport type AggregateOptions<T extends Query> = {\n // Add DISTINCT inside of function call.\n distinct?: boolean;\n // The same argument as in .order() to be set inside of function call.\n order?: OrderArg<T> | OrderArg<T>[];\n // The same argument as in .where() to be set inside of function call.\n filter?: WhereArg<T>;\n // The same argument as in .orWhere() to support OR logic of the filter clause.\n filterOr?: WhereArg<T>[];\n // Adds WITHIN GROUP SQL statement.\n withinGroup?: boolean;\n // defines OVER clause.\n // Can be the name of a window defined by calling the .window() method,\n // or object the same as the .window() method takes to define a window.\n over?: Over<T>;\n};\n\n// Window definition or name.\nexport type Over<T extends Query> =\n | keyof T['windows']\n | WindowArgDeclaration<T>;\n\n// Arguments of function.\n// It can be a column name, expression,\n// `pairs` is for { key: value } which is translated to ('key', value) (used by `jsonObjectAgg`),\n// `value` is for a query variable (used by `stringAgg` for a delimiter).\nexport type FnExpressionArgs<Q extends Query> = (\n | SelectableOrExpression<Q>\n | { pairs: Record<string, SelectableOrExpression<Q>> }\n | { value: unknown }\n)[];\n\n// Expression for SQL function calls.\nexport class FnExpression<\n Q extends Query = Query,\n T extends ColumnTypeBase = ColumnTypeBase,\n> extends Expression<T> {\n /**\n * @param q - query object.\n * @param fn - SQL function name.\n * @param args - arguments of the function.\n * @param options - aggregate options.\n * @param _type - column type of the function result.\n */\n constructor(\n public q: Q,\n public fn: string,\n public args: FnExpressionArgs<Q>,\n public options: AggregateOptions<Q> = emptyObject,\n public _type: T,\n ) {\n super();\n }\n\n // Builds function SQL.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const sql: string[] = [`${this.fn}(`];\n\n const { values } = ctx;\n const { options } = this;\n\n if (options.distinct && !options.withinGroup) sql.push('DISTINCT ');\n\n sql.push(\n this.args\n .map((arg) => {\n if (typeof arg === 'string') {\n return arg === '*'\n ? '*'\n : columnToSql(ctx, this.q.q, this.q.q.shape, arg, quotedAs, true);\n } else if (arg instanceof Expression) {\n return arg.toSQL(ctx, quotedAs);\n } else if ('pairs' in arg) {\n const args: string[] = [];\n const { pairs } = arg;\n for (const key in pairs) {\n args.push(\n // ::text is needed to bypass \"could not determine data type of parameter\" postgres error\n `${addValue(values, key)}::text, ${rawOrColumnToSql(\n ctx,\n this.q.q,\n pairs[\n key as keyof typeof pairs\n ] as unknown as SelectableOrExpression,\n quotedAs,\n )}`,\n );\n }\n return args.join(', ');\n } else {\n return addValue(values, arg.value);\n }\n })\n .join(', '),\n );\n\n if (options.withinGroup) sql.push(') WITHIN GROUP (');\n else if (options.order) sql.push(' ');\n\n if (options.order) {\n pushOrderBySql(\n { ...ctx, sql },\n this.q.q,\n quotedAs,\n toArray(options.order) as OrderItem[],\n );\n }\n\n sql.push(')');\n\n if (options.filter || options.filterOr) {\n const whereSql = whereToSql(\n ctx,\n this.q,\n {\n and: options.filter ? ([options.filter] as WhereItem[]) : undefined,\n or: options.filterOr?.map((item) => [item]) as WhereItem[][],\n shape: this.q.q.shape,\n joinedShapes: this.q.q.joinedShapes,\n },\n quotedAs,\n );\n if (whereSql) {\n sql.push(` FILTER (WHERE ${whereSql})`);\n }\n }\n\n if (options.over) {\n sql.push(\n ` OVER ${windowToSql(ctx, this.q.q, options.over as string, quotedAs)}`,\n );\n }\n\n return sql.join('');\n }\n}\n\n// Adds column operator functions to the expression.\nexport type ColumnExpression<\n C extends ColumnTypeBase,\n Ops extends BaseOperators = C['operators'],\n> = Expression<C> & {\n [K in keyof Ops]: (\n arg: Ops[K]['_opType'],\n ) => ColumnExpression<BooleanNullable>;\n};\n\n// Applies Expression to the query.\n// The query returns a column of Expression type, and has column operators of this type.\nexport const makeExpression = <T extends Query, C extends ColumnTypeBase>(\n self: T,\n expr: Expression,\n): SetQueryReturnsColumn<T, C> & C['operators'] => {\n const { _type: type } = expr;\n const q = setQueryOperators(self, type.operators);\n\n // Throw happens only on `undefined`, which is not the case for `sum` and other functions that can return `null`.\n q.q.returnType = 'valueOrThrow';\n (q.q as SelectQueryData).returnsOne = true;\n (q.q as SelectQueryData)[getValueKey] = type;\n q.q.expr = expr;\n q.q.select = [expr];\n\n if (type.parseFn) {\n setParserToQuery(q.q, getValueKey, type.parseFn);\n }\n\n return q as SetQueryReturnsColumn<T, C> & C['operators'];\n};\n\n// Applies a function expression to the query.\nexport function makeFnExpression<T extends Query, C extends ColumnTypeBase>(\n self: T,\n type: C,\n fn: string,\n args: FnExpressionArgs<Query>,\n options?: AggregateOptions<T>,\n): SetQueryReturnsColumn<T, C> & C['operators'] {\n return makeExpression(\n self.clone(),\n new FnExpression<Query, ColumnTypeBase>(\n self,\n fn,\n args,\n options as AggregateOptions<Query> | undefined,\n type,\n ),\n ) as SetQueryReturnsColumn<T, C> & C['operators'];\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumn,\n} from '../query/query';\nimport {\n ArrayColumn,\n BooleanColumn,\n BooleanNullable,\n ColumnType,\n IntegerColumn,\n JSONColumn,\n JSONTextColumn,\n NumberBaseColumn,\n NumberColumn,\n TextBaseColumn,\n TextColumn,\n UnknownColumn,\n XMLColumn,\n} from '../columns';\nimport { ExpressionOutput, SelectableOrExpression } from '../common/utils';\nimport { ColumnTypeBase, emptyArray, NullableColumn } from 'orchid-core';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../common/fn';\nimport { Operators } from '../columns/operators';\nimport { RawSQL } from '../sql/rawSql';\n\n// Helper function to check if we're selecting a count on this query.\n// Used in `create` to not return a full record after `count()` method.\nexport const isSelectingCount = (q: Query) => {\n const { expr } = q.q;\n return (\n expr instanceof FnExpression && expr.fn === 'count' && expr.args[0] === '*'\n );\n};\n\n// `count` returns `bigint` type that is represented by a string.\n// This is needed to parse the value back to a number.\nconst int = new IntegerColumn().parse((input) =>\n parseInt(input as unknown as string),\n);\n\ntype NullableInteger = NullableColumn<IntegerColumn>;\n\n// Parse nullable string to int, the nullable string may happen because of `bigint` db type.\nconst nullableInt = new IntegerColumn().parse((input) =>\n input === null ? null : parseInt(input as unknown as string),\n) as NullableInteger;\n\ntype NullableNumber = NullableColumn<NumberColumn>;\n\n// double-precision is represented by string in JS, parse it to float.\nconst nullableFloat = new IntegerColumn().parse((input) =>\n input === null ? null : parseFloat(input as unknown as string),\n) as NullableNumber;\n\nconst nullableBoolean: BooleanNullable = new BooleanColumn().nullable();\n\ntype NullableJSONAgg<\n T extends Query,\n Arg extends SelectableOrExpression<T>,\n> = NullableColumn<ArrayColumn<ExpressionOutput<T, Arg>>>;\n\ntype NullableJSONObject<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n Outputs extends Record<string, ColumnTypeBase> = {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>;\n },\n> = NullableColumn<\n ColumnType<\n { [K in keyof Outputs]: Outputs[K]['type'] },\n typeof Operators.any,\n { [K in keyof Outputs]: Outputs[K]['inputType'] },\n { [K in keyof Outputs]: Outputs[K]['outputType'] }\n >\n>;\n\nconst jsonColumn = new JSONTextColumn().nullable();\nconst jsonbColumn = new JSONColumn().nullable();\n\ntype NullableText = NullableColumn<TextColumn>;\nconst nullableText = new TextColumn().nullable();\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\n /**\n * `fn` allows to call an arbitrary SQL function.\n *\n * For example, calling `sqrt` function to get a square root from some numeric column:\n *\n * ```ts\n * const q = await User.select({\n * sqrt: (q) => q.fn<number>('sqrt', ['numericColumn']),\n * }).take();\n *\n * q.sqrt; // has type `number` just as provided\n * ```\n *\n * If this is an aggregate function, you can specify aggregation options via third parameter.\n *\n * Forth parameter is for runtime column type. When specified, allows to chain the function with the column operators:\n *\n * ```ts\n * const q = await User.select({\n * // chain `sqrt(\"numericColumn\")` with the \"greater than 5\"\n * sqrtIsGreaterThan5: (q) => q.fn('sqrt', ['numericColumn'], {}, (t) => t.float()).gt(5),\n * }).take();\n *\n * // Return type is boolean | null\n * // todo: it should be just boolean if the column is not nullable, but for now it's always nullable\n * q.sqrtIsGreaterThan5\n * ```\n *\n * @param fn\n * @param args\n * @param options\n * @param type\n */\n fn<T extends Query, Type = unknown, C extends ColumnType = ColumnType<Type>>(\n this: T,\n fn: string,\n args: SelectableOrExpression<T>[],\n options?: AggregateOptions<T>,\n type?: (t: T['columnTypes']) => C,\n ): SetQueryReturnsColumn<T, C> & C['operators'] {\n return makeFnExpression(\n this,\n (type?.(this.columnTypes) || UnknownColumn.instance) as C,\n fn,\n args,\n options,\n );\n }\n\n /**\n * Use `exists()` to check if there is at least one record-matching condition.\n *\n * It will discard previous `select` statements if any. Returns a boolean.\n *\n * ```ts\n * const exists: boolean = await db.table.where(...conditions).exists();\n * ```\n */\n exists<T extends Query>(this: T): SetQueryReturnsColumn<T, BooleanColumn> {\n return this.clone()._exists();\n }\n _exists<T extends Query>(this: T): SetQueryReturnsColumn<T, BooleanColumn> {\n const q = this._getOptional(new RawSQL('true'));\n q.q.notFoundDefault = false;\n q.q.coalesceValue = new RawSQL('false');\n return q as unknown as SetQueryReturnsColumn<T, BooleanColumn>;\n }\n\n /**\n * Count records with the `count` function:\n *\n * ```ts\n * // count all records:\n * const result: number = await db.table.count();\n *\n * // count records where a column is not NULL:\n * db.table.count('name');\n *\n * // see options above:\n * db.table.count('*', aggregateOptions);\n *\n * // select counts of people grouped by city\n * db.people\n * .select('city', {\n * population: (q) => q.count(),\n * })\n * .group('city');\n * ```\n *\n * @param arg - optionally, provide a column or a raw SQL for the `count` argument\n * @param options - aggregation options\n */\n count<T extends Query>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NumberColumn> & {\n isCount: true;\n } & NumberColumn['operators'] {\n return makeFnExpression(\n this,\n int,\n 'count',\n [arg],\n options,\n ) as SetQueryReturnsColumn<T, NumberColumn> & {\n isCount: true;\n } & NumberColumn['operators'];\n }\n\n /**\n * Get the minimum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.min(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select min product price grouped by product category\n * db.product\n * .select('category', {\n * minPrice: (q) => q.min('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n min<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'min', [arg], options);\n }\n\n /**\n * Gets the maximum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.max(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select max product price grouped by product category\n * db.product\n * .select('category', {\n * maxPrice: (q) => q.max('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n max<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'max', [arg], options);\n }\n\n /**\n * Retrieve the sum of the values of a given numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.sum(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select sum of employee salaries grouped by years\n * db.employee\n * .select('year', {\n * yearlySalaries: (q) => q.sum('salary'),\n * })\n * .group('year');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n sum<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'sum', [arg], options);\n }\n\n /**\n * Retrieve the average value of a numeric column, it returns a number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.avg('numericColumn', aggregateOptions);\n *\n * // select average movies ratings\n * db.movie\n * .select('title', {\n * averageRating: (q) => q.avg('rating'),\n * })\n * .group('title');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n avg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'avg', [arg], options);\n }\n\n /**\n * Bitwise `and` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitAnd(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `bitAnd`\n * db.table\n * .select('someColumn', {\n * bitAnd: (q) => q.bitAnd('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitAnd<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'bit_and', [arg], options);\n }\n\n /**\n * Bitwise `or` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitOr('numericColumn', aggregateOptions);\n *\n * // select grouped `bitOr`\n * db.table\n * .select('someColumn', {\n * bitOr: (q) => q.bitOr('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitOr<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberBaseColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'bit_or', [arg], options);\n }\n\n /**\n * Aggregate booleans with `and` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolAnd(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolAnd`\n * db.table\n * .select('someColumn', {\n * boolAnd: (q) => q.boolAnd('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolAnd<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'bool_and', [arg], options);\n }\n\n /**\n * Aggregate booleans with `or` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolOr(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolOr`\n * db.table\n * .select('someColumn', {\n * boolOr: (q) => q.boolOr('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolOr<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'bool_or', [arg], options);\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, BooleanNullable> & BooleanNullable['operators'] {\n return makeFnExpression(this, nullableBoolean, 'every', [arg], options);\n }\n\n /**\n * Aggregate values into an array by using `json_agg`. Returns array of values or `null` if there are no records.\n *\n * `jsonAgg` is working a bit faster, `jsonbAgg` is better only when applying JSON operations in SQL.\n *\n * ```ts\n * const idsOrNull: number[] | null = db.table.jsonAgg('id', aggregateOptions);\n *\n * const namesOrNull: string[] | null = db.table.jsonbAgg(\n * 'name',\n * aggregateOptions,\n * );\n *\n * // select grouped `jsonAgg`\n * db.table\n * .select('someColumn', {\n * jsonAgg: (q) => q.jsonAgg('anyColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - any column or raw SQL\n * @param options - aggregation options\n */\n jsonAgg<T extends Query, Arg extends SelectableOrExpression<T>>(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONAgg<T, Arg>> &\n ArrayColumn<ColumnTypeBase>['operators'] {\n return makeFnExpression(\n this,\n jsonColumn as unknown as NullableJSONAgg<T, Arg>,\n 'json_agg',\n [arg],\n options,\n );\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<T extends Query, Arg extends SelectableOrExpression<T>>(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONAgg<T, Arg>> &\n ArrayColumn<ColumnTypeBase>['operators'] {\n return makeFnExpression(\n this,\n jsonbColumn as unknown as NullableJSONAgg<T, Arg>,\n 'jsonb_agg',\n [arg],\n options,\n );\n }\n\n /**\n * It does the construction of JSON objects, keys are provided strings and values can be table columns or raw SQL expressions, and returns `object` or `null` if no records.\n *\n * `jsonObjectAgg` is different from `jsonbObjectAgg` by internal representation in the database, `jsonObjectAgg` is a bit faster as it constructs a simple string.\n *\n * ```ts\n * import { TextColumn } from './string';\n *\n * // object has type { nameAlias: string, foo: string } | null\n * const object = await db.table.jsonObjectAgg(\n * {\n * // select a column with alias\n * nameAlias: 'name',\n * // select raw SQL with alias\n * foo: db.table.sql<string>`\"bar\" || \"baz\"`,\n * },\n * aggregateOptions,\n * );\n *\n * // select aggregated object\n * db.table.select('id', {\n * object: (q) =>\n * q.jsonObjectAgg({\n * nameAlias: 'name',\n * foo: db.table.sql<string>`\"bar\" || \"baz\"`,\n * }),\n * });\n * ```\n *\n * @param arg - object where values are column names or SQL\n * @param options - aggregation options\n */\n jsonObjectAgg<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONObject<T, Obj>> &\n typeof Operators.any {\n return makeFnExpression(\n this,\n jsonColumn as NullableJSONObject<T, Obj>,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends Query,\n Obj extends Record<string, SelectableOrExpression<T>>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableJSONObject<T, Obj>> &\n typeof Operators.any {\n return makeFnExpression(\n this,\n jsonbColumn as NullableJSONObject<T, Obj>,\n 'jsonb_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * Select joined strings, it returns a string or `null` if no records.\n *\n * ```ts\n * const result: string | null = db.table.stringAgg(\n * 'name',\n * ', ',\n * aggregateOptions,\n * );\n *\n * // select joined strings grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedNames: (q) => q.stringAgg('name', ', '),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - string column or SQL\n * @param delimiter - string to join with\n * @param options - aggration options\n */\n stringAgg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, TextBaseColumn>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableText> & NullableText['operators'] {\n return makeFnExpression(\n this,\n nullableText,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n );\n }\n\n /**\n * Concatenates `xml` columns, returns a `string` or `null` if no records.\n *\n * ```ts\n * const xml: string | null = await db.table.xmlAgg('xmlColumn', aggregateOptions);\n *\n * // select joined XMLs grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedXMLs: (q) => q.xmlAgg('xml'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - column or SQL with XML\n * @param options - aggregation options\n */\n xmlAgg<T extends Query>(\n this: T,\n arg: SelectableOrExpressionOfType<T, XMLColumn>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsColumn<T, NullableText> & NullableText['operators'] {\n return makeFnExpression(this, nullableText, 'xmlagg', [arg], options);\n }\n\n /**\n * Selects the` row_number` window function.\n *\n * Returns the number of the current row within its partition, counting from 1.\n *\n * ```ts\n * // result is of type Array<{ rowNumber: number }>\n * const result = await db.table.select({\n * rowNumber: (q) =>\n * q.rowNumber({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rowNumber<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'row_number', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the` rank` window function.\n *\n * Returns the rank of the current row, with gaps; that is, the row_number of the first row in its peer group.\n *\n * ```ts\n * // result is of type Array<{ rank: number }>\n * const result = await db.table.select({\n * rank: (q) =>\n * q.rank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'rank', emptyArray, { over });\n }\n\n /**\n * Selects the` dense_rank` window function.\n *\n * Returns the rank of the current row, without gaps; this function effectively counts peer groups.\n *\n * ```ts\n * // result is of type Array<{ denseRank: number }>\n * const result = await db.table.select({\n * denseRank: (q) =>\n * q.denseRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n denseRank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'dense_rank', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the `percent_rank` window function.\n *\n * Returns the relative rank of the current row, that is (rank - 1) / (total partition rows - 1). The value thus ranges from 0 to 1 inclusive.\n *\n * ```ts\n * // result is of type Array<{ percentRank: number }>\n * const result = await db.table.select({\n * percentRank: (q) =>\n * q.percentRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n percentRank<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableInteger> & NullableInteger['operators'] {\n return makeFnExpression(this, nullableInt, 'percent_rank', emptyArray, {\n over,\n });\n }\n\n /**\n * Selects the `cume_dist` window function.\n *\n * Returns the cumulative distribution, that is (number of partition rows preceding or peers with current row) / (total partition rows). The value thus ranges from 1/N to 1.\n *\n * ```ts\n * // result is of type Array<{ cumeDist: number }>\n * const result = await db.table.select({\n * cumeDist: (q) =>\n * q.cumeDist({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n cumeDist<T extends Query>(\n this: T,\n over?: Over<T>,\n ): SetQueryReturnsColumn<T, NullableNumber> & NullableNumber['operators'] {\n return makeFnExpression(this, nullableFloat, 'cume_dist', emptyArray, {\n over,\n });\n }\n}\n","import { Query, QueryReturnType, SelectableBase, WithDataBase } from './query';\nimport { QueryData } from '../sql';\nimport {\n ColumnsShapeBase,\n QueryBaseCommon,\n QueryInternal,\n QueryMetaBase,\n} from 'orchid-core';\nimport { RelationsBase } from '../relations';\nimport { getClonedQueryData } from '../common/utils';\n\nexport abstract class QueryBase implements QueryBaseCommon {\n /**\n * Clones the current query chain, useful for re-using partial query snippets in other queries without mutating the original.\n *\n * Used under the hood, and not really needed on the app side.\n */\n clone<T extends QueryBase>(this: T): T {\n const cloned = Object.create(this.baseQuery);\n cloned.q = getClonedQueryData(this.q);\n return cloned;\n }\n abstract result: ColumnsShapeBase;\n q = {} as QueryData;\n table?: string;\n selectable!: SelectableBase;\n shape!: ColumnsShapeBase;\n relations!: RelationsBase;\n withData!: WithDataBase;\n baseQuery!: Query;\n internal!: QueryInternal;\n meta!: QueryMetaBase;\n returnType!: QueryReturnType;\n}\n","import { SetQueryTableAlias } from '../query/query';\nimport { QueryBase } from '../query/queryBase';\n\nexport abstract class AsMethods extends QueryBase {\n /**\n * Sets table alias:\n *\n * ```ts\n * db.table.as('u').select('u.name');\n *\n * // Can be used in the join:\n * db.table.join(Profile.as('p'), 'p.userId', 'user.id');\n * ```\n *\n * @param as - alias for the table of this query\n */\n as<T extends AsMethods, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return this.clone()._as(as) as unknown as SetQueryTableAlias<T, As>;\n }\n _as<T extends AsMethods, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n this.q.as = as;\n return this as unknown as SetQueryTableAlias<T, As>;\n }\n}\n","import { Query } from '../query/query';\nimport { isExpression } from 'orchid-core';\n\nexport type ClearStatement =\n | 'with'\n | 'select'\n | 'where'\n | 'union'\n | 'using'\n | 'join'\n | 'group'\n | 'order'\n | 'having'\n | 'limit'\n | 'offset'\n | 'counters';\n\nexport class Clear {\n clear<T extends Query>(this: T, ...clears: ClearStatement[]): T {\n return this.clone()._clear(...clears);\n }\n\n _clear<T extends Query>(this: T, ...clears: ClearStatement[]): T {\n clears.forEach((clear) => {\n if (clear === 'where') {\n delete this.q.and;\n delete this.q.or;\n } else if (clear === 'counters') {\n if ('type' in this.q && this.q.type === 'update') {\n this.q.updateData = this.q.updateData.filter((item) => {\n if (!isExpression(item) && typeof item !== 'function') {\n let removed = false;\n for (const key in item) {\n const value = item[key] as Record<string, unknown>;\n if (\n typeof value === 'object' &&\n (value.op === '+' || value.op === '-')\n ) {\n delete item[key];\n removed = true;\n }\n }\n if (removed && !Object.keys(item).length) {\n return false;\n }\n }\n\n return true;\n });\n }\n } else {\n delete (this.q as Record<string, unknown>)[clear];\n }\n });\n return this;\n }\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { ColumnInfoQueryData } from '../sql';\nimport { ColumnType } from '../columns';\nimport { QueryCatch, QueryThen } from 'orchid-core';\n\n/**\n * Result type for `columnInfo` method.\n * Sets query kind to 'columnInfo', returns a single value (may return undefined),\n * the value is a {@link ColumnInfo} object or a Record with keys for column names and ColumnInfo objects as values.\n **/\nexport type SetQueryReturnsColumnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined,\n Result = Column extends keyof T['shape']\n ? ColumnInfo\n : Record<keyof T['shape'], ColumnInfo>,\n> = Omit<\n SetQueryKind<T, 'columnInfo'>,\n 'result' | 'returnType' | 'then' | 'catch'\n> & {\n result: { value: ColumnType<Result> };\n returnType: 'value';\n then: QueryThen<Result>;\n catch: QueryCatch<Result>;\n};\n\n// column info pulled from a database\nexport type ColumnInfo = {\n // default value of a column\n defaultValue: unknown;\n // column type\n type: string;\n // max length for the text types such as varchar\n maxLength: number | null;\n // is column nullable\n nullable: boolean;\n};\n\n// map database response for a column into a ColumnInfo\nconst rowToColumnInfo = (row: unknown): ColumnInfo => {\n const typed = row as {\n column_default: string | null;\n is_nullable: 'YES' | 'NO';\n data_type: string;\n character_maximum_length: number | null;\n };\n\n return {\n defaultValue: typed.column_default,\n type: typed.data_type,\n maxLength: typed.character_maximum_length,\n nullable: typed.is_nullable === 'YES',\n };\n};\n\nexport class ColumnInfoMethods {\n /**\n * Returns an object with the column info about the current table, or an individual column if one is passed, returning an object with the following keys:\n *\n * ```ts\n * type ColumnInfo = {\n * defaultValue: unknown; // the default value for the column\n * type: string; // the column type\n * maxLength: number | null; // the max length set for the column, present on string types\n * nullable: boolean; // whether the column may be null\n * };\n *\n * // columnInfo has type Record<string, ColumnInfo>, where string is name of columns\n * const columnInfo = await db.table.columnInfo();\n *\n * // singleColumnInfo has the type ColumnInfo\n * const singleColumnInfo = await db.table.columnInfo('name');\n * ```\n *\n * @param column - optional: select info for only a single column if provided, or for all table columns if not\n */\n columnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined = undefined,\n >(this: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n return this.clone()._columnInfo(column);\n }\n _columnInfo<\n T extends Query,\n Column extends keyof T['shape'] | undefined = undefined,\n >(this: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n this.q.type = 'columnInfo';\n this.q.returnType = 'all';\n\n if (column) {\n (this.q as ColumnInfoQueryData).column = column as string;\n }\n\n this.q.handleResult = (_, _t, result) => {\n if (column) {\n return rowToColumnInfo(result.rows[0]);\n } else {\n const info: Record<string, ColumnInfo> = {};\n result.rows.forEach((row) => {\n info[(row as { column_name: string }).column_name] =\n rowToColumnInfo(row);\n });\n return info;\n }\n };\n\n return this as unknown as SetQueryReturnsColumnInfo<T, Column>;\n }\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { CopyOptions } from '../sql';\n\n// argument of the `copy` function can accept various options\ntype CopyArg<T extends Query> = CopyOptions<keyof T['shape']>;\n\n// Result type for the `copy` method, simply setting a query kind.\ntype CopyResult<T extends Query> = SetQueryKind<T, 'copy'>;\n\nexport class CopyMethods {\n /**\n * `copy` is a method to invoke a `COPY` SQL statement, it can copy from or to a file or a program.\n *\n * Copying from `STDIN` or to `STDOUT` is not supported.\n *\n * It supports all the options of the `COPY` statement of Postgres. See details in [Postgres document](https://www.postgresql.org/docs/current/sql-copy.html).\n *\n * The copying is performed by the Postgres database server, and it must have access to the file.\n *\n * Type of copy argument:\n *\n * ```ts\n * export type CopyOptions<Column = string> = {\n * columns?: Column[];\n * format?: 'text' | 'csv' | 'binary';\n * freeze?: boolean;\n * delimiter?: string;\n * null?: string;\n * header?: boolean | 'match';\n * quote?: string;\n * escape?: string;\n * forceQuote?: Column[] | '*';\n * forceNotNull?: Column[];\n * forceNull?: Column[];\n * encoding?: string;\n * } & (\n * | {\n * from: string | { program: string };\n * }\n * | {\n * to: string | { program: string };\n * }\n * );\n * ```\n *\n * Example usage:\n *\n * ```ts\n * await db.table.copy({\n * columns: ['id', 'title', 'description'],\n * from: 'path-to-file',\n * });\n * ```\n * @param arg - object with copy options\n */\n copy<T extends Query>(this: T, arg: CopyArg<T>): CopyResult<T> {\n return this.clone()._copy(arg);\n }\n _copy<T extends Query>(this: T, arg: CopyArg<T>): CopyResult<T> {\n Object.assign(this.q, {\n type: 'copy',\n copy: arg,\n });\n return this as CopyResult<T>;\n }\n}\n","import {\n Query,\n QueryReturnsAll,\n queryTypeWithLimitOne,\n SetQueryKind,\n SetQueryReturns,\n SetQueryReturnsAll,\n SetQueryReturnsColumn,\n SetQueryReturnsOne,\n SetQueryReturnsPluckColumn,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n RelationConfigBase,\n RelationConfigDataForCreate,\n RelationsBase,\n} from '../relations';\nimport {\n CreateKind,\n InsertQueryData,\n OnConflictItem,\n OnConflictMergeUpdate,\n} from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape } from '../query/db';\nimport { Expression, StringKey, QueryThen, SetOptional } from 'orchid-core';\nimport { isSelectingCount } from './aggregate';\n\n// Type of argument for `create`, `createMany`, optional argument for `createFrom`,\n// `defaults` use a Partial of it.\n//\n// It maps `inputType` of the table into object to accept a corresponding type,\n// or raw SQL per column, or a sub-query for a column.\n//\n// It allows to omit `belongsTo` foreign keys when a `belongsTo` record is provided by a relation name.\n// For example, it allows to create with `db.book.create({ authorId: 123 })`\n// or with `db.book.create({ author: authorData })`\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type CreateData<\n T extends Query,\n Data = SetOptional<\n { [K in keyof T['inputType']]: CreateColumn<T, K> },\n T['meta']['defaults']\n >,\n> = [keyof T['relations']] extends [never]\n ? // if no relations, don't load TS with extra calculations\n Data\n : CreateRelationsData<T, T['relations'], Data>;\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<T extends Query, Key extends keyof T['inputType']> =\n | Expression\n | T['inputType'][Key]\n | {\n [K in keyof Query]: K extends 'then'\n ? QueryThen<T['inputType'][Key]>\n : Query[K];\n };\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<\n T extends Query,\n Relations extends RelationsBase,\n Data,\n> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n Omit<\n Data,\n Relations[keyof Relations]['relationConfig']['omitForeignKeyInCreate']\n > &\n // Intersection of objects for `belongsTo` relations:\n // ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\n CreateRelationsDataOmittingFKeys<T, Relations> &\n // Union of the rest relations objects, intersection is not needed here because there are no required properties:\n // { foo: object } | { bar: object }\n Relations[keyof Relations]['relationConfig']['optionalDataForCreate'];\n\n// Intersection of relations that may omit foreign key (belongsTo):\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateRelationsDataOmittingFKeys<\n T extends Query,\n Relations extends RelationsBase,\n // Collect a union of `belongsTo` relation objects.\n // Tuple is needed to preserve the inner union type of the object.\n Union extends [Record<string, unknown>] = {\n [K in keyof Relations]: CreateRelationDataOmittingFKeys<\n Relations[K]['relationConfig'],\n T['meta']['defaults']\n >;\n }[keyof Relations],\n> =\n // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (Union extends any ? (u: Union) => void : never) extends (\n u: [infer Obj],\n ) => void\n ? Obj\n : never;\n\n// Makes type for a `belongsTo` relation:\n// [{ fooId: number } | { foo: object }]\nexport type CreateRelationDataOmittingFKeys<\n RelationConfig extends RelationConfigBase,\n Defaults extends PropertyKey,\n Data extends\n | RelationConfigDataForCreate\n | undefined = RelationConfig['dataForCreate'],\n> = Data extends RelationConfigDataForCreate\n ? [\n keyof Data['columns'] extends Defaults\n ? Omit<Data['columns'], Defaults> & {\n [P in Defaults & keyof Data['columns']]?: Data['columns'][P];\n } & Partial<Data['nested']>\n : Data['columns'] | Data['nested'],\n ]\n : never;\n\n// `create` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype CreateResult<T extends Query> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<SetQueryKind<T, 'create'>, T['result']['pluck']>\n : SetQueryKind<T, 'create'>;\n\n// `insert` method output type\n// - query returns inserted row count by default.\n// - returns a record with selected columns if the query has a select.\n// - if the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype InsertResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<SetQueryKind<T, 'create'>, T['result']['pluck']>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'create'>>;\n\n// `createMany` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns a single record, forces it to return multiple.\n// - otherwise, query result remains as is.\ntype CreateManyResult<T extends Query> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumn<SetQueryKind<T, 'create'>, T['result']['value']>\n : SetQueryKind<T, 'create'>;\n\n// `insertMany` method output type\n// - query returns inserted row count by default.\n// - returns records with selected columns if the query has a select.\n// - if the query returns a single record, forces it to return multiple records.\ntype InsertManyResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<SetQueryKind<T, 'create'>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumn<\n SetQueryKind<T, 'create'>,\n T['result']['value']\n >\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'create'>>;\n\n// `onConflict().ignore()` method output type:\n// overrides query return type from 'oneOrThrow' to 'one', from 'valueOrThrow' to 'value',\n// because `ignore` won't return any data in case of a conflict.\ntype IgnoreResult<T extends Query> = T['returnType'] extends 'oneOrThrow'\n ? SetQueryReturns<T, 'one'>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturns<T, 'value'>\n : T;\n\n// `createRaw` method argument.\n// Contains array of columns and a raw SQL for values.\ntype CreateRawData<T extends Query> = {\n columns: (keyof T['shape'])[];\n values: Expression;\n};\n\n// `createManyRaw` method argument.\n// Contains array of columns and an array of raw SQL for values.\ntype CreateManyRawData<T extends Query> = {\n columns: (keyof T['shape'])[];\n values: Expression[];\n};\n\n// Record<(column name), true> where the column doesn't have a default, and it is not nullable.\ntype RawRequiredColumns<T extends Query> = {\n [K in keyof T['inputType'] as K extends T['meta']['defaults']\n ? never\n : null extends T['inputType'][K]\n ? never\n : undefined extends T['inputType'][K]\n ? never\n : K]: true;\n};\n\n// Arguments of `createRaw` and `createManyRaw`.\n// TS error if not all required columns are specified.\ntype CreateRawArgs<\n T extends Query,\n Arg extends { columns: (keyof T['shape'])[] },\n> = keyof RawRequiredColumns<T> extends Arg['columns'][number]\n ? [data: Arg]\n : [\n `Missing required columns: ${Exclude<\n StringKey<keyof RawRequiredColumns<T>>,\n Arg['columns'][number]\n >}`,\n ];\n\n// Argument of `onConflict`, can be:\n// - a column name\n// - an array of column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends Query> =\n | keyof T['shape']\n | (keyof T['shape'])[]\n | Expression;\n\nexport type AddQueryDefaults<T extends Query, Defaults extends PropertyKey> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'defaults'\n ? T['meta']['defaults'] | Defaults\n : T['meta'][K];\n }\n : T[K];\n};\n\n/**\n * Used by ORM to access the context of current create query.\n * Is passed to the `create` method of a {@link VirtualColumn}\n */\nexport type CreateCtx = {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: Record<string, unknown>[];\n};\n\n// Type of `encodeFn` of columns.\ntype Encoder = (input: unknown) => unknown;\n\n// Function called by all `create` methods to override query select.\n// Clears select if query returning nothing or a count.\n// Otherwise, selects all if query doesn't have select.\nconst createSelect = (q: Query) => {\n if (q.q.returnType === 'void' || isSelectingCount(q)) {\n q.q.select = undefined;\n } else if (!q.q.select) {\n q.q.select = ['*'];\n }\n};\n\n/**\n * Processes arguments of data to create.\n * If the passed key is for a {@link VirtualColumn}, calls `create` of the virtual column.\n * Otherwise, ignores keys that aren't relevant to the table shape,\n * collects columns to the `ctx.columns` set, collects columns encoders.\n *\n * @param q - query object.\n * @param item - argument of data to create.\n * @param rowIndex - index of record's data in `createMany` args array.\n * @param ctx - context of create query to be shared with a {@link VirtualColumn}.\n * @param encoders - to collect `encodeFn`s of columns.\n */\nconst processCreateItem = (\n q: Query,\n item: Record<string, unknown>,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: Record<string, Encoder>,\n) => {\n const { shape } = q.q;\n for (const key in item) {\n if (shape[key] instanceof VirtualColumn) {\n (shape[key] as VirtualColumn).create?.(q, ctx, item, rowIndex);\n } else if (\n !ctx.columns.has(key) &&\n ((shape[key] && !shape[key].data.computed) || shape === anyShape)\n ) {\n ctx.columns.set(key, ctx.columns.size);\n encoders[key] = shape[key]?.encodeFn as Encoder;\n }\n }\n};\n\n// Creates a new context of create query.\nconst createCtx = (): CreateCtx => ({\n columns: new Map(),\n resultAll: undefined as unknown as Record<string, unknown>[],\n});\n\n// Packs record values from the provided object into array of values.\n// Encode values when the column has an encoder.\nconst mapColumnValues = (\n columns: string[],\n encoders: Record<string, Encoder>,\n data: Record<string, unknown>,\n): unknown[] => {\n return columns.map((key) =>\n encoders[key] ? encoders[key](data[key]) : data[key],\n );\n};\n\n/**\n * Processes arguments of `create`, `insert`, `createFrom` and `insertFrom` when it has data.\n * Apply defaults that may be present on a query object to the data.\n * Maps data object into array of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - argument with data for create.\n * @param ctx - context of the create query.\n */\nconst handleOneData = (\n q: Query,\n data: Record<string, unknown>,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: Record<string, Encoder> = {};\n const defaults = q.q.defaults;\n\n if (defaults) {\n data = { ...defaults, ...data };\n }\n\n processCreateItem(q, data, 0, ctx, encoders);\n\n const columns = Array.from(ctx.columns.keys());\n const values = [mapColumnValues(columns, encoders, data)];\n\n return { columns, values };\n};\n\n/**\n * Processes arguments of `createMany`, `insertMany`.\n * Apply defaults that may be present on a query object to the data.\n * Maps data objects into array of arrays of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - arguments with data for create.\n * @param ctx - context of the create query.\n */\nconst handleManyData = (\n q: Query,\n data: Record<string, unknown>[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: Record<string, Encoder> = {};\n const defaults = q.q.defaults;\n\n if (defaults) {\n data = data.map((item) => ({ ...defaults, ...item }));\n }\n\n data.forEach((item, i) => {\n processCreateItem(q, item, i, ctx, encoders);\n });\n\n const values = Array(data.length);\n const columns = Array.from(ctx.columns.keys());\n\n data.forEach((item, i) => {\n (values as unknown[][])[i] = mapColumnValues(columns, encoders, item);\n });\n\n return { columns, values };\n};\n\n/**\n * Core function that is used by all `create` and `insert` methods.\n * Sets query `type` to `insert` for `toSQL` to know it's for inserting.\n * Sets query columns and values.\n * Sets query kind, which is checked by `update` method when returning a query from callback.\n * Overrides query return type according to what is current create method supposed to return.\n *\n * @param self - query object.\n * @param columns - columns list of all values.\n * @param values - array of arrays matching columns, or can be an array of SQL expressions, or is a special object for `createFrom`.\n * @param kind - the kind of create query, can be 'object', 'raw', 'from'.\n * @param many - whether it's for creating one or many.\n */\nconst insert = (\n self: Query,\n {\n columns,\n values,\n }: {\n columns: string[];\n values: InsertQueryData['values'];\n },\n kind: CreateKind,\n many?: boolean,\n) => {\n const { q } = self as { q: InsertQueryData };\n\n delete q.and;\n delete q.or;\n\n q.type = 'insert';\n q.columns = columns;\n q.values = values;\n\n // query kind may be already set by in the ORM\n // so that author.books.create(data) will actually perform the `from` kind of create\n if (!q.kind) q.kind = kind;\n\n const { select, returnType = 'all' } = q;\n\n if (!select) {\n if (returnType !== 'void') q.returnType = 'rowCount';\n } else if (many) {\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n q.returnType = 'all';\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n q.returnType = 'pluck';\n }\n } else if (returnType === 'all') {\n q.returnType = 'from' in values ? values.from.q.returnType : 'one';\n } else if (returnType === 'pluck') {\n q.returnType = 'valueOrThrow';\n }\n\n return self;\n};\n\n/**\n * Function to collect column names from the inner query of create `from` methods.\n *\n * @param from - inner query to grab the columns from.\n * @param obj - optionally passed object with specific data, only available when creating a single record.\n * @param many - whether it's for `createManyFrom`. If no, throws if the inner query returns multiple records.\n */\nconst getFromSelectColumns = (\n from: Query,\n obj?: { columns: string[] },\n many?: boolean,\n) => {\n if (!many && !queryTypeWithLimitOne[from.q.returnType]) {\n throw new Error(\n 'Cannot create based on a query which returns multiple records',\n );\n }\n\n const queryColumns: string[] = [];\n from.q.select?.forEach((item) => {\n if (typeof item === 'string') {\n const index = item.indexOf('.');\n queryColumns.push(index === -1 ? item : item.slice(index + 1));\n } else if ('selectAs' in item) {\n queryColumns.push(...Object.keys(item.selectAs));\n }\n });\n\n if (obj?.columns) {\n queryColumns.push(...obj.columns);\n }\n\n return queryColumns;\n};\n\n/**\n * Is used by all create from queries methods.\n * Collects columns and values from the inner query and optionally from the given data,\n * calls {@link insert} with a 'from' kind of create query.\n *\n * @param q - query object.\n * @param from - inner query from which to create new records.\n * @param many - whether creating many.\n * @param data - optionally passed custom data when creating a single record.\n */\nconst insertFromQuery = <\n T extends Query,\n Q extends Query,\n Many extends boolean,\n>(\n q: T,\n from: Q,\n many: Many,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n) => {\n const ctx = createCtx();\n\n const obj = data && handleOneData(q, data, ctx);\n\n const columns = getFromSelectColumns(from, obj, many);\n\n return insert(\n q,\n {\n columns,\n values: { from, values: obj?.values },\n },\n 'from',\n many,\n );\n};\n\n/**\n * Names of all create methods,\n * is used in {@link RelationQuery} to remove these methods if chained relation shouldn't have them,\n * for the case of has one/many through.\n */\nexport type CreateMethodsNames =\n | 'create'\n | '_create'\n | 'insert'\n | '_insert'\n | 'createMany'\n | '_createMany'\n | 'insertMany'\n | '_insertMany'\n | 'createRaw'\n | '_createRaw'\n | 'insertRaw'\n | '_insertRaw'\n | 'createFrom'\n | '_createFrom'\n | 'insertFrom'\n | '_insertFrom'\n | 'createManyFrom'\n | '_createManyFrom'\n | 'insertManyFrom'\n | '_insertManyFrom';\n\nexport class Create {\n /**\n * `create` and `insert` will create one record.\n *\n * Each column may accept a specific value, a raw SQL, or a query that returns a single value.\n *\n * ```ts\n * const oneRecord = await db.table.create({\n * name: 'John',\n * password: '1234',\n * });\n *\n * // When using `.onConflict().ignore()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflict().ignore();\n *\n * await db.table.create({\n * // raw SQL\n * column1: db.table.sql`'John' | 'Doe'`,\n *\n * // query that returns a single value\n * // returning multiple values will result in Postgres error\n * column2: db.otherTable.get('someColumn'),\n * });\n * ```\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n create<T extends Query>(this: T, data: CreateData<T>): CreateResult<T> {\n return this.clone()._create(data);\n }\n _create<T extends Query>(this: T, data: CreateData<T>): CreateResult<T> {\n createSelect(this);\n return this._insert(data) as unknown as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link create}, except that it returns inserted row count by default.\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n insert<T extends Query>(this: T, data: CreateData<T>): InsertResult<T> {\n return this.clone()._insert(data);\n }\n _insert<T extends Query>(this: T, data: CreateData<T>): InsertResult<T> {\n const ctx = createCtx();\n const obj = handleOneData(this, data, ctx) as {\n columns: string[];\n values: InsertQueryData['values'];\n };\n\n const values = (this.q as InsertQueryData).values;\n if (values && 'from' in values) {\n obj.columns = getFromSelectColumns(values.from, obj);\n values.values = obj.values as unknown[][];\n obj.values = values;\n }\n\n return insert(this, obj, 'object') as InsertResult<T>;\n }\n\n /**\n * `createMany` and `insertMany` will create a batch of records.\n *\n * Each column may be set with a specific value, a raw SQL, or a query, the same as in {@link create}.\n *\n * In case one of the objects has fewer fields, the `DEFAULT` SQL keyword will be placed in its place in the `VALUES` statement.\n *\n * ```ts\n * const manyRecords = await db.table.createMany([\n * { key: 'value', otherKey: 'other value' },\n * { key: 'value' }, // default will be used for `otherKey`\n * ]);\n *\n * // `createdCount` will be 3.\n * const createdCount = await db.table.insertMany([data, data, data]);\n * ```\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n return this.clone()._createMany(data);\n }\n _createMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n createSelect(this);\n return this._insertMany(data) as unknown as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createMany}, except that it returns inserted row count by default.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n insertMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n return this.clone()._insertMany(data);\n }\n _insertMany<T extends Query>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n const ctx = createCtx();\n return insert(\n this,\n handleManyData(this, data, ctx),\n 'object',\n true,\n ) as InsertManyResult<T>;\n }\n\n /**\n * `createRaw` and `insertRaw` are for creating one record with a raw SQL expression.\n *\n * Provided SQL will be wrapped into parens for a single `VALUES` record.\n *\n * If the table has a column with runtime defaults (defined with callbacks), the value will be appended to your SQL.\n *\n * `columns` are type-checked to contain all required columns.\n *\n * ```ts\n * const oneRecord = await db.table.createRaw({\n * columns: ['name', 'amount'],\n * values: db.table.sql`'name', random()`,\n * });\n * ```\n *\n * @param args - object with columns list and raw SQL for values\n */\n createRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._createRaw(args[0] as any);\n }\n _createRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateResult<T> {\n createSelect(this);\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link createRaw}, except that it returns inserted row count by default.\n *\n * @param args - object with columns list and raw SQL for values\n */\n insertRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._insertRaw(args[0] as any);\n }\n _insertRaw<T extends Query, Arg extends CreateRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertResult<T> {\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as InsertResult<T>;\n }\n\n /**\n * `createManyRaw` and `insertManyRaw` are for creating many record with raw SQL expressions.\n *\n * Takes array of SQL expressions, each of them will be wrapped into parens for `VALUES` records.\n *\n * If the table has a column with runtime defaults (defined with callbacks), function will be called for each SQL and the value will be appended.\n *\n * `columns` are type-checked to contain all required columns.\n *\n * ```ts\n * const manyRecords = await db.table.createManyRaw({\n * columns: ['name', 'amount'],\n * values: [db.table.sql`'one', 2`, db.table.sql`'three', 4`],\n * });\n * ```\n *\n * @param args - object with columns list and array of raw SQL for values\n */\n createManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateManyResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._createManyRaw(args[0] as any);\n }\n _createManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): CreateManyResult<T> {\n createSelect(this);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._insertManyRaw(args[0] as any) as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createManyRaw}, except that it returns inserted row count by default.\n *\n * @param args - object with columns list and array of raw SQL for values\n */\n insertManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertManyResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._insertManyRaw(args[0] as any);\n }\n _insertManyRaw<T extends Query, Arg extends CreateManyRawData<T>>(\n this: T,\n ...args: CreateRawArgs<T, Arg>\n ): InsertManyResult<T> {\n return insert(\n this,\n args[0] as { columns: string[]; values: Expression[] },\n 'raw',\n true,\n ) as InsertManyResult<T>;\n }\n\n /**\n * These methods are for creating a single record, for batch creating see {@link createManyFrom}.\n *\n * `createFrom` is to perform the `INSERT ... SELECT ...` SQL statement, it does select and insert by performing a single query.\n *\n * The first argument is a query for a **single** record, it should have `find`, `take`, or similar.\n *\n * The second optional argument is a data which will be merged with columns returned from the select query.\n *\n * The data for the second argument is the same as in {@link create}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const oneRecord = await db.table.createFrom(\n * // In the select, key is a related table column, value is a column to insert as\n * RelatedTable.select({ relatedId: 'id' }).findBy({ key: 'value' }),\n * // optional argument:\n * {\n * key: 'value',\n * },\n * );\n * ```\n *\n * The query above will produce such SQL:\n *\n * ```sql\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n createFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): CreateResult<T> {\n return this.clone()._createFrom(query, data);\n }\n _createFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): CreateResult<T> {\n createSelect(this);\n return insertFromQuery(this, query, false, data) as CreateResult<T>;\n }\n\n /**\n * Works exactly as {@link createFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n insertFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): InsertResult<T> {\n return this.clone()._insertFrom(query, data);\n }\n _insertFrom<\n T extends Query,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): InsertResult<T> {\n return insertFromQuery(this, query, false, data) as InsertResult<T>;\n }\n\n /**\n * Similar to `createFrom`, but intended to create many records.\n *\n * Unlike `createFrom`, it doesn't accept second argument with data, and runtime defaults cannot work with it.\n *\n * ```ts\n * const manyRecords = await db.table.createManyFrom(\n * RelatedTable.select({ relatedId: 'id' }).where({ key: 'value' }),\n * );\n * ```\n *\n * @param query - query to create new records from\n */\n createManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): CreateManyResult<T> {\n return this.clone()._createManyFrom(query);\n }\n _createManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): CreateManyResult<T> {\n createSelect(this);\n return insertFromQuery(this, query, true) as CreateManyResult<T>;\n }\n\n /**\n * Works exactly as {@link createManyFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n */\n insertManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): InsertManyResult<T> {\n return this.clone()._insertManyFrom(query);\n }\n _insertManyFrom<T extends Query, Q extends Query>(\n this: T,\n query: Q,\n ): InsertManyResult<T> {\n return insertFromQuery(this, query, true) as InsertManyResult<T>;\n }\n\n /**\n * `defaults` allows setting values that will be used later in `create`.\n *\n * Columns provided in `defaults` are marked as optional in the following `create`.\n *\n * Default data is the same as in [create](#create) and [createMany](#createMany),\n * so you can provide a raw SQL, or a query with a query.\n *\n * ```ts\n * // Will use firstName from defaults and lastName from create argument:\n * db.table\n * .defaults({\n * firstName: 'first name',\n * lastName: 'last name',\n * })\n * .create({\n * lastName: 'override the last name',\n * });\n * ```\n *\n * @param data - default values for `create` and `createMany` which will follow `defaults`\n */\n defaults<T extends Query, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n return (this.clone() as T)._defaults(data);\n }\n _defaults<T extends Query, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n this.q.defaults = data;\n return this as AddQueryDefaults<T, keyof Data>;\n }\n\n /**\n * A modifier for creating queries that specify alternative behavior in the case of a conflict.\n * A conflict occurs when a table has a `PRIMARY KEY` or a `UNIQUE` index on a column\n * (or a composite index on a set of columns) and a row being created has the same value as a row\n * that already exists in the table in this column(s).\n * The default behavior in case of conflict is to raise an error and abort the query.\n *\n * Use `onConflict` to either ignore the error by using `.onConflict().ignore()`,\n * or to update the existing row with new data (perform an \"UPSERT\") by using `.onConflict().merge()`.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflict().ignore();\n *\n * // single column:\n * db.table.create(data).onConfict('email');\n *\n * // array of columns:\n * db.table.create(data).onConfict(['email', 'name']);\n *\n * // raw expression:\n * db.table.create(data).onConfict(db.table.sql`(email) where condition`);\n * ```\n *\n * ::: info\n * The column(s) given to the `onConflict` must either be the table's PRIMARY KEY or have a UNIQUE index on them, or the query will fail to execute.\n * When specifying multiple columns, they must be a composite PRIMARY KEY or have a composite UNIQUE index.\n *\n * You can use the db.table.sql function in onConflict.\n * It can be useful to specify a condition when you have a partial index:\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * active: true,\n * })\n * // ignore only when having conflicting email and when active is true.\n * .onConflict(db.table.sql`(email) where active`)\n * .ignore();\n * ```\n *\n * :::\n *\n * See the documentation on the .ignore() and .merge() methods for more details.\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends Query, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return this.clone()._onConflict(arg);\n }\n _onConflict<\n T extends Query,\n Arg extends OnConflictArg<T> | undefined = undefined,\n >(this: T, arg?: Arg): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as Arg);\n }\n}\n\nexport class OnConflictQueryBuilder<\n T extends Query,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(private query: T, private onConflict: Arg) {}\n\n /**\n * Available only after `onConflict`.\n *\n * `ignore` modifies a create query, and causes it to be silently dropped without an error if a conflict occurs.\n *\n * Adds the `ON CONFLICT (columns) DO NOTHING` clause to the insert statement.\n *\n * It produces `ON CONFLICT DO NOTHING` when no `onConflict` argument provided.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * .onConflict('email')\n * .ignore();\n * ```\n *\n *\n * When there is a conflict, nothing can be returned from the database, that's why `ignore` has to add `| undefined` part to the response type.\n *\n * `create` returns a full record by default, it becomes `RecordType | undefined` after applying `ignore`.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflict()\n * .ignore();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflict()\n * .ignore();\n * ```\n *\n * When creating many records, only the created records will be returned. If no records were created, array will be empty:\n *\n * ```ts\n * // array can be empty\n * const arr = await db.table.createMany([data, data, data]).onConflict().ignore();\n * ```\n */\n ignore(): IgnoreResult<T> {\n const q = this.query;\n (q.q as InsertQueryData).onConflict = {\n type: 'ignore',\n expr: this.onConflict as OnConflictItem,\n };\n\n if (q.q.returnType === 'oneOrThrow') {\n q.q.returnType = 'one';\n } else if (q.q.returnType === 'valueOrThrow') {\n q.q.returnType = 'value';\n }\n\n return q as IgnoreResult<T>;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Modifies a create query, to turn it into an 'upsert' operation.\n *\n * Adds an `ON CONFLICT (columns) DO UPDATE` clause to the insert statement.\n *\n * When no `onConflict` argument provided,\n * it will automatically collect all table columns that have unique index and use them as a conflict target.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * .onConflict('email')\n * .merge();\n * ```\n *\n * This also works with batch creates:\n *\n * ```ts\n * db.table\n * .createMany([\n * { email: 'john@example.com', name: 'John Doe' },\n * { email: 'jane@example.com', name: 'Jane Doe' },\n * { email: 'alex@example.com', name: 'Alex Doe' },\n * ])\n * .onConflict('email')\n * .merge();\n * ```\n *\n * It is also possible to specify a subset of the columns to merge when a conflict occurs.\n * For example, you may want to set a `createdAt` column when creating but would prefer not to update it if the row already exists:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * // string argument for a single column:\n * .merge('email')\n * // array of strings for multiple columns:\n * .merge(['email', 'name', 'updatedAt']);\n * ```\n *\n * It is also possible to specify data to update separately from the data to create.\n * This is useful if you want to make an update with different data than in creating.\n * For example, you may want to change a value if the row already exists:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * .merge({\n * name: 'John Doe The Second',\n * });\n * ```\n *\n * It is also possible to add a WHERE clause to conditionally update only the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * createdAt: timestamp,\n * updatedAt: timestamp,\n * })\n * .onConflict('email')\n * .merge({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * `merge` also accepts raw expression:\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict()\n * .merge(db.table.sql`raw SQL expression`);\n * ```\n *\n * @param update - column, or array of columns, or object for new column values, or raw SQL\n */\n merge(\n update?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | Partial<T['inputType']>\n | Expression,\n ): T {\n (this.query.q as InsertQueryData).onConflict = {\n type: 'merge',\n expr: this.onConflict as OnConflictItem,\n update: update as OnConflictMergeUpdate,\n };\n return this.query;\n }\n}\n","import { Query, SetQueryKind, SetQueryReturnsRowCount } from '../query/query';\nimport { throwIfNoWhere } from '../query/queryUtils';\n\nexport type DeleteMethodsNames = 'del' | '_del' | 'delete' | '_delete';\n\ntype DeleteArgs<T extends Query> = T['meta']['hasWhere'] extends true\n ? []\n : [never];\n\ntype DeleteResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'delete'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'delete'>>;\n\nconst del = <T extends Query>(self: T): DeleteResult<T> => {\n return _del(self.clone()) as unknown as DeleteResult<T>;\n};\n\nconst _del = <T extends Query>(q: T): DeleteResult<T> => {\n if (!q.q.select) {\n q.q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(q, 'delete');\n\n q.q.type = 'delete';\n return q as unknown as DeleteResult<T>;\n};\n\nexport class Delete {\n /**\n * Alias for `delete` method\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n del<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return del(this);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _del<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return _del(this);\n }\n\n /**\n * It is aliased to `del` because `delete` is a reserved word in JavaScript.\n *\n * This method deletes one or more rows, based on other conditions specified in the query.\n *\n * By default, `delete` will return a count of deleted records.\n *\n * Place `select`, `selectAll`, or `get` before `delete` to specify returning columns.\n *\n * Need to provide `where`, `findBy`, or `find` conditions before calling `delete`.\n * To prevent accidental deletion of all records, deleting without where will result in TypeScript and a runtime error.\n *\n * Use `all()` to delete ALL records without conditions:\n *\n * ```ts\n * await db.table.all().delete();\n * ```\n *\n * ```ts\n * // deletedCount is the number of deleted records\n * const deletedCount = await db.table.where(...conditions).delete();\n *\n * // returns a single value, throws if not found\n * const id: number | undefined = await db.table\n * .findBy(...conditions)\n * .get('id')\n * .delete();\n *\n * // returns an array of records with specified columns\n * const deletedRecord = await db.table\n * .select('id', 'name', 'age')\n * .where(...conditions)\n * .delete();\n *\n * // returns an array of fully deleted records\n * const deletedUsersFull = await db.table\n * .selectAll()\n * .where(...conditions)\n * .delete();\n * ```\n *\n * `delete` supports joining, under the hood the join is transformed to `USING` and `WHERE` statements:\n *\n * ```ts\n * // delete all users who have corresponding profile records:\n * db.table.join(Profile, 'profile.userId', 'user.id').all().delete();\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return del(this);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _delete<T extends Query>(this: T, ..._args: DeleteArgs<T>): DeleteResult<T> {\n return _del(this);\n }\n}\n","import { Query } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { Expression } from 'orchid-core';\nimport { extendQuery } from '../query/queryUtils';\n\ntype ForQueryBuilder<Q extends Query> = Q & {\n noWait<T extends ForQueryBuilder<Q>>(this: T): T;\n _noWait<T extends ForQueryBuilder<Q>>(this: T): T;\n skipLocked<T extends ForQueryBuilder<Q>>(this: T): T;\n _skipLocked<T extends ForQueryBuilder<Q>>(this: T): T;\n};\n\nconst forMethods = {\n noWait<T extends ForQueryBuilder<Query>>(this: T): T {\n return this.clone()._noWait();\n },\n _noWait<T extends ForQueryBuilder<Query>>(this: T): T {\n const q = this.q as SelectQueryData | undefined;\n if (q?.for) q.for.mode = 'NO WAIT';\n return this;\n },\n skipLocked<T extends ForQueryBuilder<Query>>(this: T): T {\n return this.clone()._skipLocked();\n },\n _skipLocked<T extends ForQueryBuilder<Query>>(this: T): T {\n const q = this.q as SelectQueryData | undefined;\n if (q?.for) q.for.mode = 'SKIP LOCKED';\n return this;\n },\n};\n\n// Extends the query with `for` methods, the query is cloned, and sets `for` data.\nconst forQueryBuilder = <T extends Query>(\n q: T,\n type: Exclude<SelectQueryData['for'], undefined>['type'],\n tableNames?: string[] | Expression,\n) => {\n q = extendQuery(q, forMethods);\n\n (q.q as SelectQueryData).for = {\n type,\n tableNames,\n };\n\n return q as ForQueryBuilder<T>;\n};\n\nexport class For {\n forUpdate<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'UPDATE', tableNames);\n }\n\n forNoKeyUpdate<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'NO KEY UPDATE', tableNames);\n }\n\n forShare<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'SHARE', tableNames);\n }\n\n forKeyShare<T extends Query>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'KEY SHARE', tableNames);\n }\n}\n","import { Query } from '../../query/query';\nimport { ColumnsParsers, ColumnsShapeBase } from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { RelationQueryBase } from '../../relations';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport {\n JoinArgs,\n JoinCallback,\n JoinFirstArg,\n JoinLateralCallback,\n JoinLateralResult,\n JoinResult,\n} from './join';\nimport { getQueryAs } from '../../common/utils';\nimport { QueryBase } from '../../query/queryBase';\n\n/**\n * Generic function to construct all JOIN queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param q - query object to join to\n * @param require - true for INNER kind of JOIN\n * @param type - SQL of the JOIN kind: JOIN, LEFT JOIN, RIGHT JOIN, etc.\n * @param args - join arguments to join a query, or `with` table, or a callback returning a query, etc.\n */\nexport const _join = <\n T extends Query,\n Arg extends JoinFirstArg<T>,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n Args extends JoinArgs<T, Arg>,\n>(\n q: T,\n require: RequireJoined,\n type: string,\n args: [arg: Arg, ...args: Args] | [arg: Arg, cb: JoinCallback<T, Arg>],\n): JoinResult<T, Arg, RequireJoined, RequireMain> => {\n let joinKey: string | undefined;\n let shape: ColumnsShapeBase | undefined;\n let parsers: ColumnsParsers | undefined;\n let isSubQuery = false;\n\n if (typeof args[0] === 'function') {\n args[0] = (args[0] as (q: Record<string, Query>) => Arg)(q.relations);\n (\n args[0] as unknown as { joinQueryAfterCallback: unknown }\n ).joinQueryAfterCallback = (\n args[0] as unknown as { joinQuery: unknown }\n ).joinQuery;\n }\n\n const first = args[0];\n\n if (typeof first === 'object') {\n isSubQuery = getIsJoinSubQuery(first.q, first.baseQuery.q);\n\n joinKey = first.q.as || first.table;\n if (joinKey) {\n shape = getShapeFromSelect(first, isSubQuery);\n parsers = first.q.parsers;\n\n if (isSubQuery) {\n args[0] = first.clone() as Arg;\n (args[0] as Query).shape = shape as ColumnsShapeBase;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = q.relations[joinKey];\n if (relation) {\n shape = getShapeFromSelect(relation.relationConfig.query);\n parsers = relation.relationConfig.query.q.parsers;\n } else {\n shape = q.q.withShapes?.[joinKey];\n if (shape) {\n // clone the shape to mutate it below, in other cases the shape is newly created\n if (!require) shape = { ...shape };\n\n parsers = {} as ColumnsParsers;\n for (const key in shape) {\n const parser = shape[key].parseFn;\n if (parser) {\n parsers[key] = parser;\n }\n }\n }\n }\n }\n\n if (joinKey) {\n setQueryObjectValue(q, 'joinedShapes', joinKey, shape);\n setQueryObjectValue(q, 'joinedParsers', joinKey, parsers);\n }\n\n return pushQueryValue(q, 'join', {\n type,\n args,\n isSubQuery,\n }) as unknown as JoinResult<T, Arg, RequireJoined, RequireMain>;\n};\n\n/**\n * Generic function to construct all JOIN LATERAL queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param q - query object to join to\n * @param type - SQL of the JOIN kind: JOIN or LEFT JOIN\n * @param arg - join target: a query, or a relation name, or a `with` table name, or a callback returning a query.\n * @param cb - callback where you can use `on` to join by columns, select needed data from the joined table, add where conditions, etc.\n * @param as - alias of the joined table, it is set the join lateral happens when selecting a relation in `select`\n */\nexport const _joinLateral = <\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n RequireJoined extends boolean,\n>(\n q: T,\n type: string,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n as?: string,\n): JoinLateralResult<T, R, RequireJoined> => {\n let relation: RelationQueryBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = relation.relationConfig.query as Arg;\n } else {\n const shape = q.q.withShapes?.[arg];\n if (shape) {\n const t = Object.create(q.queryBuilder);\n t.table = arg;\n t.shape = shape;\n t.q = {\n ...t.q,\n shape,\n };\n t.baseQuery = t;\n arg = t as Arg;\n }\n }\n }\n\n const query = arg as Query;\n query.q.joinTo = q;\n (query.q.joinedShapes ??= {})[getQueryAs(q)] = q.q.shape;\n let result = cb(query as never);\n\n if (relation) {\n result = relation.relationConfig.joinQuery(\n q,\n result as unknown as Query,\n ) as unknown as R;\n }\n\n const joinKey = as || result.q.as || result.table;\n if (joinKey) {\n const shape = getShapeFromSelect(result, true);\n setQueryObjectValue(q, 'joinedShapes', joinKey, shape);\n setQueryObjectValue(q, 'joinedParsers', joinKey, result.q.parsers);\n }\n\n return pushQueryValue(q, 'join', [\n type,\n result,\n as || getQueryAs(result),\n ]) as JoinLateralResult<T, R, RequireJoined>;\n};\n","import { GetQueryResult, Query, QueryReturnsAll } from '../query/query';\nimport {\n ArrayOfColumnsObjects,\n ColumnsObject,\n JSONTextColumn,\n PluckResultColumnType,\n} from '../columns';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { SelectItem, SelectQueryData } from '../sql';\nimport { QueryResult } from '../adapter';\nimport {\n applyTransforms,\n ColumnsShapeBase,\n ColumnTypeBase,\n emptyArray,\n Expression,\n getValueKey,\n isExpression,\n NullableColumn,\n QueryCatch,\n QueryThen,\n setColumnData,\n setParserToQuery,\n StringKey,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { _joinLateral } from './join/_join';\nimport {\n resolveSubQueryCallback,\n SelectableOrExpression,\n} from '../common/utils';\nimport { RawSQL } from '../sql/rawSql';\n\n// .select method argument.\nexport type SelectArg<T extends Query> = '*' | keyof T['selectable'];\n\n// .select method object argument.\n// Key is alias for selected item,\n// value can be a column, raw, or a function returning query or raw.\ntype SelectAsArg<T extends Query> = Record<string, SelectAsValue<T>>;\n\n// .select method object argument value.\n// Can be column, raw, or a function returning query or raw.\ntype SelectAsValue<T extends Query> =\n | StringKey<keyof T['selectable']>\n | Expression\n | ((q: SelectSubQueryArg<T>) => QueryBase | Expression);\n\ntype SelectSubQueryArg<T extends Query> = {\n [K in keyof T]: K extends keyof T['relations']\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T[K] extends (...args: any) => any\n ? ReturnType<T[K]>\n : T[K]\n : T[K];\n};\n\n// Result type of select without the ending object argument.\ntype SelectResult<\n T extends Query,\n Columns extends SelectArg<T>[],\n Result extends ColumnsShapeBase = {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | PrevResultKeys<T> as K extends keyof T['selectable']\n ? T['selectable'][K]['as']\n : K]: K extends keyof T['selectable']\n ? T['selectable'][K]['column']\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? SetMetaHasSelect<T>\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n// Result type of select with the ending object argument.\ntype SelectResultWithObj<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n Result extends ColumnsShapeBase = {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj\n | PrevResultKeys<T> as K extends keyof T['selectable']\n ? T['selectable'][K]['as']\n : K]: K extends keyof T['selectable']\n ? T['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? SetMetaHasSelect<T>\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : K extends 'selectable'\n ? SelectAsSelectable<T, Obj>\n : T[K];\n};\n\n// Previous result keys to preserve, if the query has select.\ntype PrevResultKeys<T extends Query> = T['meta']['hasSelect'] extends true\n ? keyof T['result']\n : never;\n\n// Merge { hasSelect: true } into 'meta' if it's not true yet.\ntype SetMetaHasSelect<T extends Query> = T['meta']['hasSelect'] extends true\n ? T['meta']\n : {\n [K in keyof T['meta'] | 'hasSelect']: K extends 'hasSelect'\n ? true\n : T['meta'][K];\n };\n\n// Add new 'selectable' types based on the select object argument.\ntype SelectAsSelectable<T extends Query, Arg extends SelectAsArg<T>> = {\n [K in keyof Arg]: Arg[K] extends ((q: never) => infer R extends QueryBase)\n ? // turn union of objects into intersection\n // https://stackoverflow.com/questions/66445084/intersection-of-an-objects-value-types-in-typescript\n (x: {\n [C in keyof R['result'] as `${StringKey<K>}.${StringKey<C>}`]: {\n as: C;\n column: R['result'][C];\n };\n }) => void\n : never;\n}[keyof Arg] extends (x: infer I) => void\n ? {\n [K in keyof T['selectable'] | keyof I]: K extends keyof I\n ? I[K]\n : T['selectable'][K];\n }\n : never;\n\n// map a single value of select object arg into a column\ntype SelectAsValueResult<\n T extends Query,\n Arg extends SelectAsValue<T>,\n> = Arg extends keyof T['selectable']\n ? T['selectable'][Arg]['column']\n : Arg extends Expression\n ? Arg['_type']\n : Arg extends (q: never) => infer R\n ? R extends QueryBase\n ? SelectSubQueryResult<R>\n : R extends Expression\n ? R['_type']\n : R extends QueryBase | Expression\n ?\n | SelectSubQueryResult<Exclude<R, Expression>>\n | Exclude<R, QueryBase>['_type']\n : never\n : never;\n\n// map a sub query result into a column\n// query that returns many becomes an array column\n// query that returns a single value becomes a column of that value\n// query that returns 'pluck' becomes a column with array type of specific value type\n// query that returns a single record becomes an object column, possibly nullable\nexport type SelectSubQueryResult<Arg extends QueryBase> = QueryReturnsAll<\n Arg['returnType']\n> extends true\n ? ArrayOfColumnsObjects<Arg['result']>\n : Arg['returnType'] extends 'valueOrThrow'\n ? Arg['result']['value']\n : Arg['returnType'] extends 'pluck'\n ? PluckResultColumnType<Arg['result']['pluck']>\n : Arg extends { relationConfig: { required: true } }\n ? ColumnsObject<Arg['result']>\n : NullableColumn<ColumnsObject<Arg['result']>>;\n\n// add a parser for a raw expression column\n// is used by .select and .get methods\nexport const addParserForRawExpression = (\n q: Query,\n key: string | getValueKey,\n raw: Expression,\n) => {\n if (raw._type.parseFn) setParserToQuery(q.q, key, raw._type.parseFn);\n};\n\n// these are used as a wrapper to pass sub query result to `parseRecord`\nconst subQueryResult: QueryResult = {\n // sub query can't return a rowCount, use -1 as for impossible case\n rowCount: -1,\n rows: emptyArray,\n fields: emptyArray,\n};\n\n// add parsers when selecting a full joined table by name or alias\nconst addParsersForSelectJoined = (\n q: Query,\n arg: string,\n as: string | getValueKey = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (item) => {\n subQueryResult.rows = [item];\n return q.q.handleResult(q, 'one', subQueryResult, true);\n });\n }\n};\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends Query>(\n q: T,\n as: string | getValueKey | undefined,\n key: string,\n arg: SelectableOrExpression<T> | Query,\n): string | Expression | Query => {\n if (typeof arg === 'object' || typeof arg === 'function') {\n if (isExpression(arg)) {\n addParserForRawExpression(q, key, arg);\n } else {\n const { q: query } = arg;\n if (query.parsers || query.transform) {\n setParserToQuery(q.q, key, (item) => {\n const t = query.returnType || 'all';\n subQueryResult.rows =\n t === 'value' || t === 'valueOrThrow'\n ? [[item]]\n : t === 'one' || t === 'oneOrThrow'\n ? [item]\n : (item as unknown[]);\n\n return applyTransforms(\n query.transform,\n query.handleResult(arg, t, subQueryResult, true),\n );\n });\n }\n }\n } else {\n setParserForSelectedString(q, arg, as, key);\n }\n\n return arg;\n};\n\n// reuse SQL for empty array for JSON agg expressions\nconst emptyArrSQL = new RawSQL(\"'[]'\");\n\n// process select argument: add parsers, join relations when needed\nexport const processSelectArg = <T extends Query>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string | getValueKey,\n): SelectItem => {\n if (typeof arg === 'string') {\n setParserForSelectedString(q, arg, as, columnAs);\n return arg;\n }\n\n const selectAs: Record<string, string | Query | Expression> = {};\n\n for (const key in arg as unknown as SelectAsArg<T>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let value = (arg as unknown as SelectAsArg<T>)[key] as any;\n\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q, value);\n\n if (!isExpression(value) && value.joinQuery) {\n value = value.joinQuery(q, value);\n\n let query;\n const returnType = value.q.returnType;\n if (!returnType || returnType === 'all') {\n query = value.json(false);\n value.q.coalesceValue = emptyArrSQL;\n } else if (returnType === 'pluck') {\n query = value\n .wrap(value.baseQuery.clone())\n .jsonAgg(value.q.select[0]);\n\n value.q.coalesceValue = emptyArrSQL;\n } else {\n if (\n (returnType === 'value' || returnType === 'valueOrThrow') &&\n value.q.select\n ) {\n // todo: investigate what is this for\n if (typeof value.q.select[0] === 'string') {\n value.q.select[0] = {\n selectAs: { r: value.q.select[0] },\n };\n }\n }\n\n query = value;\n }\n\n let asOverride = key;\n\n if (value.q.joinedShapes?.[key]) {\n let suffix = 2;\n const joinOverrides = (q.q.joinOverrides ??= {});\n while (joinOverrides[(asOverride = `${key}${suffix}`)]) {\n suffix++;\n }\n // aliases points to a table in a query\n joinOverrides[asOverride] = asOverride;\n // table name points to an alias\n joinOverrides[key] = asOverride;\n }\n\n value.q.joinedForSelect = asOverride;\n\n _joinLateral(\n q,\n value.q.innerJoinLateral ? 'JOIN' : 'LEFT JOIN',\n query,\n (q) => q,\n key,\n );\n } else if (value.q?.isSubQuery && value.q.expr) {\n value = value.q.expr;\n }\n }\n\n selectAs[key] = addParserForSelectItem(q, as, key, value);\n }\n\n return { selectAs };\n};\n\n// process string select arg\n// adds a column parser for a column\n// when table.* string is provided, sets a parser for a joined table\nexport const setParserForSelectedString = (\n q: Query,\n arg: string,\n as: string | getValueKey | undefined,\n columnAs?: string | getValueKey,\n): void => {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n\n // 'table.*' is selecting a full joined record\n if (column === '*') {\n addParsersForSelectJoined(q, table, columnAs);\n } else {\n if (table === as) {\n const parser = q.q.parsers?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n } else {\n const parser = q.q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n }\n }\n } else {\n const parser = q.q.parsers?.[arg];\n if (parser) setParserToQuery(q.q, columnAs || arg, parser);\n }\n};\n\n// is mapping result of a query into a columns shape\n// in this way, result of a sub query becomes available outside of it for using in WHERE and other methods\n//\n// when isSubQuery is true, it will remove data.name of columns,\n// so that outside of the sub-query the columns are named with app-side names,\n// while db column names are encapsulated inside the sub-query\nexport const getShapeFromSelect = (q: QueryBase, isSubQuery?: boolean) => {\n const query = q.q as SelectQueryData;\n const { select, shape } = query;\n let result: ColumnsShapeBase;\n if (!select) {\n // when no select, and it is a sub-query, return the table shape with unnamed columns\n if (isSubQuery) {\n result = {};\n for (const key in shape) {\n const column = shape[key];\n result[key] = column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n }\n } else {\n result = shape;\n }\n } else {\n result = {};\n for (const item of select) {\n if (typeof item === 'string') {\n addColumnToShapeFromSelect(q, item, shape, query, result, isSubQuery);\n } else if ('selectAs' in item) {\n for (const key in item.selectAs) {\n const it = item.selectAs[key];\n if (typeof it === 'string') {\n addColumnToShapeFromSelect(\n q,\n it,\n shape,\n query,\n result,\n isSubQuery,\n key,\n );\n } else if (isExpression(it)) {\n result[key] = it._type;\n } else {\n const { returnType } = it.q;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n const type = (it.q as SelectQueryData)[getValueKey];\n if (type) result[key] = type;\n } else {\n result[key] = new JSONTextColumn();\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\n// converts selected items into a shape of columns\n// when `isSubQuery` is true, it un-names named columns\nconst addColumnToShapeFromSelect = (\n q: QueryBase,\n arg: string,\n shape: ColumnsShapeBase,\n query: SelectQueryData,\n result: ColumnsShapeBase,\n isSubQuery?: boolean,\n key?: string,\n) => {\n if (q.relations[arg] as unknown as boolean) {\n result[key || arg] = new JSONTextColumn();\n return;\n }\n\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n if (table === (q.q.as || q.table)) {\n result[key || column] = shape[column];\n } else {\n const it = query.joinedShapes?.[table]?.[column];\n if (it) result[key || column] = maybeUnNameColumn(it, isSubQuery);\n }\n } else if (arg === '*') {\n for (const key in shape) {\n result[key] = maybeUnNameColumn(shape[key], isSubQuery);\n }\n } else {\n result[key || arg] = maybeUnNameColumn(shape[arg], isSubQuery);\n }\n};\n\n// un-name a column if `isSubQuery` is true\nconst maybeUnNameColumn = (column: ColumnTypeBase, isSubQuery?: boolean) => {\n return isSubQuery && column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n};\n\nexport class Select {\n /**\n * Takes a list of columns to be selected, and by default, the query builder will select all columns of the table.\n *\n * The last argument can be an object. Keys of the object are column aliases, value can be a column name, sub-query, or raw SQL expression.\n *\n * ```ts\n * // select columns of the table:\n * db.table.select('id', 'name', { idAlias: 'id' });\n *\n * // accepts columns with table names:\n * db.table.select('user.id', 'user.name', { nameAlias: 'user.name' });\n *\n * // table name may refer to the current table or a joined table:\n * db.table\n * .join(Message, 'authorId', 'id')\n * .select('user.name', 'message.text', { textAlias: 'message.text' });\n *\n * // select value from the sub-query,\n * // this sub-query should return a single record and a single column:\n * db.table.select({\n * subQueryResult: Otherdb.table.select('column').take(),\n * });\n *\n * // select raw SQL value, the first argument of `raw` is a column type, it is used for return type of the query\n * db.table.select({\n * raw: db.table.sql((t) => t.integer())`1 + 2`,\n * });\n *\n * // same raw SQL query as above, but raw value is returned from a callback\n * db.table.select({\n * raw: (q) => q.sql((t) => t.integer())`1 + 2`,\n * });\n * ```\n *\n * When you use the ORM and defined relations, `select` can also accept callbacks with related table queries:\n *\n * ```ts\n * await db.author.select({\n * allBooks: (q) => q.books,\n * firstBook: (q) => q.books.order({ createdAt: 'ASC' }).take(),\n * booksCount: (q) => q.books.count(),\n * });\n * ```\n *\n * When you're selecting a relation that's connected via `belongsTo` or `hasOne`, it becomes available to use in `order` or in `where`:\n *\n * ```ts\n * // select books with their authors included, order by author name and filter by author column:\n * await db.books\n * .select({\n * author: (q) => q.author,\n * })\n * .order('author.name')\n * .where({ 'author.isPopular': true });\n * ```\n */\n select<T extends Query, Columns extends SelectArg<T>[]>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n select<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultWithObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(this: Query, ...args: any[]) {\n return this.clone()._select(...args);\n }\n\n _select<T extends Query, Columns extends SelectArg<T>[]>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n _select<\n T extends Query,\n Columns extends SelectArg<T>[],\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultWithObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _select(this: Query, ...args: any[]) {\n if (!args.length) {\n return this;\n }\n\n const as = this.q.as || this.table;\n const selectArgs = args.map((item) => processSelectArg(this, as, item));\n\n return pushQueryArray(this, 'select', selectArgs);\n }\n\n /**\n * When querying the table or creating records, all columns are selected by default,\n * but updating and deleting queries are returning affected row counts by default.\n *\n * Use `selectAll` to select all columns. If the `.select` method was applied before it will be discarded.\n *\n * ```ts\n * const selectFull = await db.table\n * .select('id', 'name') // discarded by `selectAll`\n * .selectAll();\n *\n * const updatedFull = await db.table.selectAll().where(conditions).update(data);\n *\n * const deletedFull = await db.table.selectAll().where(conditions).delete();\n * ```\n */\n selectAll<T extends Query>(this: T): SelectResult<T, ['*']> {\n return this.clone()._selectAll();\n }\n\n _selectAll<T extends Query>(this: T): SelectResult<T, ['*']> {\n this.q.select = ['*'];\n return this as unknown as SelectResult<T, ['*']>;\n }\n}\n","import {\n Query,\n GetQueryResult,\n SelectableBase,\n SelectableFromShape,\n SetQueryTableAlias,\n WithDataItem,\n} from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport {\n QueryCatch,\n QueryThen,\n Expression,\n TemplateLiteralArgs,\n isExpression,\n} from 'orchid-core';\nimport { getShapeFromSelect } from './select';\nimport { RawSQL } from '../sql/rawSql';\n\nexport type FromArgs<T extends Query> =\n | [\n first: Query | Expression | Exclude<keyof T['withData'], symbol | number>,\n second?: { only?: boolean },\n ]\n | TemplateLiteralArgs;\n\nexport type FromResult<\n T extends Query,\n Args extends FromArgs<T>,\n> = Args extends TemplateStringsArray\n ? T\n : Args[0] extends string\n ? T['withData'] extends Record<string, WithDataItem>\n ? Args[0] extends keyof T['withData']\n ? Omit<T, 'meta' | 'selectable'> & {\n meta: Omit<T['meta'], 'as'> & {\n as?: string;\n };\n selectable: SelectableFromShape<\n T['withData'][Args[0]]['shape'],\n Args[0]\n >;\n }\n : SetQueryTableAlias<T, Args[0]>\n : SetQueryTableAlias<T, Args[0]>\n : Args[0] extends Query\n ? FromQueryResult<T, Args[0]>\n : T;\n\ntype FromQueryResult<\n T extends Query,\n Q extends Query,\n Selectable extends SelectableBase = {\n [K in keyof Q['result']]: K extends string\n ? {\n as: K;\n column: Q['result'][K];\n }\n : never;\n },\n Data = GetQueryResult<T['returnType'], Q['result']>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? Omit<T['meta'], 'hasSelect' | 'as'> & { as: AliasOrTable<Q> }\n : K extends 'selectable'\n ? Selectable\n : K extends 'result' | 'shape'\n ? Q['result']\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\nexport class From {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(Otherdb.table.select('foo', 'bar'));\n *\n * // accepts raw sql by template literal:\n * const value = 123;\n * db.table.from`value = ${value}`;\n *\n * // accepts raw sql:\n * db.table.from(db.table.sql`value = ${value}`);\n *\n * // accepts alias of `WITH` expression:\n * q.with('foo', Otherdb.table.select('id', 'name')).from('foo');\n * ```\n *\n * Optionally takes a second argument of type `{ only?: boolean }`, (see `FROM ONLY` in Postgres docs, this is related to table inheritance).\n *\n * ```ts\n * db.table.from(Otherdb.table.select('foo', 'bar'), {\n * only: true,\n * });\n * ```\n *\n * @param args - query, raw SQL, name of CTE table, or a template string\n */\n from<T extends Query, Args extends FromArgs<T>>(\n this: T,\n ...args: Args\n ): FromResult<T, Args> {\n return this.clone()._from(...args) as FromResult<T, Args>;\n }\n _from<T extends Query, Args extends FromArgs<T>>(\n this: T,\n ...args: Args\n ): FromResult<T, Args> {\n if (Array.isArray(args[0])) {\n return this._from(new RawSQL(args as TemplateLiteralArgs)) as FromResult<\n T,\n Args\n >;\n }\n\n if (typeof args[0] === 'string') {\n this.q.as ||= args[0];\n } else if (!isExpression(args[0])) {\n const q = args[0] as Query;\n this.q.as ||= q.q.as || q.table || 't';\n this.q.shape = getShapeFromSelect(args[0] as Query, true);\n this.q.parsers = q.q.parsers;\n } else {\n this.q.as ||= 't';\n }\n\n const options = args[1] as { only?: boolean } | undefined;\n if (options?.only) {\n (this.q as SelectQueryData).fromOnly = options.only;\n }\n\n this.q.from = args[0] as Query;\n\n return this as unknown as FromResult<T, Args>;\n }\n}\n","import { ColumnTypeBase, Expression } from 'orchid-core';\nimport { SelectAs, SelectItem, SelectQueryData, ToSQLCtx } from '../sql';\nimport { selectAllSql, selectedObjectToSQL } from '../sql/select';\nimport { Query } from '../query/query';\nimport { columnToSql, columnToSqlWithAs } from '../sql/common';\n\n/**\n * Expression that can turn a {@link SelectItem} (except {@link SelectAs}) into SQL.\n * Used by `get` to have an expression that can be chained with operators.\n */\nexport class SelectItemExpression<\n T extends ColumnTypeBase = ColumnTypeBase,\n> extends Expression<T> {\n constructor(\n public q: Query,\n public item: Exclude<SelectItem, SelectAs>,\n public _type: T,\n ) {\n super();\n }\n\n // `makeSQL` acts similarly to how select args are handled,\n // except that it will use non-aliasing `columnToSql` when `ctx.aliasValue` is true,\n // it is needed for relation sub-queries that returns a single column.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return typeof this.item === 'string'\n ? this.item === '*'\n ? selectAllSql(this.q, this.q.q as SelectQueryData, quotedAs)\n : ctx.aliasValue\n ? columnToSql(ctx, this.q.q, this.q.q.shape, this.item, quotedAs, true)\n : columnToSqlWithAs(ctx, this.q.q, this.item, quotedAs, true)\n : selectedObjectToSQL(ctx, this.q, quotedAs, this.item);\n }\n}\n","import {\n Query,\n SetQueryReturnsColumn,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsValue,\n SetQueryReturnsValueOptional,\n} from '../query/query';\nimport {\n addParserForRawExpression,\n setParserForSelectedString,\n} from './select';\nimport {\n ColumnTypeBase,\n Expression,\n getValueKey,\n StringKey,\n} from 'orchid-core';\nimport { SelectQueryData } from '../sql';\nimport { QueryBase } from '../query/queryBase';\nimport { Operators, setQueryOperators } from '../columns/operators';\nimport { SelectItemExpression } from '../common/selectItemExpression';\nimport { UnknownColumn } from '../columns';\nimport { getQueryAs } from '../common/utils';\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryBase> = GetStringArg<T> | Expression;\n\nexport type GetStringArg<T extends QueryBase> = StringKey<\n keyof T['selectable']\n>;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\ntype GetResult<\n T extends Query,\n Arg extends GetArg<T>,\n> = Arg extends GetStringArg<T>\n ? SetQueryReturnsValue<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumn<T, Arg['_type']>\n : never;\n\ntype GetResultOptional<\n T extends Query,\n Arg extends GetArg<T>,\n> = Arg extends GetStringArg<T>\n ? SetQueryReturnsValueOptional<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOptional<T, Arg['_type']>\n : never;\n\n// mutate the query to get a single value\nconst _get = <\n T extends Query,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n q: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n q.q.returnType = returnType;\n\n let type: ColumnTypeBase | undefined;\n if (typeof arg === 'string') {\n type = q.q.shape[arg];\n if (!type) {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const column = arg.slice(index + 1);\n\n if (table === (q.q.as || q.table)) {\n type = q.q.shape[column];\n } else {\n type = q.q.joinedShapes?.[table]?.[column];\n }\n }\n }\n\n (q.q as SelectQueryData)[getValueKey] = type;\n\n setParserForSelectedString(q, arg, getQueryAs(q), getValueKey);\n\n q.q.expr = new SelectItemExpression(q, arg, type || UnknownColumn.instance);\n } else {\n type = arg._type;\n (q.q as SelectQueryData)[getValueKey] = type;\n addParserForRawExpression(q, getValueKey, arg);\n q.q.expr = arg;\n }\n\n q.q.select = [q.q.expr];\n\n return setQueryOperators(\n q,\n type?.operators || Operators.any,\n ) as unknown as GetResult<T, Arg> & GetResultOptional<T, Arg>;\n};\n\nexport class QueryGet {\n /**\n * `.get` returns a single value, it will add `LIMIT 1` to the query, and accepts a column name or a raw expression.\n * It will throw `NotFoundError` when not found.\n *\n * ```ts\n * import { NumberColumn } from 'pqb';\n *\n * const firstName: string = await db.table.get('name');\n *\n * const rawResult: number = await db.table.get(\n * db.table.sql((t) => t.integer())`1 + 1`,\n * );\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n get<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return this.clone()._get(arg);\n }\n\n _get<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return _get(this, 'valueOrThrow', arg);\n }\n\n /**\n * `.getOptional` returns a single value or undefined when not found:\n *\n * ```ts\n * const firstName: string | undefined = await db.table.getOptional('name');\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n getOptional<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return this.clone()._getOptional(arg);\n }\n\n _getOptional<T extends Query, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return _get(this, 'value', arg);\n }\n}\n","import { Query } from '../query/query';\nimport { TemplateLiteralArgs } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { BooleanColumn, BooleanNullable } from '../columns';\n\n// Arguments of `having`:\n// can be a SQL template literal or one or multiple callbacks returning a boolean expression.\ntype HavingArgs<T extends Query> = TemplateLiteralArgs | HavingArgFn<T>[];\n\n// Function argument of `having`:\n// the same query builder as in `select` is passed in, boolean expression is expected to be returned.\ntype HavingArgFn<T extends Query> = (\n q: T,\n) => Query & { result: { value: BooleanColumn | BooleanNullable } };\n\nexport class Having {\n /**\n * Build a `HAVING` clause to the query to filter records by results of [aggregate functions](#aggregate-functions).\n *\n * The argument of `having` is a function where you call the aggregate function and compare it with some value by using [column operators](/guide/where.html#column-operators).\n *\n * ```ts\n * db.table.having((q) => q.count().gte(10));\n * // HAVING count(*) >= 10\n * ```\n *\n * Alternatively, it accepts a raw SQL template:\n *\n * ```ts\n * db.table.having`count(*) >= ${10}`;\n * ```\n *\n * Multiple having conditions will be combined with `AND`:\n *\n * ```ts\n * db.table.having(\n * (q) => q.sum('column').gt(5),\n * (q) => q.avg('column').lt(10),\n * );\n * // HAVING sum(column) > 5 AND avg(column) < 10\n * ```\n *\n * After applying a comparison, `or` and `and` methods become available:\n *\n * ```ts\n * db.table.having((q) =>\n * q.sum('column').equals(5).or(q.min('column').gt(1), q.max('column').lt(10)),\n * );\n * // HAVING (sum(column) = 5) OR (min(column) > 1 AND max(column) < 10)\n * ```\n *\n * Aggregate functions are exactly the same functions described in [aggregate functions](#aggregate-functions), they can accept aggregation options:\n *\n * ```ts\n * db.table.having((q) =>\n * q\n * .count('id', {\n * distinct: true,\n * order: { createdAt: 'DESC', filter: { someColumn: { not: null } } },\n * })\n * .gte(10),\n * );\n * ```\n *\n * Arguments of the aggregate function and of the comparison can be raw SQL:\n *\n * ```ts\n * db.table.having((q) => q.count(q.sql('coalesce(one, two)')).gte(q.sql`2 + 2`));\n * ```\n *\n * @param args - raw SQL template string or one or multiple callbacks returning a boolean expression\n */\n having<T extends Query>(this: T, ...args: HavingArgs<T>): T {\n return this.clone()._having(...args);\n }\n _having<T extends Query>(this: T, ...args: HavingArgs<T>): T {\n return pushQueryValue(\n this,\n 'having',\n 'raw' in args[0]\n ? args\n : args.map((arg) => (arg as HavingArgFn<T>)(this).q.expr),\n );\n }\n}\n","import { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { ColumnsShapeBase, StringKey } from 'orchid-core';\nimport { QueryAfterHook, QueryBeforeHook } from '../sql';\nimport { QueryBase } from '../query/queryBase';\n\n// A function type for after-hook. Constructs type of data argument based on selected columns.\nexport type AfterHook<\n Select extends PropertyKey[],\n Shape extends ColumnsShapeBase,\n Selected extends ColumnsShapeBase = Pick<Shape, StringKey<Select[number]>>,\n Item = { [K in keyof Selected]: Selected[K]['outputType'] },\n> = QueryAfterHook<Item[]>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelect<T extends QueryBase> = (keyof T['shape'])[];\n\n// Possible action types to attach hook for.\nexport type HookAction = 'Create' | 'Update' | 'Delete';\n\n// Save `before` hook into the query.\nconst before = <T extends QueryBase>(\n q: T,\n key: HookAction,\n cb: QueryBeforeHook,\n): T => pushQueryValue(q, `before${key}`, cb);\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends QueryBase, S extends HookSelect<T>>(\n q: T,\n key: HookAction,\n select: S,\n cb: AfterHook<S, T['shape']>,\n commit?: boolean,\n): T =>\n pushQueryArray(\n pushQueryValue(q, `after${key}${commit ? 'Commit' : ''}`, cb),\n `after${key}Select`,\n select,\n );\n\nexport abstract class QueryHooks extends QueryBase {\n /**\n * Run the function before any kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeQuery<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeQuery(cb);\n }\n _beforeQuery<T extends QueryBase>(this: T, cb: QueryBeforeHook): T {\n return pushQueryValue(this, 'before', cb);\n }\n\n /**\n * Run the function after any kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n *\n * @param cb - function to call, first argument is the query result of type `unknown`, second argument is a query object\n */\n afterQuery<T extends QueryHooks>(this: T, cb: QueryAfterHook): T {\n return this.clone()._afterQuery(cb);\n }\n _afterQuery<T extends QueryBase>(this: T, cb: QueryAfterHook): T {\n return pushQueryValue(this, 'after', cb);\n }\n\n /**\n * Run the function before a `create` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeCreate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeCreate(cb);\n }\n _beforeCreate<T extends QueryBase>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Create', cb);\n }\n\n /**\n * Run the function after a `create` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterCreate(select, cb);\n }\n _afterCreate<T extends QueryBase, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Create', select, cb);\n }\n\n /**\n * Run the function after transaction for a `create` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterCreateCommit(select, cb);\n }\n _afterCreateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Create', select, cb, true);\n }\n\n /**\n * Run the function before an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeUpdate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeUpdate(cb);\n }\n _beforeUpdate<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Update', cb);\n }\n\n /**\n * Run the function after an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterUpdate(select, cb);\n }\n _afterUpdate<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Update', select, cb);\n }\n\n /**\n * Run the function after transaction for an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterUpdateCommit(select, cb);\n }\n _afterUpdateCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Update', select, cb, true);\n }\n\n /**\n * Run the function before a `create` or an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeSave<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeSave(cb);\n }\n _beforeSave<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(before(this, 'Create', cb), 'Update', cb);\n }\n\n /**\n * Run the function after a `create` or an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSave<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterSave(select, cb);\n }\n _afterSave<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(after(this, 'Create', select, cb), 'Update', select, cb);\n }\n\n /**\n * Run the function after transaction for a `create` or an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSaveCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterSaveCommit(select, cb);\n }\n _afterSaveCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(\n after(this, 'Create', select, cb, true),\n 'Update',\n select,\n cb,\n true,\n );\n }\n\n /**\n * Run the function before a `delete` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeDelete<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return this.clone()._beforeDelete(cb);\n }\n _beforeDelete<T extends QueryHooks>(this: T, cb: QueryBeforeHook): T {\n return before(this, 'Delete', cb);\n }\n\n /**\n * Run the function after a `delete` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDelete<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterDelete(select, cb);\n }\n _afterDelete<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Delete', select, cb);\n }\n\n /**\n * Run the function after transaction for a `delete` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDeleteCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return this.clone()._afterDeleteCommit(select, cb);\n }\n _afterDeleteCommit<T extends QueryHooks, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return after(this, 'Delete', select, cb, true);\n }\n}\n","import { Query } from '../../query/query';\nimport { ColumnOperators } from '../../sql';\nimport { pushQueryArray, pushQueryValue } from '../../query/queryUtils';\nimport { JoinArgs, JoinCallback, JoinFirstArg } from '../join/join';\nimport {\n applyMixins,\n ColumnsShapeBase,\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n} from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { BooleanNullable } from '../../columns';\nimport { QueryBase } from '../../query/queryBase';\nimport { RawSQL } from '../../sql/rawSql';\nimport { ColumnExpression } from '../../common/fn';\n\n/*\nArgument of `where`:\n- can be an object with special keys `NOT`, `OR`, `IN`, etc.: q.where({ NOT: { key: 'value' } })\n- can be a raw SQL: q.where(q.raw`sql`)\n- can be a special query builder: q.whereNot((q) => q.whereIn(...))\n- can be a nested `where` query to be joined wth `AND`: q.where(q.where(...), q.where(...))\n- can be an object where keys are column names and values can be one of:\n - value to check for equality\n - null for `IS NULL`\n - object with column operators: q.where({ num: { gt: 5 } })\n - raw SQL: q.where({ num: q.raw`sql` })\n - sub query returning a single column: q.where({ num: db.someTable.where(...).get('column') })\n */\nexport type WhereArg<T extends WhereQueryBase> =\n | {\n [K in\n | keyof T['selectable']\n | 'NOT'\n | 'OR'\n | 'IN'\n | 'EXISTS']?: K extends 'NOT'\n ? MaybeArray<WhereArg<T>>\n : K extends 'OR'\n ? MaybeArray<WhereArg<T>>[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['selectable'])[];\n values: unknown[][] | Query | Expression;\n }>\n : K extends keyof T['selectable']\n ?\n | T['selectable'][K]['column']['queryType']\n | null\n | ColumnOperators<T['selectable'], K>\n | Expression\n | Query\n : never;\n }\n | QueryBase\n | Expression\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryBase | ColumnExpression<BooleanNullable>);\n\n/**\n * Callback argument of `where`.\n * It has `where` methods (`where`, `whereNot`, `whereExists`, etc.),\n * and it has relations that you can aggregate and use a boolean comparison with, such as:\n * ```ts\n * db.table.where((q) => q.relation.count().equals(10))\n * ```\n */\nexport type WhereQueryBuilder<T extends WhereQueryBase> = Pick<\n T,\n keyof WhereQueryBase\n> &\n T['relations'];\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends WhereQueryBase> =\n | WhereArg<T>[]\n | TemplateLiteralArgs;\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends QueryBase> =\n | keyof T['selectable']\n | [keyof T['selectable'], ...(keyof T['selectable'])[]];\n\n// If `WhereInColumn` is a single column, it accepts array of values, or Query returning single column, or raw SQL expression.\n// If `WhereInColumn` is a tuple, it accepts a tuple of values described above.\nexport type WhereInValues<\n T extends QueryBase,\n Column extends WhereInColumn<T>,\n> = Column extends keyof T['selectable']\n ? T['selectable'][Column]['column']['queryType'][] | Query | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['selectable']\n ? T['selectable'][Column[I]]['column']['queryType']\n : never;\n } & {\n length: Column extends { length: number } ? Column['length'] : never;\n })[]\n | Query\n | Expression;\n\n// In addition to `WhereInColumn` + `WhereInValues` where user can provide a tuple with columns and a tuple with values, enable `whereIn` with object syntax.\n// Each key is a column name, value is array of column values, or a query returning single column, or a raw SQL expression.\nexport type WhereInArg<T extends Pick<Query, 'selectable'>> = {\n [K in keyof T['selectable']]?:\n | T['selectable'][K]['column']['queryType'][]\n | Query\n | Expression;\n};\n\n// After applying `where`, attach `hasWhere: true` to query meta to allow updating and deleting.\nexport type WhereResult<T extends QueryBase> = T & {\n meta: {\n hasWhere: true;\n };\n};\n\n/**\n * Adds `where` arguments to query data: SQL template string is added as `RawSQL` object, other arguments are added as is.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addWhere = <T extends WhereQueryBase>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n if (Array.isArray(args[0])) {\n return pushQueryValue(\n q,\n 'and',\n new RawSQL(args as TemplateLiteralArgs),\n ) as unknown as WhereResult<T>;\n }\n\n return pushQueryArray(q, 'and', args) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data with a `NOT` keyword: SQL template string is added as `RawSQL` object, other arguments are added as is.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addWhereNot = <T extends WhereQueryBase>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n if (Array.isArray(args[0])) {\n return pushQueryValue(q, 'and', {\n NOT: new RawSQL(args as TemplateLiteralArgs),\n }) as unknown as WhereResult<T>;\n }\n return pushQueryValue(q, 'and', {\n NOT: args,\n }) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data. Arguments will be separated from each other with `OR`.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addOr = <T extends WhereQueryBase>(\n q: T,\n args: WhereArg<T>[],\n): WhereResult<T> => {\n return pushQueryArray(\n q,\n 'or',\n args.map((item) => [item]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Adds `where` arguments to query data with a `NOT` keyword. Arguments will be separated from each other with `OR`.\n *\n * @param q - query object to add the data to\n * @param args - `where` arguments, may be a template literal\n */\nexport const addOrNot = <T extends WhereQueryBase>(\n q: T,\n args: WhereArg<T>[],\n): WhereResult<T> => {\n return pushQueryArray(\n q,\n 'or',\n args.map((item) => [{ NOT: item }]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereIn` to add them to query data properly.\n *\n * @param q - query object to add the data to.\n * @param and - `true` to join arguments with `AND`, `false` to join them with `OR.\n * @param arg - `whereIn` argument: can be a single column name, tuple of column names, or object with column names and values.\n * @param values - if the `arg` is a column name or a tuple, `values` are the values for the column/columns. If `arg` is an object, `values` are `undefined`.\n * @param not - adds the `NOT` keyword.\n */\nexport const addWhereIn = <T extends QueryBase>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | unknown[][] | Query | Expression | undefined,\n not?: boolean,\n): WhereResult<T> => {\n const op = not ? 'notIn' : 'in';\n\n let item;\n if (values) {\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n if (not) item = { NOT: item };\n } else {\n item = { [arg as string]: { [op]: values } };\n }\n } else {\n item = {} as Record<string, { in: unknown[] }>;\n for (const key in arg as Record<string, unknown[]>) {\n item[key] = { [op as 'in']: (arg as Record<string, unknown[]>)[key] };\n }\n }\n\n if (and) {\n pushQueryValue(q, 'and', item);\n } else {\n pushQueryValue(q, 'or', [item]);\n }\n\n return q as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereExists`.\n *\n * @param args - first element is a query, or relation name, or `with` alias, or a query builder callback that returns a query. Other arguments have conditions to join the query or a `with` table, no other arguments needed in case of a relation\n */\nconst existsArgs = (args: [JoinFirstArg<Query>, ...JoinArgs<Query, Query>]) => {\n const q = args[0];\n\n let isSubQuery;\n if (typeof q === 'object') {\n isSubQuery = getIsJoinSubQuery(q.q, q.baseQuery.q);\n if (isSubQuery) {\n args[0] = q.clone();\n args[0].shape = getShapeFromSelect(q, true) as ColumnsShapeBase;\n }\n } else {\n isSubQuery = false;\n }\n\n return {\n EXISTS: {\n args,\n isSubQuery,\n },\n } as never;\n};\n\nexport abstract class Where {\n /**\n * Constructing `WHERE` conditions:\n *\n * ```ts\n * db.table.where({\n * // column of the current table\n * name: 'John',\n *\n * // table name may be specified, it can be the name of a joined table\n * 'table.lastName': 'Johnsonuk',\n *\n * // object with operators, see the \"column operators\" section to see a full list of them:\n * age: {\n * gt: 30,\n * lt: 70,\n * },\n *\n * // where column equals to raw SQL\n * column: db.table.sql`raw expression`,\n * });\n * ```\n *\n * Multiple `where`s are joined with `AND`:\n *\n * ```ts\n * db.table.where({ foo: 'foo' }).where({ bar: 'bar' });\n * ```\n *\n * ```sql\n * SELECT * FROM table WHERE foo = 'foo' AND bar = 'bar'\n * ```\n *\n * `undefined` values are ignored, so you can supply a partial object with conditions:\n *\n * ```ts\n * type Params = {\n * // allow providing exact age, or lower or greater than\n * age?: number | { lt?: number; gt?: number };\n * };\n *\n * const loadRecords = async (params: Params) => {\n * // this will load all records if params is an empty object\n * const records = await db.table.where(params);\n * };\n * ```\n *\n * It supports a sub-query that is selecting a single value to compare it with a column:\n *\n * ```ts\n * db.table.where({\n * // compare `someColumn` in one table with the `column` value returned from another query.\n * someColumn: db.otherTable.where(...conditions).get('column'),\n * });\n * ```\n *\n * `where` can accept other queries and merge their conditions:\n *\n * ```ts\n * const otherQuery = db.table.where({ name: 'John' });\n *\n * db.table.where({ id: 1 }, otherQuery);\n * // this will produce WHERE \"table\".\"id\" = 1 AND \"table\".\"name' = 'John'\n * ```\n *\n * `where` supports raw SQL:\n *\n * ```ts\n * db.table.where`a = b`;\n *\n * // or\n * db.table.where(db.table.sql`a = b`);\n *\n * // or\n * import { raw } from 'orchid-orm';\n *\n * db.table.where(raw`a = b`);\n * ```\n *\n * `where` can accept a callback with a specific query builder containing all \"where\" methods such as `where`, `orWhere`, `whereNot`, `whereIn`, `whereExists`:\n *\n * ```ts\n * db.table.where((q) =>\n * q\n * .where({ name: 'Name' })\n * .orWhere({ id: 1 }, { id: 2 })\n * .whereIn('letter', ['a', 'b', 'c'])\n * .whereExists(Message, 'authorId', 'id'),\n * );\n * ```\n *\n * `where` can accept multiple arguments, conditions are joined with `AND`:\n *\n * ```ts\n * db.table.where(\n * { id: 1 },\n * db.table.where({ name: 'John' }),\n * db.table.sql`a = b`,\n * );\n * ```\n *\n * ## where sub query\n *\n * `where` handles a special callback where you can query a relation to get some value and filter by that value.\n *\n * It is useful for a faceted search. For instance, posts have tags, and we want to find all posts that have all the given tags.\n *\n * ```ts\n * const givenTags = ['typescript', 'node.js'];\n *\n * const posts = await db.post.where(\n * (post) =>\n * post.tags // query tags of the post\n * .whereIn('tagName', givenTags) // where name of the tag is inside array\n * .count() // count how many such tags were found\n * .equals(wantedTags.length), // the count must be exactly the length of array\n * // if the post has ony `typescript` tag but not the `node.js` it will be omitted\n * );\n * ```\n *\n * This will produce an efficient SQL query:\n *\n * ```sql\n * SELECT * FROM \"post\"\n * WHERE (\n * SELECT count(*) = 3\n * FROM \"tag\" AS \"tags\"\n * WHERE \"tag\".\"tagName\" IN ('typescript', 'node.js')\n * -- join tags to the post via \"postTag\" table\n * AND EXISTS (\n * SELECT 1 FROM \"postTag\"\n * WHERE \"postTag\".\"postId\" = \"post\".\"id\"\n * AND \"postTag\".\"tagId\" = \"tag\".\"id\"\n * )\n * )\n * ```\n *\n * In the example above we use `count()`, you can also use any other aggregate method instead, such as `min`, `max`, `avg`.\n *\n * The `count()` is chained with `equals` to check for a strict equality, any other operation is also allowed, such as `not`, `lt`, `gt`.\n *\n * ## where special keys\n *\n * The object passed to `where` can contain special keys, each of the keys corresponds to its own method and takes the same value as the type of argument of the method.\n *\n * For example:\n *\n * ```ts\n * db.table.where({\n * NOT: { key: 'value' },\n * OR: [{ name: 'a' }, { name: 'b' }],\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * });\n * ```\n *\n * Using methods `whereNot`, `orWhere`, `whereIn` instead of this is a shorter and cleaner way, but in some cases, such object keys way may be more convenient.\n *\n * ```ts\n * db.table.where({\n * // see .whereNot\n * NOT: { id: 1 },\n * // can be an array:\n * NOT: [{ id: 1 }, { id: 2 }],\n *\n * // see .orWhere\n * OR: [{ name: 'a' }, { name: 'b' }],\n * // can be an array:\n * // this will give id = 1 AND id = 2 OR id = 3 AND id = 4\n * OR: [\n * [{ id: 1 }, { id: 2 }],\n * [{ id: 3 }, { id: 4 }],\n * ],\n *\n * // see .in, the key syntax requires an object with columns and values\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * // can be an array:\n * IN: [\n * {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * { columns: ['someColumn'], values: [['foo', 'bar']] },\n * ],\n * });\n * ```\n *\n * ## column operators\n *\n * `where` argument can take an object where the key is the name of the operator and the value is its argument.\n *\n * Different types of columns support different sets of operators.\n *\n * All column operators can take a value of the same type as the column, a sub-query, or a raw SQL expression:\n *\n * ```ts\n * import { sql } from 'orchid-orm';\n *\n * db.table.where({\n * numericColumn: {\n * // lower than 5\n * lt: 5,\n *\n * // lower than the value returned by sub-query\n * lt: OtherTable.select('someNumber').take(),\n *\n * // raw SQL expression produces WHERE \"numericColumn\" < \"otherColumn\" + 10\n * lt: sql`\"otherColumn\" + 10`,\n * },\n * });\n * ```\n *\n * ### Any type of column operators\n *\n * `equals` is a simple `=` operator, it may be useful for comparing column value with JSON object:\n *\n * ```ts\n * db.table.where({\n * // when searching for an exact same JSON value, this won't work:\n * jsonColumn: someObject,\n *\n * // use `{ equals: ... }` instead:\n * jsonColumn: { equals: someObject },\n * });\n * ```\n *\n * `not` is `!=` (aka `<>`) not equal operator:\n *\n * ```ts\n * db.table.where({\n * anyColumn: { not: value },\n * });\n * ```\n *\n * `in` is for the `IN` operator to check if the column value is included in a list of values.\n *\n * Takes an array of the same type as a column, a sub-query that returns a list of values, or a raw SQL expression that returns a list.\n *\n * ```ts\n * db.table.where({\n * column: {\n * in: ['a', 'b', 'c'],\n *\n * // WHERE \"column\" IN (SELECT \"column\" FROM \"otherTable\")\n * in: OtherTable.select('column'),\n *\n * in: db.table.sql`('a', 'b')`,\n * },\n * });\n * ```\n *\n * `notIn` is for the `NOT IN` operator, and takes the same arguments as `in`\n *\n * ### Numeric, Date, and Time column operators\n *\n * To compare numbers, dates, and times.\n *\n * `lt` is for `<` (lower than)\n *\n * `lte` is for `<=` (lower than or equal)\n *\n * `gt` is for `>` (greater than)\n *\n * `gte` is for `>=` (greater than or equal)\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * gt: 5,\n * lt: 10,\n * },\n *\n * date: {\n * lte: new Date(),\n * },\n *\n * time: {\n * gte: new Date(),\n * },\n * });\n * ```\n *\n * `between` also works with numeric, dates, and time columns, it takes an array of two elements.\n *\n * Both elements can be of the same type as a column, a sub-query, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * column: {\n * // simple values\n * between: [1, 10],\n *\n * // sub-query and raw SQL expression\n * between: [OtherTable.select('column').take(), db.table.sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `char`, `varchar`, and `json` columns.\n *\n * `json` is stored as text, so it has text operators. Use the `jsonb` type for JSON operators.\n *\n * Takes a string, or sub-query returning string, or raw SQL expression as well as other operators.\n *\n * ```ts\n * db.table.where({\n * textColumn: {\n * // WHERE \"textColumn\" LIKE '%string%'\n * contains: 'string',\n * // WHERE \"textColumn\" ILIKE '%string%'\n * containsInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE 'string%'\n * startsWith: 'string',\n * // WHERE \"textColumn\" ILIKE 'string%'\n * startsWithInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE '%string'\n * endsWith: 'string',\n * // WHERE \"textColumn\" ILIKE '%string'\n * endsWithInsensitive: 'string',\n * },\n * });\n * ```\n *\n * ### JSONB column operators\n *\n * For the `jsonb` column, note that the `json` type has text operators instead.\n *\n * `jsonPath` operator: compare a column value under a given JSON path with the provided value.\n *\n * Value can be of any type to compare with JSON value, or it can be a sub-query or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonPath: [\n * '$.name', // first element is JSON path\n * '=', // second argument is comparison operator\n * 'value', // third argument is a value to compare with\n * ],\n * },\n * });\n * ```\n *\n * `jsonSupersetOf`: check if the column value is a superset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1, \"b\": 2 }` and provided value is `{ \"a\": 1 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * `jsonSubsetOf`: check if the column value is a subset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1 }` and provided value is `{ \"a\": 1, \"b\": 2 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n where<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return this.clone()._where(...args);\n }\n _where<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return addWhere(this, args);\n }\n\n /**\n * `whereNot` takes the same arguments as `where` and prepends them with `NOT` in SQL\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return this.clone()._whereNot(...args);\n }\n _whereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return addWhereNot(this, args);\n }\n\n /**\n * `orWhere` is accepting the same arguments as {@link where}, joining arguments with `OR`.\n *\n * Columns in single arguments are still joined with `AND`.\n *\n * The database is processing `AND` before `OR`, so this should be intuitively clear.\n *\n * ```ts\n * db.table.where({ id: 1, color: 'red' }).orWhere({ id: 2, color: 'blue' });\n * // equivalent:\n * db.table.orWhere({ id: 1, color: 'red' }, { id: 2, color: 'blue' });\n * ```\n *\n * This query will produce such SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"table\"\n * WHERE id = 1 AND color = 'red'\n * OR id = 2 AND color = 'blue'\n * ```\n *\n * @param args - {@link WhereArgs} will be joined with `OR`\n */\n orWhere<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return this.clone()._orWhere(...args);\n }\n _orWhere<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return addOr(this, args);\n }\n\n /**\n * `orWhereNot` takes the same arguments as {@link orWhere}, and prepends each condition with `NOT` just as {@link whereNot} does.\n *\n * @param args - {@link WhereArgs} will be prefixed with `NOT` and joined with `OR`\n */\n orWhereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return this.clone()._orWhereNot(...args);\n }\n _orWhereNot<T extends WhereQueryBase>(\n this: T,\n ...args: WhereArg<T>[]\n ): WhereResult<T> {\n return addOrNot(this, args);\n }\n\n /**\n * `whereIn` and related methods are for the `IN` operator to check for inclusion in a list of values.\n *\n * When used with a single column it works equivalent to the `in` column operator:\n *\n * ```ts\n * db.table.whereIn('column', [1, 2, 3]);\n * // the same as:\n * db.table.where({ column: [1, 2, 3] });\n * ```\n *\n * `whereIn` can support a tuple of columns, that's what the `in` operator cannot support:\n *\n * ```ts\n * db.table.whereIn(\n * ['id', 'name'],\n * [\n * [1, 'Alice'],\n * [2, 'Bob'],\n * ],\n * );\n * ```\n *\n * It supports sub query which should return records with columns of the same type:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], OtherTable.select('id', 'name'));\n * ```\n *\n * It supports raw SQL expression:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], db.table.sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n whereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link whereIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n whereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n whereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._whereIn(\n arg as any,\n values as any,\n ) as unknown as WhereResult<T>;\n }\n _whereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _whereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _whereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, true, arg, values);\n }\n\n /**\n * Takes the same arguments as {@link whereIn}.\n * Add a `WHERE IN` condition prefixed with `OR` to the query:\n *\n * ```ts\n * db.table.whereIn('a', [1, 2, 3]).orWhereIn('b', ['one', 'two']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n orWhereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link orWhereIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return this.clone()._orWhereIn(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values as any,\n ) as unknown as WhereResult<T>;\n }\n _orWhereIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _orWhereIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, false, arg, values);\n }\n\n /**\n * Acts as `whereIn`, but negates the condition with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('color', ['red', 'green', 'blue']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n whereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link whereNotIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._whereNotIn(arg as any, values as any);\n }\n _whereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _whereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, true, arg, values, true);\n }\n\n /**\n * Acts as `whereIn`, but prepends `OR` to the condition and negates it with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('a', [1, 2, 3]).orWhereNoIn('b', ['one', 'two']);\n * ```\n *\n * @param column - one column name, or array of column names\n * @param values - array of values, or a query to load values, or a raw SQL. Tuple of such values in case of multiple columns.\n */\n orWhereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n /**\n * See {@link orWhereNotIn}.\n *\n * @param arg - object where keys are column names, and values are an array of column values, or a query returning column values, or a raw SQL.\n */\n orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown | unknown[],\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.clone()._orWhereNotIn(arg as any, values as any);\n }\n _orWhereNotIn<T extends WhereQueryBase, Column extends WhereInColumn<T>>(\n this: T,\n column: Column,\n values: WhereInValues<T, Column>,\n ): WhereResult<T>;\n _orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: WhereInArg<T>,\n ): WhereResult<T>;\n _orWhereNotIn<T extends WhereQueryBase>(\n this: T,\n arg: unknown,\n values?: unknown[] | unknown[][] | Query | Expression,\n ): WhereResult<T> {\n return addWhereIn(this, false, arg, values, true);\n }\n\n /**\n * `whereExists` is for support of the `WHERE EXISTS (query)` clause.\n *\n * This method is accepting the same arguments as `join`, see the {@link Join.join} section for more details.\n *\n * ```ts\n * // find users who have accounts\n * // find by a relation name if it's defined\n * db.user.whereExists('account');\n *\n * // find using a table and a join conditions\n * db.user.whereExists(db.account, 'account.id', 'user.id');\n *\n * // find using a query builder in a callback:\n * db.user.whereExists(db.account, (q) => q.on('account.id', '=', 'user.id'));\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n ...args: JoinArgs<T, Arg>\n ): WhereResult<T>;\n /**\n * See {@link whereExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n whereExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._whereExists(arg, ...args);\n }\n _whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n ...args: JoinArgs<T, Arg>\n ): WhereResult<T>;\n _whereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _whereExists(this: WhereQueryBase, ...args: any) {\n return this._where(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR`:\n *\n * ```ts\n * // find users who have an account or a profile,\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereExist('account').orWhereExists('profile');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n orWhereExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link orWhereExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n orWhereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orWhereExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._orWhereExists(arg, ...args);\n }\n _orWhereExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _orWhereExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _orWhereExists(this: WhereQueryBase, ...args: any) {\n return this._orWhere(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but negates the condition with `NOT`:\n *\n * ```ts\n * // find users who don't have an account,\n * // image that the user `belongsTo` or `hasOne` account.\n * db.user.whereNotExist('account');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link whereNotExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n whereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n whereNotExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._whereNotExists(arg, ...args);\n }\n _whereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _whereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _whereNotExists(this: WhereQueryBase, ...args: any) {\n return this._whereNot(existsArgs(args));\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR` and negates it with `NOT`:\n *\n * ```ts\n * // find users who don't have an account OR who don't have a profile\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereNotExists('account').orWhereNotExists('profile');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n orWhereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n /**\n * See {@link orWhereNotExists}.\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param cb - callback with a query builder to join the table.\n */\n orWhereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orWhereNotExists(this: WhereQueryBase, arg: any, ...args: any) {\n return this.clone()._orWhereNotExists(arg, ...args);\n }\n _orWhereNotExists<\n T extends WhereQueryBase,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): WhereResult<T>;\n _orWhereNotExists<T extends WhereQueryBase, Arg extends JoinFirstArg<T>>(\n this: T,\n arg: Arg,\n cb: JoinCallback<T, Arg>,\n ): WhereResult<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _orWhereNotExists(this: WhereQueryBase, ...args: any) {\n return this._orWhereNot(existsArgs(args));\n }\n}\n\n// Query builder class that only has Where methods.\n// Used for `where` callback argument, and for callback argument of `join`.\nexport interface WhereQueryBase extends Where, QueryBase {}\nexport abstract class WhereQueryBase extends QueryBase {}\napplyMixins(WhereQueryBase, [Where]);\n","import {\n Query,\n GetQueryResult,\n SelectableBase,\n WithDataBase,\n WithDataItem,\n QueryReturnType,\n} from '../../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport { WhereQueryBase } from '../where/where';\nimport { RelationsBase } from '../../relations';\nimport { QueryData } from '../../sql';\nimport {\n Expression,\n StringKey,\n QueryInternal,\n EmptyTuple,\n NullableColumn,\n QueryMetaBase,\n ColumnsShapeBase,\n QueryThen,\n QueryCatch,\n emptyObject,\n} from 'orchid-core';\nimport { _join, _joinLateral } from './_join';\nimport { AliasOrTable } from '../../common/utils';\nimport { ColumnsObject } from '../../columns';\nimport { QueryBase } from '../../query/queryBase';\n\n// Type of column names of a `with` table, to use to join a `with` table by these columns.\n// Union of `with` column names that may be prefixed with a `with` table name.\ntype WithSelectable<\n T extends QueryBase,\n W extends keyof T['withData'],\n> = T['withData'][W] extends WithDataItem\n ?\n | StringKey<keyof T['withData'][W]['shape']>\n | `${T['withData'][W]['table']}.${StringKey<\n keyof T['withData'][W]['shape']\n >}`\n : never;\n\n/**\n * The first argument of all `join` and `joinLateral` methods.\n * See argument of {@link join}.\n */\nexport type JoinFirstArg<T extends QueryBase> =\n | Query\n | keyof T['relations']\n | keyof T['withData']\n | ((q: T['relations']) => Query);\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n> = Arg extends Query\n ? JoinQueryArgs<T, Arg>\n : Arg extends keyof T['relations']\n ? EmptyTuple\n : Arg extends keyof T['withData']\n ? JoinWithArgs<T, Arg>\n : never;\n\n/**\n * Column names of the joined table that can be used to join.\n * Derived from 'result', not from 'shape',\n * because if the joined table has a specific selection, it will be wrapped like:\n * ```sql\n * JOIN (SELECT something FROM joined) joined ON joined.something = ...\n * ```\n * And the selection becomes available to use in the `ON` and to select from the joined table.\n */\ntype JoinSelectable<Q extends Query> =\n | keyof Q['result']\n | `${AliasOrTable<Q>}.${StringKey<keyof Q['result']>}`;\n\n// Available arguments when joining a query object. Can be:\n// - an object where keys are columns of the joined table and values are columns of the main table or a raw SQL.\n// - raw SQL expression\n// - `true` to join without conditions\n// - pair of columns, first is of the joined table, second is of main table\n// - string tuple of a column of a joined table, operator string such as '=' or '!=', and a column of the main table\ntype JoinQueryArgs<T extends QueryBase, Q extends Query> =\n | [\n conditions:\n | Record<JoinSelectable<Q>, keyof T['selectable'] | Expression>\n | Expression\n | true,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n rightColumn: keyof T['selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n op: string,\n rightColumn: keyof T['selectable'] | Expression,\n ];\n\n// Available arguments when joining a `with` table. Can be:\n// - an object where keys are columns of the `with` table and values are columns of the main table or a raw SQL\n// - raw SQL expression\n// - pair of columns, first is of the `with` table, second is of main table\n// - string tuple of a column of a `with` table, operator string such as '=' or '!=', and a column of the main table\ntype JoinWithArgs<T extends QueryBase, W extends keyof T['withData']> =\n | [\n conditions:\n | Record<WithSelectable<T, W>, keyof T['selectable'] | Expression>\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n rightColumn: keyof T['selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n op: string,\n rightColumn: keyof T['selectable'] | Expression,\n ];\n\n/**\n * Result of all `join` methods, not `joinLateral`.\n * Adds joined table columns from its 'result' to the 'selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n * @param RequireMain - when false, main table shape will be mapped to make all columns optional (for right and full join)\n */\nexport type JoinResult<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n Cb extends (q: never) => { meta: QueryMetaBase } = () => {\n meta: QueryMetaBase;\n },\n J extends {\n table?: string;\n meta: QueryMetaBase;\n shape: ColumnsShapeBase;\n } = Arg extends Query\n ? Arg['meta']['hasSelect'] extends true\n ? // If joined query has select, it will be wrapped into a sub-query, use result type as the shape.\n { table: Arg['table']; meta: Arg['meta']; shape: Arg['result'] }\n : // If no select, use its shape. This allows using computed columns.\n Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['table']\n : Arg extends (q: never) => Query\n ? ReturnType<Arg>\n : Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? {\n table: T['withData'][Arg]['table'];\n shape: T['withData'][Arg]['shape'];\n meta: QueryBase['meta'];\n }\n : never\n : never,\n Selectable extends SelectableBase = JoinResultSelectable<\n J,\n RequireJoined,\n ReturnType<Cb>\n >,\n> = RequireMain extends true\n ? JoinAddSelectable<T, Selectable>\n : JoinOptionalMain<T, Selectable>;\n\n/**\n * Result of all `joinLateral` methods.\n * Adds joined table columns from its 'result' to the 'selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n */\nexport type JoinLateralResult<\n T extends Query,\n R extends QueryBase,\n RequireJoined extends boolean,\n Selectable extends SelectableBase = JoinResultSelectable<\n R,\n RequireJoined,\n { meta: QueryMetaBase }\n >,\n> = JoinAddSelectable<T, Selectable>;\n\n/**\n * Build `selectable` type for joined table.\n *\n * When `RequireJoined` parameter is false,\n * the result type of the joined table will be mapped to make all columns optional.\n *\n * Callback may override the joined table alias.\n *\n * The resulting selectable receives all joined table columns prefixed with the table name or alias,\n * and a star prefixed with the table name or alias to select all joined columns.\n */\ntype JoinResultSelectable<\n J extends {\n table?: string;\n meta: QueryMetaBase;\n shape: ColumnsShapeBase;\n },\n RequireJoined extends boolean,\n CbResult extends { meta: QueryMetaBase },\n Result extends ColumnsShapeBase = RequireJoined extends true\n ? J['shape']\n : { [K in keyof J['shape']]: NullableColumn<J['shape'][K]> },\n As extends string = CbResult extends { meta: QueryMetaBase & { as: string } }\n ? CbResult['meta']['as']\n : AliasOrTable<J>,\n> = {\n [K in keyof Result as `${As}.${StringKey<K>}`]: {\n as: K;\n column: Result[K];\n };\n} & {\n [K in As as `${As}.*`]: {\n as: K;\n column: RequireJoined extends true\n ? ColumnsObject<J['shape']>\n : NullableColumn<ColumnsObject<J['shape']>>;\n };\n};\n\n// Replace the 'selectable' of the query with the given selectable.\ntype JoinAddSelectable<T extends Query, Selectable extends SelectableBase> = {\n [K in keyof T]: K extends 'selectable' ? T['selectable'] & Selectable : T[K];\n};\n\n// Map `selectable` of the query to make all columns optional, and add the given `Selectable` to it.\n// Derive and apply a new query result type, where all columns become optional.\ntype JoinOptionalMain<\n T extends Query,\n Selectable extends SelectableBase,\n Result extends ColumnsShapeBase = {\n [K in keyof T['result']]: NullableColumn<T['result'][K]>;\n },\n Data = GetQueryResult<T['returnType'], Result>,\n> = {\n [K in keyof T]: K extends 'selectable'\n ? {\n [K in keyof T['selectable']]: {\n as: T['selectable'][K]['as'];\n column: NullableColumn<T['selectable'][K]['column']>;\n };\n } & Selectable\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : T[K];\n};\n\n/**\n * Map the `with` table first argument of `join` or `joinLateral` to a query type.\n * Constructs `selectable` based on `with` table shape, and adds generic types to conform the `QueryBase` type.\n */\ntype JoinWithArgToQuery<\n With extends WithDataItem,\n Selectable extends SelectableBase = {\n [K in keyof With['shape']]: {\n as: StringKey<K>;\n column: With['shape'][K];\n };\n },\n> = {\n q: QueryData;\n table: With['table'];\n clone<T extends QueryBase>(this: T): T;\n selectable: Selectable & {\n [K in keyof Selectable as `${With['table']}.${StringKey<K>}`]: Selectable[K];\n };\n shape: With['shape'];\n result: With['shape'];\n baseQuery: Query;\n relations: RelationsBase;\n withData: WithDataBase;\n meta: QueryBase['meta'];\n internal: QueryInternal;\n returnType: QueryReturnType;\n};\n\n/**\n * Map the first argument of `join` or `joinLateral` to a query type.\n *\n * `with` table arg is mapped into `QueryBase`,\n * query arg is returned as is,\n * relation name is replaced with a relation table.\n */\ntype JoinArgToQuery<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n> = Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? JoinWithArgToQuery<T['withData'][Arg]>\n : never\n : Arg extends Query\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['table']\n : never;\n\n/**\n * Type of the `join` callback (not `joinLateral`).\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * The query builder is limited to `or` and `where` methods only.\n *\n * Callback must return a query builder.\n */\nexport type JoinCallback<T extends QueryBase, Arg extends JoinFirstArg<T>> = (\n q: OnQueryBuilder<T, JoinArgToQuery<T, Arg>>,\n) => OnQueryBuilder;\n\n/**\n * Type of the `joinLateral`.\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * Query builder inside callback is the query derived from the `joinLateral` first argument,\n * all query methods are allowed, `on` methods are available.\n *\n * The callback must return a query object. Its resulting type will become a type of the joined table.\n */\nexport type JoinLateralCallback<\n T extends QueryBase,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n Q extends QueryBase = JoinArgToQuery<T, Arg>,\n> = (q: Q & OnQueryBuilder<T, Q>) => R;\n\nexport class Join {\n /**\n * ## Select relation\n *\n * Before joining a table, consider if selecting a relation is enough for your case:\n *\n * ```ts\n * // select users with profiles\n * // result type is Array<{ name: string, profile: Profile }>\n * await db.user.select('name', {\n * profile: (q) => q.profile,\n * });\n *\n * // select posts with counts of comments, order by comments count\n * // result type is Array<Post & { commentsCount: number }>\n * await db.post\n * .select('*', {\n * commentsCount: (q) => q.comments.count(),\n * })\n * .order({\n * commentsCount: 'DESC',\n * });\n *\n * // select authors with array of their book titles\n * // result type is Array<Author & { books: string[] }>\n * await db.author.select('*', {\n * books: (q) => q.books.pluck('title'),\n * });\n * ```\n *\n * Internally, such selects will use `LEFT JOIN LATERAL` to join a relation.\n * If you're loading users with profiles (one-to-one relation), and some users don't have a profile, `profile` property will have `NULL` for such users.\n * If you want to load only users that have profiles, and filter out the rest, add `.join()` method to the relation without arguments:\n *\n * ```ts\n * // load only users who have a profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join(),\n * });\n *\n * // load only users who have a specific profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join().where({ age: { gt: 20 } }),\n * });\n * ```\n *\n * You can also use this `.join()` method on the one-to-many relations, and records with empty array will be filtered out:\n *\n * ```ts\n * // posts that have no tags won't be loaded\n * // result type is Array<Post & { tags: Tag[] }>\n * db.post.select('*', {\n * tags: (q) => q.tags.join(),\n * });\n * ```\n *\n * # Joins\n *\n * `join` methods allows to join other tables, relations by name, [with](/guide/advanced-queries#with) statements, sub queries.\n *\n * All the `join` methods accept the same arguments, but returning type is different because with `join` it's guaranteed to load joined table, and with `leftJoin` the joined table columns may be `NULL` when no matching record was found.\n *\n * For the following examples, imagine we have a `User` table with `id` and `name`, and `Message` table with `id`, `text`, messages belongs to user via `userId` column:\n *\n * ```ts\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(),\n * }));\n *\n * relations = {\n * messages: this.hasMany(() => MessageTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n *\n * export class MessageTable extends BaseTable {\n * readonly table = 'message';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * text: t.text(),\n * ...t.timestamps(),\n * }));\n *\n * relations = {\n * user: this.belongsTo(() => UserTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n * ```\n *\n * ## join\n *\n * `join` is a method for SQL `JOIN`, which is equivalent to `INNER JOIN`, `LEFT INNERT JOIN`.\n *\n * When no matching record is found, it will skip records of the main table.\n *\n * ### join relation\n *\n * When relations are defined between the tables, you can join them by a relation name.\n * Joined table can be references from `where` and `select` by a relation name.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * // after joining a table, we can use it in `where` conditions:\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select(\n * 'name', // name is User column, table name may be omitted\n * 'messages.text', // text is the Message column, and the table name is required\n * );\n *\n * // result has the following type:\n * const ok: { name: string; text: string }[] = result;\n * ```\n *\n * The first argument can also be a callback, where instead of relation name as a string we're picking it as a property of `q`.\n * In such a way, we can alias the relation with `as`, add `where` conditions, use other query methods.\n *\n * ```ts\n * const result = await db.user.join((q) =>\n * q.messages.as('m').where({ text: 'some text' }),\n * );\n * ```\n *\n * Optionally, you can pass a second callback argument, it makes `on` and `orOn` methods available.\n *\n * But remember that when joining a relation, the needed `ON` conditions are already handled automatically.\n *\n * ```ts\n * const result = await db.user.join(\n * (q) => q.messages.as('m'),\n * (q) =>\n * q\n * .on('text', 'name') // additionally, match message with user name\n * .where({ text: 'some text' }), // you can add `where` in a second callback as well.\n * );\n * ```\n *\n * ### Selecting full joined records\n *\n * `select` supports selecting a full record of a previously joined table by passing a table name with `.*` at the end:\n *\n * ```ts\n * const result = await db.book.join('author').select('title', {\n * author: 'author.*',\n * });\n *\n * // result has the following type:\n * const ok: {\n * // title of the book\n * title: string;\n * // a full author record is included:\n * author: { id: number; name: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * It works fine for `1:1` (`belongsTo`, `hasOne`) relations, but it may have an unexpected result for `1:M` or `M:M` (`hasMany`, `hasAndBelongsToMany`) relations.\n * For any kind of relation, it results in one main table record with data of exactly one joined table record, i.e. when selecting in this way, the records **won't** be collected into arrays.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select('name', { messages: 'messages.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * messages: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * Because it's a one-to-many relation, one user has many messages, the user data will be duplicated for different messages data:\n *\n * | name | msg |\n * | ------ | ------------------------------ |\n * | user 1 | `{ id: 1, text: 'message 1' }` |\n * | user 1 | `{ id: 2, text: 'message 2' }` |\n * | user 1 | `{ id: 3, text: 'message 3' }` |\n *\n * ### join table\n *\n * If relation wasn't defined, provide a `db.table` instance and specify columns for the join.\n * Joined table can be references from `where` and `select` by a table name.\n *\n * ```ts\n * // Join message where userId = id:\n * db.user\n * .join(db.message, 'userId', 'id')\n * .where({ 'message.text': { startsWith: 'Hi' } })\n * .select('name', 'message.text');\n * ```\n *\n * Columns in the join list may be prefixed with table names for clarity:\n *\n * ```ts\n * db.user.join(db.message, 'message.userId', 'user.id');\n * ```\n *\n * Joined table can have an alias for referencing it further:\n *\n * ```ts\n * db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', 'm.text');\n * ```\n *\n * Joined table can be selected as an object as well as the relation join above:\n *\n * ```ts\n * const result = await db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', { msg: 'm.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * You can provide a custom comparison operator\n *\n * ```ts\n * db.user.join(db.message, 'userId', '!=', 'id');\n * ```\n *\n * Join can accept raw SQL for the `ON` part of join:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\") = lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * Join can accept raw SQL instead of columns:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\")`,\n * db.user.sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * db.user.sql`lower(\"message\".\"text\")`,\n * '!=',\n * db.user.sql`lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * To join based on multiple columns, you can provide an object where keys are joining table columns, and values are main table columns or a raw SQL:\n *\n * ```ts\n * db.user.join(db.message, {\n * userId: 'id',\n *\n * // with table names:\n * 'message.userId': 'user.id',\n *\n * // value can be a raw SQL expression:\n * text: db.user.sql`lower(\"user\".\"name\")`,\n * });\n * ```\n *\n * Join all records without conditions by providing `true`:\n *\n * ```ts\n * db.user.join(db.message, true);\n * ```\n *\n * Join methods can accept a callback with a special query builder that has `on` and `orOn` methods for handling advanced cases:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * (q) =>\n * q\n * // left column is the db.message column, right column is the db.user column\n * .on('userId', 'id')\n * // table names can be provided:\n * .on('message.userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'id') // where message.userId = user.id\n * .orOn('text', 'name'), // or message.text = user.name\n * );\n * ```\n *\n * Join query builder supports all `where` methods: `.where`, `.whereIn`, `.whereExists`, and all `.or`, `.not`, and `.orNot` forms.\n *\n * Column names in the where conditions are applied for the joined table, but you can specify a table name to add a condition for the main table.\n *\n * ```ts\n * db.user.join(db.message, (q) =>\n * q\n * .on('userId', 'id')\n * .where({\n * // not prefixed column name is for joined table:\n * text: { startsWith: 'hello' },\n * // specify a table name to set condition on the main table:\n * 'user.name': 'Bob',\n * })\n * // id is a column of a joined table Message\n * .whereIn('id', [1, 2, 3])\n * // condition for id of a user\n * .whereIn('user.id', [4, 5, 6]),\n * );\n * ```\n *\n * The query above will generate the following SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN \"message\"\n * ON \"message\".\"userId\" = \"user\".\"id\"\n * AND \"message\".\"text\" ILIKE 'hello%'\n * AND \"user\".\"name\" = 'Bob'\n * AND \"message\".\"id\" IN (1, 2, 3)\n * AND \"user\".\"id\" IN (4, 5, 6)\n * ```\n *\n * The join argument can be a query with `select`, `where`, and other methods. In such case, it will be handled as a sub query:\n *\n * ```ts\n * db.user.join(\n * db.message\n * .select('id', 'userId', 'text')\n * .where({ text: { startsWith: 'Hi' } })\n * .as('t'),\n * 'userId',\n * 'id',\n * );\n * ```\n *\n * It will produce such SQL:\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN (\n * SELECT \"t\".\"id\", \"t\".\"userId\", \"t\".\"text\"\n * FROM \"message\" AS \"t\"\n * ) \"t\" ON \"t\".\"userId\" = \"user\".\"id\"\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, true>;\n /**\n * A join variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n join(this: Query, ...args: any) {\n return _join(this.clone(), true, 'JOIN', args);\n }\n _join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, true>;\n _join<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _join(this: Query, ...args: any) {\n return _join(this, true, 'JOIN', args);\n }\n\n /**\n * `leftJoin` is a method for SQL `LEFT JOIN`, which is equivalent to `OUTER JOIN`, `LEFT OUTER JOIN`.\n *\n * When no matching record is found, it will fill joined table columns with `NULL` values in the result rows.\n *\n * Works just like `join`, except for result type that may have `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoin('messages')\n * .select('name', 'messages.text');\n *\n * // the same query, but joining table explicitly\n * const result2: typeof result = await db.user\n * .leftJoin(db.message, 'userId', 'id')\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, true>;\n /**\n * A `leftJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n leftJoin(this: Query, ...args: any) {\n return _join(this.clone(), false, 'LEFT JOIN', args);\n }\n _leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, true>;\n _leftJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, true, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _leftJoin(this: Query, ...args: any) {\n return _join(this, false, 'LEFT JOIN', args);\n }\n\n /**\n * `rightJoin` is a method for SQL `RIGHT JOIN`, which is equivalent to `RIGHT OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, and fill the main table columns with `null` when no match is found.\n *\n * The columns of the table you're joining to are becoming nullable when using `rightJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // even though name is not a nullable column, it becomes nullable after using rightJoin\n * const ok: { name: string | null; text: string }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, false>;\n /**\n * A `rightJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rightJoin(this: Query, ...args: any) {\n return _join(this.clone(), true, 'RIGHT JOIN', args);\n }\n _rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, true, false>;\n _rightJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, true, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _rightJoin(this: Query, ...args: any) {\n return _join(this, true, 'RIGHT JOIN', args);\n }\n\n /**\n * `fullJoin` is a method for SQL `FULL JOIN`, which is equivalent to `FULL OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, both sides of the join may result in `null` values when there is no match.\n *\n * All columns become nullable after using `fullJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // all columns can be null\n * const ok: { name: string | null; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, false>;\n /**\n * A `fullJoin` variant accepting a {@link JoinCallback}, see {@link join} for full info.\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinCallback}\n */\n fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fullJoin(this: Query, ...args: any) {\n return _join(this.clone(), false, 'FULL JOIN', args);\n }\n _fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(this: T, arg: Arg, ...args: Args): JoinResult<T, Arg, false, false>;\n _fullJoin<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallback<T, Arg>,\n >(this: T, arg: Arg, cb: Cb): JoinResult<T, Arg, false, false, Cb>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _fullJoin(this: Query, ...args: any) {\n return _join(this, false, 'FULL JOIN', args);\n }\n\n /**\n * `joinLateral` allows joining a table with a sub-query that can reference the main table of current query and the other joined tables.\n *\n * Regular `JOIN` also can have a sub-query in its definition, but it cannot reference other tables of this query.\n *\n * `JOIN LATERAL` of Postgres can have conditions in the `ON` statement, but `Orchid ORM` decided that there are no useful use-cases for such conditions, and it is only building a sub-query.\n *\n * First argument is the other table you want to join, or a name of relation, or a name of `with` defined table.\n *\n * Second argument is a callback where you can reference other tables using `on` and `orOn`, select columns, do `where` conditions, and use any other query methods to build a sub-query.\n *\n * ```ts\n * // joinLateral a Message table, alias it as `m`\n * // without aliasing you can refer to the message by a table name\n * User.joinLateral(Message.as('m'), (q) =>\n * q\n * // select message columns\n * .select('text')\n * // join the message to the user, column names can be prefixed with table names\n * .on('authorId', 'id')\n * // message columns are available without prefixing,\n * // outer table columns are available with a table name\n * .where({ text: 'some text', 'user.name': 'name' })\n * .order({ createdAt: 'DESC' }),\n * )\n * // only selected message columns are available in select and where\n * .select('id', 'name', 'm.text')\n * .where({ 'm.text': messageData.text });\n * ```\n *\n * As well as simple `join`, `joinLateral` can select an object of full joined record:\n *\n * ```ts\n * // join by relation name\n * const result = await User.joinLateral(\n * 'messages',\n * (q) => q.as('message'), // alias to 'message'\n * ).select('name', { message: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * message: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * `message` can be aliased withing the `select` as well as in case of a simple `join`:\n *\n * ```ts\n * // join by relation name\n * const result = await User.joinLateral(\n * 'messages',\n * (q) => q.as('message'), // alias to 'message'\n * ).select('name', { msg: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinLateralCallback}\n */\n joinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, true> {\n return _joinLateral<T, Arg, R, true>(this.clone(), 'JOIN', arg, cb);\n }\n _joinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, true> {\n return _joinLateral<T, Arg, R, true>(this, 'JOIN', arg, cb);\n }\n\n /**\n * The same as {@link joinLateral}, but when no records found for the join it will result in `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoinLateral('messages', (q) => q.as('message'))\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - {@link JoinLateralCallback}\n */\n leftJoinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, false> {\n return _joinLateral<T, Arg, R, false>(this.clone(), 'LEFT JOIN', arg, cb);\n }\n _leftJoinLateral<\n T extends Query,\n Arg extends JoinFirstArg<T>,\n R extends QueryBase,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, R>,\n ): JoinLateralResult<T, R, false> {\n return _joinLateral<T, Arg, R, false>(this, 'LEFT JOIN', arg, cb);\n }\n}\n\n// Arguments of `on` and `orOn` methods inside `join` callback.\n// Takes a pair of columns to check them for equality, or a pair of columns separated with an operator such as '!='.\ntype OnArgs<Q extends { selectable: SelectableBase }> =\n | [leftColumn: keyof Q['selectable'], rightColumn: keyof Q['selectable']]\n | [\n leftColumn: keyof Q['selectable'],\n op: string,\n rightColumn: keyof Q['selectable'],\n ];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: QueryBase,\n joinFrom: QueryBase,\n args: OnArgs<QueryBase>,\n) => {\n return {\n ON: {\n joinTo,\n joinFrom,\n on: args,\n },\n };\n};\n\n// Add `ON` statement.\nexport const pushQueryOn = <T extends QueryBase>(\n q: T,\n joinFrom: QueryBase,\n joinTo: QueryBase,\n ...on: OnArgs<QueryBase>\n): T => {\n return pushQueryValue(q, 'and', makeOnItem(joinFrom, joinTo, on));\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn: typeof pushQueryOn = (\n q,\n joinFrom,\n joinTo,\n ...on\n) => {\n return pushQueryValue(q, 'or', [makeOnItem(joinFrom, joinTo, on)]);\n};\n\n// Used by the ORM to join relations.\n// Adds a shape of relation to the `joinedShapes`, and adds an `on` statement.\nexport const addQueryOn = <T extends QueryBase>(\n q: T,\n joinFrom: QueryBase,\n joinTo: QueryBase,\n ...args: OnArgs<QueryBase>\n): T => {\n const cloned = q.clone() as typeof q;\n setQueryObjectValue(\n cloned,\n 'joinedShapes',\n (joinFrom.q.as || joinFrom.table) as string,\n joinFrom.q.shape,\n );\n return pushQueryOn(cloned, joinFrom, joinTo, ...args);\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<T extends QueryBase> = [\n leftColumn: keyof T['selectable'],\n leftPath: string,\n rightColumn: keyof T['selectable'],\n rightPath: string,\n];\n\n// Query builder with `or` methods that is passed to the `join` and `joinLateral` callbacks.\nexport class OnQueryBuilder<\n S extends QueryBase = QueryBase,\n J extends QueryBase = QueryBase,\n> extends WhereQueryBase {\n declare selectable: J['selectable'] & Omit<S['selectable'], keyof S['shape']>;\n declare relations: J['relations'];\n declare result: J['result'];\n shape: J['shape'];\n baseQuery: Query;\n withData = emptyObject;\n internal: QueryInternal;\n\n constructor(\n q: QueryBase,\n { shape, joinedShapes }: Pick<QueryData, 'shape' | 'joinedShapes'>,\n joinTo: QueryBase,\n ) {\n super();\n this.internal = q.internal;\n this.table = typeof q === 'object' ? q.table : q;\n this.shape = shape;\n this.q = {\n shape: shape as ColumnsShapeBase,\n joinedShapes,\n } as QueryData;\n this.baseQuery = this as unknown as Query;\n if (typeof q === 'object' && q.q.as) {\n this.q.as = q.q.as;\n }\n this.q.joinTo = joinTo;\n }\n\n /**\n * Use `on` to specify columns to join records.\n *\n * ```ts\n * q\n * // left column is the db.message column, right column is the db.user column\n * .on('userId', 'id')\n * // table names can be provided:\n * .on('message.userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'id') // where message.userId = user.id\n * ```\n *\n * @param args - columns to join with\n */\n on<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return this.clone()._on(...args);\n }\n _on<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return pushQueryOn(this, this.q.joinTo as QueryBase, this, ...args);\n }\n\n /**\n * Works as {@link on}, but the added conditions will be separated from previous with `OR`.\n *\n * @param args - columns to join with\n */\n orOn<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return this.clone()._orOn(...args);\n }\n _orOn<T extends OnQueryBuilder>(this: T, ...args: OnArgs<T>): T {\n return pushQueryOrOn(this, this.q.joinTo as QueryBase, this, ...args);\n }\n\n /**\n * Use `onJsonPathEquals` to join record based on a field of their JSON column:\n *\n * ```ts\n * db.table.join(db.otherTable, (q) =>\n * // '$.key' is a JSON path\n * q.onJsonPathEquals('otherTable.data', '$.key', 'table.data', '$.key'),\n * );\n * ```\n *\n * @param args - columns and JSON paths to join with.\n */\n onJsonPathEquals<T extends OnQueryBuilder>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T>\n ): T {\n return this.clone()._onJsonPathEquals(...args);\n }\n _onJsonPathEquals<T extends OnQueryBuilder>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T>\n ): T {\n return pushQueryValue(this, 'and', { ON: args });\n }\n}\n","import {\n AddQuerySelect,\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../query/query';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { ColumnType, StringColumn } from '../columns';\nimport { JsonItem, SelectQueryData } from '../sql';\nimport { StringKey, ColumnTypeBase } from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\nimport { RawSQL } from '../sql/rawSql';\n\n// union of column names that have a `jsonb` type\ntype JsonColumnName<T extends QueryBase> = StringKey<\n {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['dataType'] extends 'jsonb'\n ? K\n : never;\n }[keyof T['selectable']]\n>;\n\n// union of `jsonb` column names, or a JsonItem type for nesting json methods one in other\ntype ColumnOrJsonMethod<T extends QueryBase> = JsonColumnName<T> | JsonItem;\n\n// result of `jsonSet`:\n// adds a select to a query,\n// adds a `JsonItem` properties that allows nesting of json methods\ntype JsonSetResult<\n T extends QueryBase,\n Column extends ColumnOrJsonMethod<T>,\n As extends string,\n Type extends ColumnTypeBase = Column extends keyof T['shape']\n ? T['shape'][Column]\n : Column extends JsonItem\n ? Column['__json'][2]\n : ColumnTypeBase,\n> = JsonItem<As, Type> & AddQuerySelect<T, Record<As, Type>>;\n\n// result of `jsonPathQuery`:\n// adds a select to a query,\n// adds a `JsonItem` properties that allows nesting of json methods\ntype JsonPathQueryResult<\n T extends QueryBase,\n As extends string,\n Type extends ColumnType,\n> = JsonItem &\n AddQuerySelect<\n T,\n {\n [K in As]: Type;\n }\n >;\n\nexport abstract class JsonModifiers extends QueryBase {\n /**\n * Return a JSON value/object/array where a given value is set at the given path.\n * The path is an array of keys to access the value.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * const result = await db.table.jsonSet('data', ['name'], 'new value').take();\n *\n * expect(result.data).toEqual({ name: 'new value' });\n * ```\n *\n * Optionally takes parameters of type `{ as?: string, createIfMissing?: boolean }`\n *\n * ```ts\n * await db.table.jsonSet('data', ['name'], 'new value', {\n * as: 'alias', // select data as `alias`\n * createIfMissing: true, // ignored if missing by default\n * });\n * ```\n *\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to value inside the json\n * @param value - value to set into the json\n * @param options - `as` to alias the json value when selecting, `createIfMissing: true` will create a new JSON property if it didn't exist before\n */\n jsonSet<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n createIfMissing?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonSet(column, path, value, options);\n }\n _jsonSet<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n createIfMissing?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'set',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n value,\n options,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Return a JSON value/object/array where a given value is inserted at the given JSON path. Value can be a single value or JSON object. If a value exists at the given path, the value is not replaced.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * // imagine user has data = { tags: ['two'] }\n * const result = await db.table.jsonInsert('data', ['tags', 0], 'one').take();\n *\n * // 'one' is inserted to 0 position\n * expect(result.data).toEqual({ tags: ['one', 'two'] });\n * ```\n *\n * Optionally takes parameters of type `{ as?: string, insertAfter?: boolean }`\n *\n * ```ts\n * // imagine user has data = { tags: ['one'] }\n * const result = await db.table\n * .jsonInsert('data', ['tags', 0], 'two', {\n * as: 'alias', // select as an alias\n * insertAfter: true, // insert after the specified position\n * })\n * .take();\n *\n * // 'one' is inserted to 0 position\n * expect(result.alias).toEqual({ tags: ['one', 'two'] });\n * ```\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to the array inside the json, last path element is index to insert into\n * @param value - value to insert into the json array\n * @param options - `as` to alias the json value when selecting, `insertAfter: true` to insert after the specified position\n */\n jsonInsert<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n insertAfter?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonInsert(column, path, value, options);\n }\n _jsonInsert<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n value: unknown,\n options?: {\n as?: As;\n insertAfter?: boolean;\n },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'insert',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n value,\n options,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Return a JSON value/object/array where a given value is removed at the given JSON path.\n *\n * Can be used in `update` callback.\n *\n * ```ts\n * // imagine a user has data = { tags: ['one', 'two'] }\n * const result = await db.table\n * .jsonRemove(\n * 'data',\n * ['tags', 0],\n * // optional parameters:\n * {\n * as: 'alias', // select as an alias\n * },\n * )\n * .take();\n *\n * expect(result.alias).toEqual({ tags: ['two'] });\n * ```\n *\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - path to the array inside the json, last path element is index to remove this element\n * @param options - `as` to alias the json value when selecting\n */\n jsonRemove<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n options?: { as?: As },\n ): JsonSetResult<T, Column, As> {\n const q = this.clone() as T;\n return q._jsonRemove(column, path, options);\n }\n _jsonRemove<\n T extends JsonModifiers,\n Column extends ColumnOrJsonMethod<T>,\n As extends string = Column extends JsonItem ? Column['__json'][1] : Column,\n >(\n this: T,\n column: Column,\n path: Array<string | number>,\n options?: { as?: As },\n ): JsonSetResult<T, Column, As> {\n const json: JsonItem = {\n __json: [\n 'remove',\n options?.as ??\n (typeof column === 'string'\n ? column\n : (column as JsonItem).__json[1]),\n typeof column === 'string'\n ? this.q.shape[column]\n : (column as JsonItem).__json[2],\n column,\n path,\n ],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonSetResult<T, Column, As>;\n }\n\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * ```ts\n * import { columnTypes } from 'pqb';\n *\n * db.table.jsonPathQuery(\n * columnTypes.text(3, 100), // type of the value\n * 'data', // name of the JSON column\n * '$.name', // JSON path\n * 'name', // select value as name\n *\n * // Optionally supports `vars` and `silent` options\n * // check Postgres docs for jsonb_path_query for details\n * {\n * vars: 'vars',\n * silent: true,\n * },\n * );\n * ```\n *\n * Nested JSON operations can be used in place of JSON column name:\n *\n * ```ts\n * db.table.jsonPathQuery(\n * columnTypes.text(3, 100),\n * // Available: .jsonSet, .jsonInsert, .jsonRemove\n * db.table.jsonSet('data', ['key'], 'value'),\n * '$.name',\n * 'name',\n * );\n * ```\n *\n * @param type - provide a column type to have a correct result type\n * @param column - name of JSON column, or a result of a nested json method\n * @param path - special JSON path string to reference a JSON value\n * @param as - optional alias for the selected value\n * @param options - supports `vars` and `silent`, check Postgres docs of `json_path_query` for these\n */\n jsonPathQuery<\n T extends JsonModifiers,\n As extends string,\n Type extends ColumnType,\n >(\n this: T,\n type: Type,\n column: ColumnOrJsonMethod<T>,\n path: string,\n as: As,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ): JsonPathQueryResult<T, As, Type> {\n const q = this.clone() as T;\n return q._jsonPathQuery(type, column, path, as, options);\n }\n _jsonPathQuery<\n T extends JsonModifiers,\n As extends string,\n Type extends ColumnType,\n >(\n this: T,\n type: Type,\n column: ColumnOrJsonMethod<T>,\n path: string,\n as: As,\n options?: {\n vars?: string;\n silent?: boolean;\n },\n ): JsonPathQueryResult<T, As, Type> {\n const json: JsonItem = {\n __json: ['pathQuery', as, type, column, path, options],\n };\n\n return Object.assign(\n pushQueryValue(this, 'select', json),\n json,\n ) as unknown as JsonPathQueryResult<T, As, Type>;\n }\n}\n\nexport abstract class JsonMethods {\n /**\n * Wraps the query in a way to select a single JSON string.\n * So that JSON encoding is done on a database side, and the application doesn't have to turn a response to a JSON.\n * It may be better for performance in some cases.\n *\n * ```ts\n * // json is a JSON string that you can directly send as a response.\n * const json = await db.table.select('id', 'name').json();\n * ```\n *\n * @param coalesce\n */\n json<T extends Query>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, StringColumn> {\n return this.clone()._json(coalesce);\n }\n _json<T extends Query>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, StringColumn> {\n const q = this._wrap(this.baseQuery.clone()) as unknown as T;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n q._getOptional(\n new RawSQL(\n queryTypeWithLimitOne[this.q.returnType]\n ? `row_to_json(\"t\".*)`\n : coalesce !== false\n ? `COALESCE(json_agg(row_to_json(\"t\".*)), '[]')`\n : 'json_agg(row_to_json(\"t\".*))',\n ),\n );\n\n // to skip LIMIT 1\n (q.q as SelectQueryData).returnsOne = true;\n\n return q as unknown as SetQueryReturnsColumnOptional<T, StringColumn>;\n }\n}\n","import { Query } from '../query/query';\nimport { quote } from '../quote';\nimport { Sql } from 'orchid-core';\n\nexport type QueryLogObject = {\n colors: boolean;\n beforeQuery(sql: Sql): unknown;\n afterQuery(sql: Sql, logData: unknown): void;\n onError(error: Error, sql: Sql, logData: unknown): void;\n};\n\nexport type QueryLogger = {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\nexport type QueryLogOptions = {\n log?: boolean | Partial<QueryLogObject>;\n logger?: QueryLogger;\n};\n\nexport const logColors = {\n boldCyanBright: (message: string) =>\n `\\u001b[1m\\u001b[96m${message}\\u001b[39m\\u001b[22m`,\n\n boldBlue: (message: string) =>\n `\\u001b[1m\\u001b[34m${message}\\u001b[39m\\u001b[22m`,\n\n boldYellow: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldMagenta: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldRed: (message: string) =>\n `\\u001b[1m\\u001b[31m${message}\\u001b[39m\\u001b[22m`,\n};\n\nconst makeMessage = (\n colors: boolean,\n timeColor: (message: string) => string,\n time: [number, number],\n sqlColor: (message: string) => string,\n sql: string,\n valuesColor: (message: string) => string,\n values: unknown[],\n): string => {\n const elapsed = process.hrtime(time);\n const formattedTime = `(${elapsed[0] ? `${elapsed[0]}s ` : ''}${(\n elapsed[1] / 1000000\n ).toFixed(1)}ms)`;\n\n const result = `${colors ? timeColor(formattedTime) : formattedTime} ${\n colors ? sqlColor(sql) : sql\n }`;\n\n if (!values.length) {\n return result;\n }\n\n const formattedValues = `[${values.map(quote).join(', ')}]`;\n\n return `${result} ${colors ? valuesColor(formattedValues) : formattedValues}`;\n};\n\nexport const logParamToLogObject = (\n logger: QueryLogger,\n log: QueryLogOptions['log'],\n): QueryLogObject | undefined => {\n if (!log) return;\n const logObject = Object.assign(\n {\n colors: true,\n beforeQuery() {\n return process.hrtime();\n },\n afterQuery(sql, time: [number, number]) {\n logger.log(\n makeMessage(\n colors,\n logColors.boldCyanBright,\n time,\n logColors.boldBlue,\n sql.text,\n logColors.boldYellow,\n sql.values,\n ),\n );\n },\n onError(error, sql, time: [number, number]) {\n const message = `Error: ${error.message}`;\n\n logger.error(\n `${makeMessage(\n colors,\n logColors.boldMagenta,\n time,\n logColors.boldRed,\n sql.text,\n logColors.boldYellow,\n sql.values,\n )} ${colors ? logColors.boldRed(message) : message}`,\n );\n },\n } as QueryLogObject,\n log === true ? {} : log,\n );\n\n const colors = logObject.colors;\n\n return logObject;\n};\n\nexport class QueryLog {\n log<T extends Query>(this: T, log = true): T {\n return this.clone()._log(log);\n }\n\n _log<T extends Query>(this: T, log = true): T {\n this.q.log = logParamToLogObject(this.q.logger, log);\n return this;\n }\n}\n","import { Query, QueryReturnType, GetQueryResult } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport {\n ColumnsShapeBase,\n getValueKey,\n MergeObjects,\n QueryCatch,\n QueryThen,\n} from 'orchid-core';\n\nexport type MergeQuery<\n T extends Query,\n Q extends Query,\n ReturnType extends QueryReturnType = QueryReturnType extends Q['returnType']\n ? T['returnType']\n : Q['returnType'],\n Result extends ColumnsShapeBase = T['meta']['hasSelect'] extends true\n ? Q['meta']['hasSelect'] extends true\n ? {\n [K in\n | keyof T['result']\n | keyof Q['result']]: K extends keyof Q['result']\n ? Q['result'][K]\n : T['result'][K];\n }\n : T['result']\n : Q['result'],\n Data = GetQueryResult<ReturnType, Result>,\n> = {\n [K in keyof T]: K extends 'meta'\n ? MergeObjects<T['meta'], Q['meta']>\n : K extends 'result'\n ? Result\n : K extends 'returnType'\n ? ReturnType\n : K extends 'then'\n ? QueryThen<Data>\n : K extends 'catch'\n ? QueryCatch<Data>\n : K extends 'selectable'\n ? MergeObjects<T['selectable'], Q['selectable']>\n : K extends 'windows'\n ? MergeObjects<T['windows'], Q['windows']>\n : K extends 'withData'\n ? MergeObjects<T['withData'], Q['withData']>\n : T[K];\n};\n\nconst mergableObjects: Record<string, boolean> = {\n shape: true,\n withShapes: true,\n parsers: true,\n defaults: true,\n joinedShapes: true,\n joinedParsers: true,\n};\n\nexport class MergeQueryMethods {\n merge<T extends Query, Q extends Query>(this: T, q: Q): MergeQuery<T, Q> {\n return this.clone()._merge(q);\n }\n _merge<T extends Query, Q extends Query>(this: T, q: Q): MergeQuery<T, Q> {\n const a = this.q as Record<string, unknown>;\n const b = q.q as Record<string, unknown>;\n\n for (const key in b) {\n const value = b[key];\n switch (typeof value) {\n case 'boolean':\n case 'string':\n case 'number':\n a[key] = value;\n break;\n case 'object':\n if (Array.isArray(value)) {\n a[key] = a[key] ? [...(a[key] as unknown[]), ...value] : value;\n } else if (mergableObjects[key]) {\n a[key] = a[key]\n ? { ...(a[key] as Record<string, unknown>), ...value }\n : value;\n } else {\n a[key] = value;\n }\n break;\n }\n }\n\n (a as SelectQueryData)[getValueKey] = (b as SelectQueryData)[getValueKey];\n\n if (b.returnType) a.returnType = b.returnType;\n\n return this as unknown as MergeQuery<T, Q>;\n }\n}\n","import { Query, QueryReturnType } from '../query/query';\nimport { NotFoundError, QueryError } from '../errors';\nimport { QueryArraysResult, QueryResult } from '../adapter';\nimport {\n CommonQueryData,\n QueryAfterHook,\n QueryBeforeHook,\n QueryHookSelect,\n} from '../sql';\nimport pg from 'pg';\nimport {\n AdapterBase,\n callWithThis,\n ColumnParser,\n ColumnsParsers,\n emptyArray,\n getValueKey,\n Sql,\n TransactionState,\n} from 'orchid-core';\n\nexport const queryMethodByReturnType: Record<\n QueryReturnType,\n 'query' | 'arrays'\n> = {\n all: 'query',\n rows: 'arrays',\n pluck: 'arrays',\n one: 'query',\n oneOrThrow: 'query',\n value: 'arrays',\n valueOrThrow: 'arrays',\n rowCount: 'arrays',\n void: 'arrays',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Resolve = (result: any) => any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Reject = (error: any) => any;\n\nexport class Then {\n then!: (this: Query, resolve?: Resolve, reject?: Reject) => Promise<unknown>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n catch(this: Query, fn: (reason: any) => unknown) {\n return this.then(undefined, fn);\n }\n}\n\n// For storing error with the stacktrace leading to the code which calls `await query`,\n// using it later when catching query error.\nlet queryError: Error = undefined as unknown as Error;\n\n// `query.then` getter: it must be a getter to store the error with stacktrace prior to executing `await`.\nlet getThen: (this: Query) => typeof Then.prototype.then;\n\n// workaround for the bun issue: https://github.com/romeerez/orchid-orm/issues/198\nif (process.versions.bun) {\n getThen = function (this: Query) {\n queryError = new Error();\n\n // In rake-db `then` might be called on a lightweight query object that has no `internal`.\n if (!this.internal) return maybeWrappedThen;\n\n // Value in the store exists only before the call of the returned function.\n const trx = this.internal.transactionStorage.getStore();\n if (!trx) return maybeWrappedThen;\n\n return (resolve, reject) => {\n // Here `transactionStorage.getStore()` returns undefined,\n // need to set the `trx` value to the store to workaround the bug.\n return this.internal.transactionStorage.run(trx, () => {\n return maybeWrappedThen.call(this, resolve, reject);\n });\n };\n };\n} else {\n getThen = function () {\n queryError = new Error();\n return maybeWrappedThen;\n };\n}\n\nObject.defineProperty(Then.prototype, 'then', {\n get: getThen,\n set(value) {\n Object.defineProperty(this, 'then', {\n value,\n });\n },\n});\n\nexport const handleResult: CommonQueryData['handleResult'] = (\n q,\n returnType,\n result: QueryResult,\n isSubQuery?: true,\n) => {\n return parseResult(q, q.q.parsers, returnType, result, isSubQuery);\n};\n\nfunction maybeWrappedThen(\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n): Promise<unknown> {\n const { q } = this;\n\n let beforeHooks: QueryBeforeHook[] | undefined;\n let afterHooks: QueryAfterHook[] | undefined;\n let afterCommitHooks: QueryAfterHook[] | undefined;\n if (q.type) {\n if (q.type === 'insert') {\n beforeHooks = q.beforeCreate;\n afterHooks = q.afterCreate;\n afterCommitHooks = q.afterCreateCommit;\n } else if (q.type === 'update') {\n beforeHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterCommitHooks = q.afterUpdateCommit;\n } else if (q.type === 'delete') {\n beforeHooks = q.beforeDelete;\n afterHooks = q.afterDelete;\n afterCommitHooks = q.afterDeleteCommit;\n }\n }\n\n const trx = this.internal.transactionStorage.getStore();\n if ((q.wrapInTransaction || afterHooks) && !trx) {\n return this.transaction(\n () =>\n new Promise((resolve, reject) => {\n const trx =\n this.internal.transactionStorage.getStore() as TransactionState;\n return then(\n this,\n trx.adapter,\n trx,\n beforeHooks,\n afterHooks,\n afterCommitHooks,\n resolve,\n reject,\n );\n }),\n ).then(resolve, reject);\n } else {\n return then(\n this,\n trx?.adapter || this.q.adapter,\n trx,\n beforeHooks,\n afterHooks,\n afterCommitHooks,\n resolve,\n reject,\n );\n }\n}\n\nconst queriesNames: Record<string, string> = {};\nlet nameI = 0;\n\nconst callAfterHook = function (\n this: [result: unknown[], q: Query],\n cb: QueryAfterHook,\n): Promise<unknown> | unknown {\n return cb(this[0], this[1]);\n};\n\nconst then = async (\n q: Query,\n adapter: AdapterBase,\n trx?: TransactionState,\n beforeHooks?: QueryBeforeHook[],\n afterHooks?: QueryAfterHook[],\n afterCommitHooks?: QueryAfterHook[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve?: (result: any) => any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reject?: (error: any) => any,\n): Promise<unknown> => {\n const { q: query } = q;\n\n let sql: (Sql & { name?: string }) | undefined;\n let logData: unknown | undefined;\n\n // save error to a local variable before async operations\n const localError = queryError;\n\n try {\n if (beforeHooks || query.before) {\n await Promise.all(\n [...(beforeHooks || emptyArray), ...(query.before || emptyArray)].map(\n callWithThis,\n q,\n ),\n );\n }\n\n sql = q.toSQL();\n const { hookSelect } = sql;\n\n if (query.autoPreparedStatements) {\n sql.name =\n queriesNames[sql.text] ||\n (queriesNames[sql.text] = (nameI++).toString(36));\n }\n\n if (query.log) {\n logData = query.log.beforeQuery(sql);\n }\n\n const { returnType = 'all' } = query;\n const returns = hookSelect ? 'all' : returnType;\n\n const queryResult = (await adapter[\n hookSelect ? 'query' : (queryMethodByReturnType[returnType] as 'query')\n ](sql)) as QueryResult;\n\n if (query.patchResult) {\n await query.patchResult(q, queryResult);\n }\n\n if (query.log) {\n query.log.afterQuery(sql, logData);\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n }\n\n let result = query.handleResult(q, returns, queryResult);\n\n if (afterHooks || afterCommitHooks || query.after) {\n if (queryResult.rowCount) {\n if (afterHooks || query.after) {\n const args = [result, q];\n await Promise.all(\n [...(afterHooks || emptyArray), ...(query.after || emptyArray)].map(\n callAfterHook,\n args,\n ),\n );\n }\n\n // afterCommitHooks are executed later after transaction commit,\n // or, if we don't have transaction, they are executed intentionally after other after hooks\n if (afterCommitHooks && trx) {\n (trx.afterCommit ??= []).push(\n result as unknown[],\n q,\n afterCommitHooks,\n );\n } else if (afterCommitHooks) {\n const args = [result, q];\n await Promise.all(afterCommitHooks.map(callAfterHook, args));\n }\n } else if (query.after) {\n const args = [result, q];\n await Promise.all(query.after.map(callAfterHook, args));\n }\n\n if (hookSelect)\n result = filterResult(q, returnType, queryResult, hookSelect, result);\n }\n\n if (query.transform) {\n for (const fn of query.transform) {\n result = fn(result);\n }\n }\n\n return resolve?.(result);\n } catch (err) {\n let error;\n if (err instanceof pg.DatabaseError) {\n error = new (q.error as unknown as new () => QueryError)();\n assignError(error, err);\n error.cause = localError;\n } else {\n error = err;\n if (error instanceof Error) {\n error.cause = localError;\n }\n }\n\n if (query.log && sql) {\n query.log.onError(error as Error, sql, logData);\n }\n return reject?.(error);\n }\n};\n\nconst assignError = (to: QueryError, from: pg.DatabaseError) => {\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n\n return to;\n};\n\nexport const parseResult = (\n q: Query,\n parsers: ColumnsParsers | undefined,\n returnType: QueryReturnType | undefined = 'all',\n result: QueryResult,\n isSubQuery?: boolean,\n): unknown => {\n switch (returnType) {\n case 'all': {\n if (q.q.throwOnNotFound && result.rows.length === 0)\n throw new NotFoundError(q);\n\n const { rows } = result;\n if (parsers) {\n for (const row of rows) {\n parseRecord(parsers, row);\n }\n }\n return rows;\n }\n case 'one': {\n const row = result.rows[0];\n if (!row) return;\n\n return parsers ? parseRecord(parsers, row) : row;\n }\n case 'oneOrThrow': {\n const row = result.rows[0];\n if (!row) throw new NotFoundError(q);\n\n return parsers ? parseRecord(parsers, row) : row;\n }\n case 'rows': {\n return parsers\n ? parseRows(\n parsers,\n (result as unknown as QueryArraysResult).fields,\n result.rows,\n )\n : result.rows;\n }\n case 'pluck': {\n const pluck = parsers?.pluck;\n if (pluck) {\n return result.rows.map(isSubQuery ? pluck : (row) => pluck(row[0]));\n } else if (isSubQuery) {\n return result.rows;\n }\n return result.rows.map((row) => row[0]);\n }\n case 'value': {\n const value = result.rows[0]?.[0];\n return value !== undefined\n ? parseValue(value, parsers)\n : q.q.notFoundDefault;\n }\n case 'valueOrThrow': {\n const value = result.rows[0]?.[0];\n if (value === undefined) throw new NotFoundError(q);\n return parseValue(value, parsers);\n }\n case 'rowCount': {\n if (q.q.throwOnNotFound && result.rowCount === 0) {\n throw new NotFoundError(q);\n }\n return result.rowCount;\n }\n case 'void': {\n return;\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const parseRecord = (parsers: ColumnsParsers, row: any) => {\n for (const key in parsers) {\n if (key in row) {\n row[key] = (parsers[key] as ColumnParser)(row[key]);\n }\n }\n return row;\n};\n\nconst parseRows = (\n parsers: ColumnsParsers,\n fields: { name: string }[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rows: any[],\n) => {\n for (let i = fields.length - 1; i >= 0; i--) {\n const parser = parsers[fields[i].name];\n if (parser) {\n for (const row of rows) {\n row[i] = parser(row[i]);\n }\n }\n }\n return rows;\n};\n\nconst parseValue = (value: unknown, parsers?: ColumnsParsers) => {\n const parser = parsers?.[getValueKey];\n return parser ? parser(value) : value;\n};\n\nconst filterResult = (\n q: Query,\n returnType: QueryReturnType,\n queryResult: QueryResult,\n hookSelect: QueryHookSelect,\n result: unknown,\n): unknown => {\n if (returnType === 'all') {\n const pick = getSelectPick(queryResult, hookSelect);\n return (result as unknown[]).map((full) => {\n const filtered: Record<string, unknown> = {};\n for (const key of pick) {\n filtered[key] = (full as Record<string, unknown>)[key];\n }\n return filtered;\n });\n }\n\n if (returnType === 'oneOrThrow' || returnType === 'one') {\n const row = (result as unknown[])[0];\n if (!row) {\n if (returnType === 'oneOrThrow') throw new NotFoundError(q);\n return undefined;\n } else {\n result = {};\n for (const key in row) {\n if (!hookSelect.includes(key)) {\n (result as Record<string, unknown>)[key] = (\n row as Record<string, unknown>\n )[key];\n }\n }\n return result;\n }\n }\n\n if (returnType === 'value') {\n return (result as Record<string, unknown>[])[0]?.[\n queryResult.fields[0].name\n ];\n }\n\n if (returnType === 'valueOrThrow') {\n const row = (result as Record<string, unknown>[])[0];\n if (!row) throw new NotFoundError(q);\n return row[queryResult.fields[0].name];\n }\n\n if (returnType === 'rowCount') {\n return queryResult.rowCount;\n }\n\n if (returnType === 'pluck') {\n const key = queryResult.fields[0].name;\n return (result as Record<string, unknown>[]).map((row) => row[key]);\n }\n\n if (returnType === 'rows') {\n const pick = getSelectPick(queryResult, hookSelect);\n return (result as unknown[]).map((full) =>\n pick.map((key) => (full as Record<string, unknown>)[key]),\n );\n }\n\n return;\n};\n\nconst getSelectPick = (\n queryResult: QueryResult,\n hookSelect: QueryHookSelect,\n): string[] => {\n const pick: string[] = [];\n for (const field of queryResult.fields) {\n if (!hookSelect.includes(field.name)) pick.push(field.name);\n }\n return pick;\n};\n","import { WithOptions } from '../sql';\nimport { AddQueryWith, Query } from '../query/query';\nimport { Db } from '../query/db';\nimport { pushQueryValue, setQueryObjectValue } from '../query/queryUtils';\nimport {\n isExpression,\n Expression,\n ColumnShapeOutput,\n emptyObject,\n ColumnsShapeBase,\n} from 'orchid-core';\nimport { DefaultColumnTypes } from '../columns';\n\n// `with` method options\n// - `columns`: true to get all columns from the query, or array of column names\n// - `recursive`, `materialized`, `notMaterialized`: adds corresponding SQL keyword\ntype WithArgsOptions = {\n [K in keyof WithOptions]: K extends 'columns'\n ? boolean | string[]\n : WithOptions[K];\n};\n\n// `with` method arguments.\n// First argument is an alias for the CTE query,\n// other arguments may be a column shape, query object, or a raw SQL.\ntype WithArgs =\n | [string, ColumnsShapeBase, Expression]\n | [string, WithArgsOptions, ColumnsShapeBase, Expression]\n | [string, Query | ((qb: Db) => Query)]\n | [string, WithArgsOptions, Query | ((qb: Db) => Query)];\n\n// Get the columns shape based on `with` arguments.\n// It can get the shape from explicitly provided column schema or from a query object.\ntype WithShape<Args extends WithArgs> = Args[1] extends Query\n ? Args[1]['result']\n : Args[1] extends (qb: Db) => Query\n ? ReturnType<Args[1]>['result']\n : Args[2] extends Query\n ? Args[2]['result']\n : Args[2] extends (qb: Db) => Query\n ? ReturnType<Args[2]>['result']\n : Args[1] extends ColumnsShapeBase\n ? Args[1]\n : Args[2] extends ColumnsShapeBase\n ? Args[2]\n : Args[2] extends (t: DefaultColumnTypes) => ColumnsShapeBase\n ? ReturnType<Args[2]> extends ColumnsShapeBase\n ? ReturnType<Args[2]>\n : never\n : never;\n\n// Adds a `withData` entry to a query\ntype WithResult<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase,\n> = AddQueryWith<\n T,\n {\n table: Args[0];\n shape: Shape;\n type: ColumnShapeOutput<Shape>;\n }\n>;\n\nexport class With {\n /**\n * Add Common Table Expression (CTE) to the query.\n *\n * ```ts\n * import { columnTypes } from 'pqb';\n * import { NumberColumn } from './number';\n *\n * // .with optionally accepts such options:\n * type WithOptions = {\n * // list of columns returned by this WITH statement\n * // by default all columns from provided column shape will be included\n * // true is for default behavior\n * columns?: string[] | boolean;\n *\n * // Adds RECURSIVE keyword:\n * recursive?: true;\n *\n * // Adds MATERIALIZED keyword:\n * materialized?: true;\n *\n * // Adds NOT MATERIALIZED keyword:\n * notMaterialized?: true;\n * };\n *\n * // accepts columns shape and a raw expression:\n * db.table.with(\n * 'alias',\n * {\n * id: columnTypes.integer(),\n * name: columnTypes.text(3, 100),\n * },\n * db.table.sql`SELECT id, name FROM \"someTable\"`,\n * );\n *\n * // accepts query:\n * db.table.with('alias', db.table.all());\n *\n * // accepts a callback for a query builder:\n * db.table.with('alias', (qb) =>\n * qb.select({ one: db.table.sql((t) => t.integer())`1` }),\n * );\n *\n * // All mentioned forms can accept options as a second argument:\n * db.table.with(\n * 'alias',\n * {\n * recursive: true,\n * materialized: true,\n * },\n * rawOrQueryOrCallback,\n * );\n * ```\n *\n * Defined `WITH` table can be used in `.from` or `.join` with all the type safeness:\n *\n * ```ts\n * db.table.with('alias', db.table.all()).from('alias').select('alias.id');\n *\n * db.table\n * .with('alias', db.table.all())\n * .join('alias', 'alias.id', 'user.id')\n * .select('alias.id');\n * ```\n *\n * @param args - first argument is an alias for this CTE, other arguments can be column shape, query object, or raw SQL.\n */\n with<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase = WithShape<Args>,\n >(this: T, ...args: Args): WithResult<T, Args, Shape> {\n return this.clone()._with<T, Args, Shape>(...args);\n }\n _with<\n T extends Query,\n Args extends WithArgs,\n Shape extends ColumnsShapeBase = WithShape<Args>,\n >(this: T, ...args: Args): WithResult<T, Args, Shape> {\n let options =\n (args.length === 3 && !isExpression(args[2])) || args.length === 4\n ? (args[1] as WithArgsOptions | WithOptions)\n : undefined;\n\n const last = args[args.length - 1] as\n | Query\n | ((qb: Db) => Query)\n | Expression;\n\n const query = typeof last === 'function' ? last(this.queryBuilder) : last;\n\n const shape =\n args.length === 4\n ? (args[2] as ColumnsShapeBase)\n : isExpression(query)\n ? args[1]\n : query.q.shape;\n\n if (options?.columns === true) {\n options = {\n ...options,\n columns: Object.keys(shape),\n };\n }\n\n pushQueryValue(this, 'with', [args[0], options || emptyObject, query]);\n\n return setQueryObjectValue(\n this,\n 'withShapes',\n args[0],\n shape,\n ) as unknown as WithResult<T, Args, Shape>;\n }\n}\n","import { Query } from '../query/query';\nimport { pushQueryArray } from '../query/queryUtils';\nimport { Expression } from 'orchid-core';\n\n// argument of `union`-like query methods.\n// it supports query objects with the same result as in the previous query,\n// or a raw SQL\nexport type UnionArg<T extends Query> =\n | (Omit<Query, 'result'> & {\n result: { [K in keyof T['result']]: Pick<T['result'][K], 'dataType'> };\n })\n | Expression;\n\nexport class Union {\n /**\n * Creates a union query, taking an array or a list of callbacks, builders, or raw statements to build the union statement, with optional boolean `wrap`.\n * If the `wrap` parameter is true, the queries will be individually wrapped in parentheses.\n *\n * ```ts\n * SomeTable.select('id', 'name').union(\n * [\n * OtherTable.select('id', 'name'),\n * SomeTable.sql`SELECT id, name FROM \"thirdTable\"`,\n * ],\n * true, // optional wrap parameter\n * );\n * ```\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n union<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._union(args, wrap);\n }\n _union<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'UNION' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n unionAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._unionAll(args, wrap);\n }\n _unionAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'UNION ALL' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but uses a `INTERSECT` SQL keyword instead\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n intersect<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._intersect(args, wrap);\n }\n _intersect<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'INTERSECT' as const, wrap })),\n );\n }\n\n /**\n * Same as `intersect`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n intersectAll<T extends Query>(\n this: T,\n args: UnionArg<T>[],\n wrap?: boolean,\n ): T {\n return this._intersectAll(args, wrap);\n }\n _intersectAll<T extends Query>(\n this: T,\n args: UnionArg<T>[],\n wrap?: boolean,\n ): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'INTERSECT ALL' as const, wrap })),\n );\n }\n\n /**\n * Same as `union`, but uses an `EXCEPT` SQL keyword instead\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n except<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._except(args, wrap);\n }\n _except<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'EXCEPT' as const, wrap })),\n );\n }\n\n /**\n * Same as `except`, but allows duplicated rows.\n *\n * @param args - array of queries or raw SQLs\n * @param wrap - provide `true` if you want the queries to be wrapped into parentheses\n */\n exceptAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return this._exceptAll(args, wrap);\n }\n _exceptAll<T extends Query>(this: T, args: UnionArg<T>[], wrap?: boolean): T {\n return pushQueryArray(\n this,\n 'union',\n args.map((arg) => ({ arg, kind: 'EXCEPT ALL' as const, wrap })),\n );\n }\n}\n","import {\n Query,\n QueryReturnsAll,\n SetQueryKind,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n pushQueryValue,\n saveSearchAlias,\n throwIfNoWhere,\n} from '../query/queryUtils';\nimport { RelationConfigBase, RelationQueryBase } from '../relations';\nimport { WhereResult } from './where/where';\nimport { JsonItem } from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape, Db } from '../query/db';\nimport {\n isExpression,\n Expression,\n EmptyObject,\n QueryThen,\n callWithThis,\n TemplateLiteralArgs,\n emptyObject,\n} from 'orchid-core';\nimport { QueryResult } from '../adapter';\nimport { JsonModifiers } from './json';\nimport { RawSQL } from '../sql/rawSql';\nimport { resolveSubQueryCallback } from '../common/utils';\nimport { OrchidOrmInternalError } from '../errors';\n\n// Type of argument for `update` and `updateOrThrow`\n//\n// It maps the `inputType` of a table into object with column values.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type UpdateData<T extends Query> = {\n [K in keyof T['inputType']]?: UpdateColumn<T, K>;\n} & {\n [K in keyof T['relations']]?: UpdateRelationData<\n T,\n T['relations'][K]['relationConfig']\n >;\n};\n\n// Type of available variants to provide for a specific column when updating.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\ntype UpdateColumn<T extends Query, Key extends keyof T['inputType']> =\n | T['inputType'][Key]\n | Expression\n | {\n [K in keyof Query]: K extends 'then'\n ? QueryThen<T['inputType'][Key]>\n : Query[K];\n }\n | ((\n q: {\n [K in keyof JsonModifiers]: K extends 'selectable'\n ? T['selectable']\n : T[K];\n } & T['relations'],\n ) => JsonItem | (RelationQueryBase & { meta: { kind: 'select' } }));\n\n// Add relation operations to the update argument.\ntype UpdateRelationData<\n T extends Query,\n Rel extends RelationConfigBase,\n> = Rel['one'] extends true\n ?\n | Rel['dataForUpdate']\n | (QueryReturnsAll<T['returnType']> extends true\n ? never\n : Rel['dataForUpdateOne'])\n : Rel['dataForUpdate'] &\n (QueryReturnsAll<T['returnType']> extends true\n ? EmptyObject\n : Rel['dataForUpdateOne']);\n\n// Type of argument for `update`.\n// not available when there are no conditions on the query.\ntype UpdateArg<T extends Query> = T['meta']['hasWhere'] extends true\n ? UpdateData<T>\n : never;\n\n// Type of argument for `updateRaw`.\n// not available when there are no conditions on the query.\ntype UpdateRawArgs<T extends Query> = T['meta']['hasWhere'] extends true\n ? [sql: Expression] | TemplateLiteralArgs\n : never;\n\n// `update` and `updateOrThrow` methods output type.\n// Unless something was explicitly selected on the query, it's returning the count of updated records.\ntype UpdateResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'update'>\n : SetQueryReturnsRowCount<SetQueryKind<T, 'update'>>;\n\n// `increment` and `decrement` methods argument type.\n// Accepts a column name to change, or an object with column names and number values to increment or decrement with.\ntype ChangeCountArg<T extends Query> =\n | keyof T['shape']\n | Partial<Record<keyof T['shape'], number>>;\n\n// Context object for `update` logic used internally.\n// It's being used by relations logic in the ORM.\nexport type UpdateCtx = {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n updateData?: Record<string, unknown>;\n};\n\n// apply `increment` or a `decrement`,\n// mutates the `queryData` of a query.\nconst applyCountChange = <T extends Query>(\n self: T,\n op: string,\n data: ChangeCountArg<T>,\n) => {\n self.q.type = 'update';\n\n if (!self.q.select) {\n if (\n self.q.returnType === 'oneOrThrow' ||\n self.q.returnType === 'valueOrThrow'\n ) {\n self.q.throwOnNotFound = true;\n }\n self.q.returnType = 'rowCount';\n }\n\n let map: Record<string, { op: string; arg: number }>;\n if (typeof data === 'object') {\n map = {};\n for (const key in data) {\n map[key] = { op, arg: data[key] as number };\n }\n } else {\n map = { [data as string]: { op, arg: 1 } };\n }\n\n pushQueryValue(self, 'updateData', map);\n return self as unknown as UpdateResult<T>;\n};\n\n// sets query type, `returnType`, casts type from Query to UpdateResult\nconst update = <T extends Query>(q: T): UpdateResult<T> => {\n q.q.type = 'update';\n\n if (!q.q.select) {\n q.q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(q, 'update');\n\n return q as unknown as UpdateResult<T>;\n};\n\nexport class Update {\n /**\n * `update` takes an object with columns and values to update records.\n *\n * By default, `update` will return a count of updated records.\n *\n * Place `select`, `selectAll`, or `get` before `update` to specify returning columns.\n *\n * You need to provide `where`, `findBy`, or `find` conditions before calling `update`.\n * To ensure that the whole table won't be updated by accident, updating without where conditions will result in TypeScript and runtime errors.\n *\n * Use `all()` to update ALL records without conditions:\n *\n * ```ts\n * await db.table.all().update({ name: 'new name' });\n * ```\n *\n * If `select` and `where` were specified before the update it will return an array of updated records.\n *\n * If `select` and `take`, `find`, or similar were specified before the update it will return one updated record.\n *\n * For a column value you can provide a specific value, raw SQL, a query object that returns a single value, or a callback with a sub-query.\n *\n * The callback is allowed to select a single value from a relation (see `fromRelation` column below),\n * or to use a [jsonSet](/guide/advanced-queries.html#jsonset),\n * [jsonInsert](/guide/advanced-queries.html#jsoninsert),\n * and [jsonRemove](/guide/advanced-queries.html#jsonremove) for a JSON column (see `jsonColumn` below).\n *\n * ```ts\n * // returns number of updated records by default\n * const updatedCount = await db.table\n * .where({ name: 'old name' })\n * .update({ name: 'new name' });\n *\n * // returning only `id`\n * const id = await db.table.find(1).get('id').update({ name: 'new name' });\n *\n * // `selectAll` + `find` will return a full record\n * const oneFullRecord = await db.table\n * .selectAll()\n * .find(1)\n * .update({ name: 'new name' });\n *\n * // `selectAll` + `where` will return array of full records\n * const recordsArray = await db.table\n * .select('id', 'name')\n * .where({ id: 1 })\n * .update({ name: 'new name' });\n *\n * await db.table.where({ ...conditions }).update({\n * // set the column to a specific value\n * column1: 123,\n *\n * // use raw SQL to update the column\n * column2: db.table.sql`2 + 2`,\n *\n * // use query that returns a single value\n * // returning multiple values will result in Postgres error\n * column3: db.otherTable.get('someColumn'),\n *\n * // select a single value from a related record\n * fromRelation: (q) => q.relatedTable.get('someColumn'),\n *\n * // set a new value to the `.foo.bar` path into a JSON column\n * jsonColumn: (q) => q.jsonSet('jsonColumn', ['foo', 'bar'], 'new value'),\n * });\n * ```\n *\n * ### sub-queries\n *\n * In addition to sub-queries that are simply selecting a single value, it's supported to update a column with a result of the provided `create`, `update`, or `delete` sub-query.\n *\n * ```ts\n * await db.table.where({ ...conditions }).update({\n * // `column` will be set to a value of the `otherColumn` of the created record.\n * column: db.otherTable.get('otherColumn').create({ ...data }),\n *\n * // `column2` will be set to a value of the `otherColumn` of the updated record.\n * column2: db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .update({ key: 'value' }),\n *\n * // `column3` will be set to a value of the `otherColumn` of the deleted record.\n * column3: db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .delete(),\n * });\n * ```\n *\n * This is achieved by defining a `WITH` clause under the hood, it produces such a query:\n *\n * ```sql\n * WITH q AS (\n * INSERT INTO \"otherTable\"(col1, col2, col3)\n * VALUES ('val1', 'val2', 'val3')\n * RETURNING \"otherTable\".\"selectedColumn\"\n * )\n * UPDATE \"table\"\n * SET \"column\" = (SELECT * FROM \"q\")\n * ```\n *\n * The query is atomic, and if the sub-query fails, or the update part fails, or if multiple rows are returned from a sub-query, no changes will persist in the database.\n *\n * Though it's possible to select a single value from a callback for the column to update:\n *\n * ```ts\n * await db.table.find(1).update({\n * // update column `one` with the value of column `two` of the related record.\n * one: (q) => q.relatedTable.get('two'),\n * })\n * ```\n *\n * It is **not** supported to use `create`, `update`, or `delete` kinds of sub-query on related tables:\n *\n * ```ts\n * await db.table.find(1).update({\n * // TS error, this is not allowed:\n * one: (q) => q.relatedTable.get('two').create({ ...data }),\n * })\n * ```\n *\n * It is not supported because query inside `WITH` cannot reference the table in `UPDATE`.\n *\n * ### null, undefined, unknown columns\n *\n * - `null` value will set a column to `NULL`\n * - `undefined` value will be ignored\n * - unknown columns will be ignored\n *\n * ```ts\n * db.table.findBy({ id: 1 }).update({\n * name: null, // updates to null\n * age: undefined, // skipped, no effect\n * lalala: 123, // skipped\n * });\n * ```\n *\n * ### empty set\n *\n * When trying to query update with an empty object, it will be transformed seamlessly to a `SELECT` query:\n *\n * ```ts\n * // imagine the data is an empty object\n * const data = req.body;\n *\n * // query is transformed to `SELECT count(*) WHERE key = 'value'`\n * const count = await db.table.where({ key: 'value' }).update(data);\n *\n * // will select a full record by id\n * const record = await db.table.find(1).selectAll().update(data);\n *\n * // will select a single column by id\n * const name = await db.table.find(1).get('name').update(data);\n * ```\n *\n * If the table has `updatedAt` [timestamp](/guide/common-column-methods.html#timestamps), it will be updated even for an empty data.\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n update<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const q = this.clone() as T;\n return q._update(arg);\n }\n _update<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const { q } = this;\n\n const set: Record<string, unknown> = { ...arg };\n pushQueryValue(this, 'updateData', set);\n\n const { shape } = q;\n\n const ctx: UpdateCtx = {};\n\n for (const key in arg) {\n const item = shape[key];\n if (item instanceof VirtualColumn && item.update) {\n item.update(this, ctx, set);\n delete set[key];\n } else if (\n (!shape[key] || shape[key].data.computed) &&\n shape !== anyShape\n ) {\n delete set[key];\n } else {\n let value = set[key];\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(\n this.baseQuery,\n value as (q: Query) => Query,\n );\n if (value instanceof Db && value.q.type) {\n throw new OrchidOrmInternalError(\n value,\n `Only selecting queries are allowed inside callback of update, ${value.q.type} is given instead.`,\n );\n }\n\n set[key] = value;\n }\n\n if (value !== null && value !== undefined && !isExpression(value)) {\n if (value instanceof Db) {\n // if it is not a select query,\n // move it into `WITH` statement and select from it with a raw SQL\n if (value.q.type) {\n const as = saveSearchAlias(this, 'q', 'withShapes');\n pushQueryValue(this, 'with', [as, emptyObject, value]);\n\n set[key] = new RawSQL(`(SELECT * FROM \"${as}\")`);\n }\n } else {\n // encode if not a query object\n const encode = shape[key].encodeFn;\n if (encode) set[key] = encode(value);\n }\n }\n }\n }\n\n const { queries } = ctx;\n if (queries) {\n q.patchResult = async (_, queryResult) => {\n await Promise.all(queries.map(callWithThis, queryResult));\n\n if (ctx.updateData) {\n const t = this.baseQuery.clone();\n const keys = this.primaryKeys;\n\n (\n t._whereIn as unknown as (\n keys: string[],\n values: unknown[][],\n ) => Query\n )(\n keys,\n queryResult.rows.map((item) => keys.map((key) => item[key])),\n );\n\n await (t as WhereResult<Query>)._update(\n ctx.updateData as UpdateData<WhereResult<Query>>,\n );\n\n for (const row of queryResult.rows) {\n Object.assign(row, ctx.updateData);\n }\n }\n };\n }\n\n return update(this);\n }\n\n /**\n * `updateRaw` is for updating records with raw expression.\n *\n * The behavior is the same as a regular `update` method has:\n * `find` or `where` must precede calling this method,\n * it returns an updated count by default,\n * you can customize returning data by using `select`.\n *\n * ```ts\n * const value = 'new name';\n *\n * // update with SQL template string\n * const updatedCount = await db.table.find(1).updateRaw`name = ${value}`;\n *\n * // or update with `sql` function:\n * await db.table.find(1).updateRaw(db.table.sql`name = ${value}`);\n * ```\n * @param args - raw SQL via a template string or by using a `sql` method\n */\n updateRaw<T extends Query>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n const q = this.clone() as T;\n return q._updateRaw(...args);\n }\n _updateRaw<T extends Query>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n if (Array.isArray(args[0])) {\n const sql = new RawSQL(args as TemplateLiteralArgs);\n return (this as T & { meta: { hasWhere: true } })._updateRaw(sql);\n }\n\n pushQueryValue(this, 'updateData', args[0]);\n\n this.q.type = 'update';\n\n return update(this);\n }\n\n /**\n * To make sure that at least one row was updated use `updateOrThrow`:\n *\n * ```ts\n * import { NotFoundError } from 'pqb';\n *\n * try {\n * // updatedCount is guaranteed to be greater than 0\n * const updatedCount = await db.table\n * .where(conditions)\n * .updateOrThrow({ name: 'name' });\n *\n * // updatedRecords is guaranteed to be a non-empty array\n * const updatedRecords = await db.table\n * .where(conditions)\n * .select('id')\n * .updateOrThrow({ name: 'name' });\n * } catch (err) {\n * if (err instanceof NotFoundError) {\n * // handle error\n * }\n * }\n * ```\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n updateOrThrow<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n const q = this.clone() as T;\n return q._updateOrThrow(arg);\n }\n _updateOrThrow<T extends Query>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n this.q.throwOnNotFound = true;\n return this._update(arg);\n }\n\n /**\n * Increments a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .increment('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).increment('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .increment('numericColumn');\n * ```\n *\n * Provide an object to increment multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // increment someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .increment({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to increment, or an object with columns and values to add\n */\n increment<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return this.clone()._increment(data) as unknown as UpdateResult<T>;\n }\n _increment<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return applyCountChange(this, '+', data);\n }\n\n /**\n * Decrements a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .decrement('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).decrement('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .decrement('numericColumn');\n * ```\n *\n * Provide an object to decrement multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // decrement someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .decrement({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to decrement, or an object with columns and values to subtract\n */\n decrement<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return this.clone()._decrement(data) as unknown as UpdateResult<T>;\n }\n _decrement<T extends Query>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return applyCountChange(this, '-', data);\n }\n}\n","import { Query } from '../query/query';\nimport {\n AfterCommitHook,\n emptyArray,\n emptyObject,\n Sql,\n TransactionAdapterBase,\n TransactionState,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nconst commitSql = {\n text: 'COMMIT',\n values: emptyArray,\n};\n\nconst rollbackSql = {\n text: 'ROLLBACK',\n values: emptyArray,\n};\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport type TransactionOptions = {\n level: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n};\n\nexport class Transaction {\n transaction<T extends Query, Result>(\n this: T,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<T extends Query, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<T extends Query, Result>(\n this: T,\n cbOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n cb?: () => Promise<Result>,\n ): Promise<Result> {\n let options: TransactionOptions;\n let fn: () => Promise<Result>;\n if (typeof cbOrOptions === 'function') {\n options = emptyObject as TransactionOptions;\n fn = cbOrOptions;\n } else {\n options =\n typeof cbOrOptions === 'object' ? cbOrOptions : { level: cbOrOptions };\n fn = cb as () => Promise<Result>;\n }\n\n const sql = {\n values: emptyArray,\n } as unknown as Sql;\n\n const log = this.q.log;\n let logData: unknown | undefined;\n\n let trx = this.internal.transactionStorage.getStore();\n const transactionId = trx ? trx.transactionId + 1 : 0;\n\n const callback = (adapter: TransactionAdapterBase) => {\n if (log) log.afterQuery(sql, logData);\n if (log) logData = log.beforeQuery(commitSql);\n\n if (trx) {\n trx.transactionId = transactionId;\n return fn();\n }\n\n trx = {\n adapter,\n transactionId,\n };\n\n return this.internal.transactionStorage.run(trx, fn);\n };\n\n if (!trx) {\n sql.text = `BEGIN${\n options.level ? ` ISOLATION LEVEL ${options.level}` : ''\n }${\n options.readOnly !== undefined\n ? ` READ ${options.readOnly ? 'ONLY' : 'WRITE'}`\n : ''\n }${\n options.deferrable !== undefined\n ? ` ${options.deferrable ? '' : 'NOT '}DEFERRABLE`\n : ''\n }`;\n if (log) logData = log.beforeQuery(sql);\n\n try {\n const result = await this.q.adapter.transaction(sql, callback);\n\n if (log) log.afterQuery(commitSql, logData);\n\n // trx was defined in the callback above\n const { afterCommit } = trx as unknown as TransactionState;\n if (afterCommit) {\n const promises = [];\n for (let i = 0, len = afterCommit.length; i < len; i += 2) {\n const q = afterCommit[i] as QueryBase;\n const result = afterCommit[i + 1] as unknown[];\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n promises.push(fn(result, q));\n }\n }\n await Promise.all(promises);\n }\n\n return result;\n } catch (err) {\n if (log) log.afterQuery(rollbackSql, logData);\n\n throw err;\n }\n } else {\n try {\n sql.text = `SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n\n const { adapter } = trx;\n await adapter.query(sql);\n\n let result;\n try {\n result = await callback(adapter);\n } catch (err) {\n sql.text = `ROLLBACK TO SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await adapter.query(sql);\n if (log) log.afterQuery(sql, logData);\n throw err;\n }\n\n sql.text = `RELEASE SAVEPOINT \"${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await adapter.query(sql);\n if (log) log.afterQuery(sql, logData);\n\n return result;\n } finally {\n trx.transactionId = transactionId - 1;\n }\n }\n }\n}\n","import { Query, SelectableOrExpressionOfType } from '../query/query';\nimport { ColumnExpression } from '../common/fn';\nimport { TextColumn } from '../columns';\nimport { AggregateMethods } from './aggregate';\nimport { Expression, MaybeArray } from 'orchid-core';\nimport {\n OrderTsQueryConfig,\n QueryData,\n QuerySourceItem,\n SearchWeight,\n ToSQLCtx,\n} from '../sql';\nimport { QueryBase } from '../query/queryBase';\nimport {\n pushQueryValue,\n saveSearchAlias,\n setQueryObjectValue,\n} from '../query/queryUtils';\nimport { getSearchLang, getSearchText } from '../sql/fromAndAs';\nimport { OrchidOrmInternalError } from '../errors';\nimport { addValue, columnToSql } from '../sql/common';\n\n// `headline` first argument is a name of the search.\ntype HeadlineSearchArg<T extends Query> = Exclude<\n T['meta']['tsQuery'],\n undefined\n>;\n\n// Options of the `headline` function:\n// - text: column name or a raw SQL with the full text to select headline from.\n// - options: string or an expression returning Postgres headline options (https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\ntype HeadlineParams<T extends Query> = {\n text?: SelectableOrExpressionOfType<T, TextColumn>;\n options?: string | Expression;\n};\n\n// define a `headline` method on a query builder\ndeclare module './aggregate' {\n interface AggregateMethods {\n /**\n * Give the `as` alias for the search, and it becomes possible to select a text with highlights of the matching words or phrases:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) => q.headline('search'),\n * });\n * ```\n *\n * When searching in the generated `tsvector` column, need to provide a text source to the `headline`:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * vector: 'textVector',\n * query: 'query',\n * })\n * .select({\n * // `body` is a column name\n * highlightedText: (q) => q.headline('search', { text: 'body' }),\n * });\n * ```\n *\n * `text` can be a raw SQL, here we are joining multiple columns:\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table\n * .search({\n * as: 'search',\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', { text: raw`concat_ws(' ', title, body)` }),\n * });\n * ```\n *\n * `headline` supports a string for `options`, see details [in Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\n *\n * Provide a simple string or a raw SQL:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', {\n * options:\n * 'MaxFragments=10, MaxWords=7, MinWords=3, StartSel=<<, StopSel=>>',\n * }),\n * });\n * ```\n *\n * @param search - name of the search to use the query from\n * @param options - `text` for a text source, `options` for `ts_headline` options\n */\n headline<T extends Query>(\n this: T,\n search: HeadlineSearchArg<T>,\n options?: HeadlineParams<T>,\n ): ColumnExpression<TextColumn>;\n }\n}\n\n// type of `search` argument\nexport type SearchArg<T extends QueryBase, As extends string> = {\n // alias this search to use in `order` and/or in `headline`\n as?: As;\n // order results by search rank\n order?: OrderTsQueryConfig;\n} & (\n | {\n // language to use for parsing documents into ts_vector\n language?: string | Expression;\n }\n | {\n // use a language stored in a column of the table\n languageColumn?: keyof T['selectable'];\n }\n) &\n (\n | {\n // text to search in: simple string or raw SQL\n text: string | Expression;\n }\n | {\n // Provide one or multiple columns to search in.\n // Define an object like `{ title: 'A', body: 'B' }` to set column weights.\n in:\n | MaybeArray<keyof T['selectable']>\n | { [K in keyof T['selectable']]?: SearchWeight };\n }\n | {\n // search in a generated vector column\n vector: {\n [K in keyof T['selectable']]: T['selectable'][K]['column']['dataType'] extends 'tsvector'\n ? K\n : never;\n }[keyof T['selectable']];\n }\n ) &\n (\n | {\n // string or a raw SQL for `websearch_to_tsquery` kind of query\n query: string | Expression;\n }\n | {\n // string or a raw SQL for `plainto_tsquery` kind of query\n plainQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `phraseto_tsquery` kind of query\n phraseQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `to_tsquery` kind of query\n tsQuery: string | Expression;\n }\n );\n\n// query type after `search`: this is collecting search aliases in `meta.tsQuery`\nexport type WhereSearchResult<T extends QueryBase, As extends string> = T & {\n meta: { tsQuery: string extends As ? never : As };\n};\n\nclass Headline extends Expression<TextColumn> {\n _type = TextColumn.instance;\n\n constructor(\n public q: QueryData,\n public source: QuerySourceItem,\n public params?: HeadlineParams<Query>,\n ) {\n super();\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs: string | undefined): string {\n const { q, source, params } = this;\n const lang = getSearchLang(ctx, q, source, quotedAs);\n\n const text = params?.text\n ? params.text instanceof Expression\n ? params.text.toSQL(ctx, quotedAs)\n : columnToSql(ctx, q, q.shape, params.text, quotedAs)\n : getSearchText(ctx, q, source, quotedAs, true);\n\n const options = params?.options\n ? `, ${\n params.options instanceof Expression\n ? params.options.toSQL(ctx, quotedAs)\n : addValue(ctx.values, params.options)\n }`\n : '';\n\n return `ts_headline(${lang}, ${text}, \"${source.as}\"${options})`;\n }\n}\n\nAggregateMethods.prototype.headline = function (this: Query, search, params) {\n const source = this.q.sources?.[search];\n if (!source)\n throw new OrchidOrmInternalError(\n this,\n `Search \\`${search}\\` is not defined`,\n );\n\n return new Headline(\n this.q,\n source,\n params as HeadlineParams<Query> | undefined,\n ) as unknown as ColumnExpression<TextColumn>;\n};\n\nexport class SearchMethods {\n /**\n * ## language\n *\n * By default, the search language is English.\n *\n * You can set a different default language in the `createBaseTable` config:\n *\n * ```ts\n * import { createBaseTable } from 'orchid-orm';\n *\n * export const BaseTable = createBaseTable({\n * language: 'swedish',\n * });\n * ```\n *\n * See the list of supported language configs with the SQL:\n *\n * ```sql\n * SELECT cfgname FROM pg_ts_config;\n * ```\n *\n * When performing a search, you can override the default language:\n *\n * ```ts\n * db.table.search({\n * language: 'finnish',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * `language` also accepts a raw SQL.\n *\n * The language can be stored in the column of this table, then you can use `languageColumn` to use this column for the search:\n *\n * ```ts\n * db.table.search({\n * // the table has `lang` column, use it for the search\n * languageColumn: 'lang',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * ## text vector to search in\n *\n * The text to search in can be a simple string, or a raw SQL, or a text column, or multiple columns:\n *\n * ```ts\n * db.table.search({\n * // search in the given string\n * text: 'simply a string to search in',\n * query: 'query',\n * });\n *\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * // raw SQL: join text columns with space\n * text: raw`concat_ws(' ', title, body)`,\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in a single text column\n * in: 'body',\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns, they are concatenated with `concat_ws` as shown above\n * in: ['title', 'body'],\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns with different weights. Weight can be A, B, C, or D\n * in: {\n * title: 'A',\n * body: 'B',\n * },\n * query: 'query',\n * });\n * ```\n *\n * For better performance, define a [generated](/guide/migration-column-methods.html#generated) column of `tsvector` type, and use it in the search with `vector` keyword:\n *\n * ```ts\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * });\n * ```\n *\n * ## search query\n *\n * Read about different search queries in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES).\n *\n * `search` method can accept one of the following queries:\n *\n * - `query`: corresponds to `websearch_to_tsquery` in Postgres, good to use by default\n * - `plainQuery`: corresponds to `plainto_tsquery`\n * - `phraseQuery`: corresponds to `phraseto_tsquery`\n * - `tsQuery`: corresponds to `to_tsquery`\n *\n * The `query` (`websearch_to_tsquery`) can work with any user input, while other query kinds require a specific format and will fail for invalid input.\n *\n * Each query kind accepts a string or a raw SQL.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * // can accept raw SQL:\n * phraseQuery: raw`'The Fat Rats'`,\n * });\n * ```\n *\n * ## order by search rank\n *\n * Read about search ranking in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING).\n *\n * Set `order: true` to order results by the search rank:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank(to_tsvector('english', body)) DESC\n * order: true,\n * });\n * ```\n *\n * To order with `ts_rank_cd` instead of `ts_rank`, set `coverDensity: true`:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank_cd(to_tsvector('english', body)) DESC\n * order: {\n * coverDensity: true,\n * },\n * });\n * ```\n *\n * Other options are:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * order: {\n * // weights for D, C, B, A:\n * weights: [0.1, 0.2, 0.4, 1],\n * // by default, rank ignores the document length\n * // change rank behavior by providing here a special number\n * normalization: 32,\n * // it's possible to change the order direction:\n * dir: 'ASC', // DESC by default\n * },\n * });\n * ```\n *\n * Giving the `as` alias for the search allows to set the ordering in the `order` method:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .order({\n * // can be `search: true` for defaults\n * search: {\n * // same options as above\n * coverDensity: true,\n * weights: [0.1, 0.2, 0.4, 1.0],\n * normalization: 32,\n * dir: 'ASC',\n * },\n * });\n * ```\n *\n * @param arg - search config\n */\n search<T extends Query, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n return this.clone()._search(arg);\n }\n _search<T extends Query, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n if (!arg.as) {\n const as = saveSearchAlias(this, '@q', 'joinedShapes') as As;\n\n arg = {\n ...arg,\n as,\n };\n }\n\n setQueryObjectValue(this, 'sources', arg.as as string, arg);\n if (arg.order) {\n pushQueryValue(this, 'order', arg.as);\n }\n\n return pushQueryValue(this, 'and', { SEARCH: arg }) as WhereSearchResult<\n T,\n As\n >;\n }\n}\n","import {\n Query,\n SetQueryKind,\n SetQueryReturnsOne,\n SetQueryReturnsVoid,\n} from '../query/query';\nimport { UpdateData } from './update';\nimport { CreateData } from './create';\nimport { WhereResult } from './where/where';\nimport { MoreThanOneRowError } from '../errors';\nimport { isObjectEmpty, SetOptional } from 'orchid-core';\n\n// `orCreate` arg type.\n// Unlike `upsert`, doesn't pass a data to `create` callback.\nexport type OrCreateArg<T extends Query> =\n | CreateData<T>\n | (() => CreateData<T>);\n\n// `upsert` arg type.\n// `create` callback arg is of exact `update` type.\nexport type UpsertArg<T extends Query, Data> =\n | {\n update: Data;\n create: CreateData<T> | ((update: Data) => CreateData<T>);\n }\n | UpsertArgWithData<T, Data>;\n\n// `data` and `create` upsert arg.\n// `create` callback arg is of exact `data` type.\ntype UpsertArgWithData<\n T extends Query,\n Data,\n Create = SetOptional<CreateData<T>, keyof Data>,\n> = {\n data: Data;\n create: Create | ((update: Data) => Create);\n};\n\n// unless upsert query has a select, it returns void\nexport type UpsertResult<T extends Query> = T['meta']['hasSelect'] extends true\n ? SetQueryReturnsOne<SetQueryKind<T, 'upsert'>>\n : SetQueryReturnsVoid<SetQueryKind<T, 'upsert'>>;\n\n// Require type of query object to query only one record\n// because upserting multiple isn't possible\nexport type UpsertThis = WhereResult<Query> & {\n returnType: 'one' | 'oneOrThrow';\n};\n\n// this is used by `upsert` and `orCreate` methods.\n// `updateData` and `mergeData` args are passed only by `upsert`.\nfunction orCreate<T extends Query>(\n q: T,\n data: unknown | ((updateData: unknown) => unknown),\n updateData?: unknown,\n mergeData?: unknown,\n): UpsertResult<T> {\n q.q.returnType = 'one';\n q.q.wrapInTransaction = true;\n\n const { handleResult } = q.q;\n let result: unknown;\n let created = false;\n q.q.handleResult = (q, t, r, s) => {\n return created ? result : handleResult(q, t, r, s);\n };\n\n q.q.patchResult = async (q, queryResult) => {\n if (queryResult.rowCount === 0) {\n if (typeof data === 'function') {\n data = data(updateData);\n }\n\n if (mergeData)\n data = { ...mergeData, ...(data as Record<string, unknown>) };\n\n const inner = q.create(data as CreateData<Query>);\n const { handleResult } = inner.q;\n inner.q.handleResult = (q, t, r, s) => {\n queryResult = r;\n const res = handleResult(q, t, r, s);\n result = res;\n return res;\n };\n await inner;\n created = true;\n } else if (queryResult.rowCount > 1) {\n throw new MoreThanOneRowError(\n q,\n `Only one row was expected to find, found ${queryResult.rowCount} rows.`,\n );\n }\n };\n return q as unknown as UpsertResult<T>;\n}\n\nexport class QueryUpsertOrCreate {\n /**\n * `upsert` tries to update one record, and it will perform create in case a record was not found.\n *\n * It will implicitly wrap queries in a transaction if it was not wrapped yet.\n *\n * `find` or `findBy` must precede `upsert` because it does not work with multiple updates.\n *\n * In case more than one row was updated, it will throw `MoreThanOneRowError` and the transaction will be rolled back.\n *\n * It can take `update` and `create` objects, then they are used separately for update and create queries.\n * Or, it can take `data` and `create` objects, `data` will be used for update and be mixed to `create` object.\n *\n * `data` and `update` objects are of the same type that's expected by `update` method, `create` object is of type of `create` method argument.\n *\n * It is not returning a value by default, place `select` or `selectAll` before `upsert` to specify returning columns.\n *\n * ```ts\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * // update record's name\n * name: 'new name',\n * },\n * create: {\n * // create a new record with this email and a name 'new name'\n * email: 'some@email.com',\n * },\n * });\n *\n * // the same as above but using `update` and `create`\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: {\n * email: 'some@email.com',\n * // here we use a different name when creating a record\n * name: 'created user',\n * },\n * });\n * ```\n *\n * The data for `create` may be returned from a function, it won't be called if a record was updated:\n *\n * ```ts\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }),\n * });\n *\n * // the same as above using `data`\n * await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * // name in `create` is overriding the name from `data`\n * name: 'created user',\n * }),\n * });\n * ```\n *\n * Data from `data` or `update` is passed to the `create` function and can be used:\n *\n * ```ts\n * const user = await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * // `updateData` has the exact type of what is passed to `data`\n * create: (updateData) => ({\n * email: `${updateData.name}@email.com`,\n * }),\n * });\n * ```\n *\n * @param data - `update` property for the data to update, `create` property for the data to create\n */\n upsert<T extends UpsertThis, Update extends UpdateData<T>>(\n this: T,\n data: UpsertArg<T, Update>,\n ): UpsertResult<T> {\n return this.clone()._upsert(data);\n }\n _upsert<T extends UpsertThis, Update extends UpdateData<T>>(\n this: T,\n data: UpsertArg<T, Update>,\n ): UpsertResult<T> {\n let updateData;\n let mergeData;\n if ('data' in data) {\n updateData = mergeData = data.data;\n } else {\n updateData = data.update;\n }\n\n if (!isObjectEmpty(updateData)) {\n this._update<WhereResult<Query>>(\n updateData as UpdateData<WhereResult<Query>>,\n );\n }\n\n return orCreate(this, data.create, updateData, mergeData);\n }\n\n /**\n * `orCreate` creates a record only if it was not found by conditions.\n *\n * It will implicitly wrap queries in a transaction if it was not wrapped yet.\n *\n * `find` or `findBy` must precede `orCreate`.\n *\n * It is accepting the same argument as `create` commands.\n *\n * By default, it is not returning columns, place `get`, `select`, or `selectAll` before `orCreate` to specify returning columns.\n *\n * ```ts\n * const user = await User.selectAll().find({ email: 'some@email.com' }).orCreate({\n * email: 'some@email.com',\n * name: 'created user',\n * });\n * ```\n *\n * The data may be returned from a function, it won't be called if the record was found:\n *\n * ```ts\n * const user = await User.selectAll()\n * .find({ email: 'some@email.com' })\n * .orCreate(() => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }));\n * ```\n *\n * @param data - the same data as for `create`, it may be returned from a callback\n */\n orCreate<T extends UpsertThis>(\n this: T,\n data: OrCreateArg<T>,\n ): UpsertResult<T> {\n return this.clone()._orCreate(data);\n }\n _orCreate<T extends UpsertThis>(\n this: T,\n data: OrCreateArg<T>,\n ): UpsertResult<T> {\n return orCreate(this, data);\n }\n}\n","import { ColumnTypeBase, StaticSQLArgs, DynamicSQLArg } from 'orchid-core';\nimport { DynamicRawSQL, raw, RawSQL } from '../sql/rawSql';\n\nexport class RawSqlMethods<ColumnTypes> {\n columnTypes!: ColumnTypes;\n\n /**\n * When there is a need to use a piece of raw SQL, use the `sql` method from tables, or a `raw` function imported from `orchid-orm`.\n *\n * When selecting a raw SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * const result: { num: number }[] = await db.table.select({\n * num: db.table.sql<number>`\n * random() * 100\n * `,\n * });\n * ```\n *\n * In a situation when you want the result to be parsed, such as when returning a timestamp that you want to be parsed into a `Date` object, provide a column type in such a way:\n *\n * This example assumes that the `timestamp` column was overridden with `asDate` as shown in [Override column types](/guide/columns-overview#override-column-types).\n *\n * ```ts\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: db.table.sql`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * Instead of `sql` method, you can use `raw` function from `orchid-orm` (or `pqb`) to do the same.\n * The only difference, `raw` function don't have access to the overridden column types.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * // if you have overridden timestamp with `asDate` or `asNumber` it won't be parsed properly:\n * timestamp: raw`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * In some cases such as when using [from](/guide/orm-and-query-builder.html#from), setting column type via callback allows for special `where` operations:\n *\n * ```ts\n * const subQuery = db.someTable.select({\n * sum: (q) => q.sql`$a + $b`.type((t) => t.decimal()).values({ a: 1, b: 2 }),\n * });\n *\n * // `gt`, `gte`, `min`, `lt`, `lte`, `max` in `where`\n * // are allowed only for numeric columns:\n * const result = await db.$from(subQuery).where({ sum: { gte: 5 } });\n * ```\n *\n * `where` and other methods don't need the return type, so it can be omitted.\n * You can pass SQL template directly to the `where`:\n *\n * ```ts\n * await db.table.where`\"someValue\" = random() * 100`;\n * ```\n *\n * Interpolating values in template literals is completely safe:\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // SQL injection is prevented by a library, this is safe:\n * await db.table.where`column = ${value}`;\n * ```\n *\n * In the example above, TS cannot check if the table has `column` column, or if there are joined tables that have such column which will lead to error.\n * Instead, use the `column` method to reference a column:\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * // ids will be prefixed with proper table names, no ambiguity:\n * db.table.join(db.otherTable, 'id', 'otherId').where`\n * ${db.table.column('id')} = 1 AND\n * ${db.otherTable.column('id')} = 2\n * `;\n * ```\n *\n * SQL can be passed with a simple string, it's important to note that this is not safe to interpolate values in it.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * // no interpolation is okay\n * await db.table.where(raw({ raw: 'column = random() * 100' }));\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is NOT safe, SQL injection is possible:\n * await db.table.where(raw({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `raw` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` method is more preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is SAFE, SQL injection are prevented:\n * await db.table.where(\n * db.table.sql({\n * raw: '$$column = random() * $value',\n * values: {\n * column: 'someTable.someColumn', // or simply 'column'\n * one: value,\n * two: 123,\n * },\n * }),\n * );\n * ```\n *\n * Summarizing:\n *\n * ```ts\n * // simplest form:\n * db.table.sql`key = ${value}`;\n *\n * // with resulting type:\n * db.table.sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * db.table.sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * db.table.sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * db.table.sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * db.table.sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * db.table.sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * db.table.sql`($one + $two) / $one`\n * .type((t) => t.numeric())\n * .values({ one: 1, two: 2 });\n * ```\n *\n * @param args - template literal or an object { raw: string }\n * @return object that has `type` and `values` methods\n */\n sql<T = unknown>(\n this: { columnTypes: ColumnTypes },\n ...args: StaticSQLArgs\n ): RawSQL<ColumnTypeBase<T>, ColumnTypes>;\n sql<T = unknown>(\n this: { columnTypes: ColumnTypes },\n ...args: [DynamicSQLArg]\n ): DynamicRawSQL<ColumnTypeBase<T>, ColumnTypes>;\n sql(...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = this.columnTypes;\n return sql;\n }\n}\n","import { Query } from '../query/query';\nimport { ColumnTypeBase, QueryCatch, QueryThen } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { QueryBase } from '../query/queryBase';\n\n// A function type to transfer query result with.\n// `input` type is inferred from a query `catch` method,\n// it is a result of the query before transform.\nexport type QueryTransformFn<T extends Query> = (\n input: T['catch'] extends QueryCatch<infer Data> ? Data : never,\n) => unknown;\n\n// Type of query after applying a `transform`.\n// Changes the `returnType` to `valueOrThrow`,\n// because it's always returning a single value - the result of the transform function.\n// Changes the query result to a type returned by the transform function.\nexport type QueryTransform<\n T extends QueryBase,\n Fn extends QueryTransformFn<Query>,\n Data = ReturnType<Fn>,\n> = {\n [K in keyof QueryBase]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: ColumnTypeBase<Data> }\n : T[K];\n} & {\n then: QueryThen<Data>;\n catch: QueryCatch<Data>;\n};\n\nexport class TransformMethods {\n /**\n * Transform the result of the query right after loading it.\n *\n * `transform` method should be called in the last order, other methods can't be chained after calling it.\n *\n * The [hooks](/guide/hooks.html) that are going to run after the query will receive the query result **before** transferring.\n *\n * Consider the following example of a cursor-based pagination by `id`:\n *\n * ```ts\n * const lastId: number | undefined = req.query.cursor;\n *\n * type Result = {\n * nodes: { id: number; text: string }[];\n * cursor?: number;\n * };\n *\n * // result is only for demo, it will be inferred\n * const posts: Result = await db.post\n * .select('id', 'text')\n * .where({ id: { lt: lastId } })\n * .order({ id: 'DESC' })\n * .limit(100)\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * You can also use the `tranform` on nested sub-queries:\n *\n * ```ts\n * type Result = {\n * nodes: {\n * id: number;\n * text: string;\n * comments: { nodes: { id: number; text: string }[]; cursor?: number };\n * }[];\n * cursor?: number;\n * };\n *\n * const postsWithComments: Result = await db.post\n * .select('id', 'text')\n * .select({\n * comments: (q) =>\n * q.comments\n * .select('id', 'text')\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id })),\n * })\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * @param fn - function to transform query result with\n */\n transform<T extends Query, Fn extends QueryTransformFn<T>>(\n this: T,\n fn: Fn,\n ): QueryTransform<T, Fn> {\n return this.clone()._transform(fn);\n }\n _transform<T extends Query, Fn extends QueryTransformFn<T>>(\n this: T,\n fn: Fn,\n ): QueryTransform<T, Fn> {\n return pushQueryValue(this, 'transform', fn) as QueryTransform<T, Fn>;\n }\n}\n","import { Query } from '../query/query';\nimport { noop } from 'orchid-core';\nimport { NotFoundError } from '../errors';\n\n/**\n * Methods added to the query prototype when calling {@link QueryMethods.none}.\n */\nexport const noneMethods = {\n // `then` resolves or rejects based on return type of the query.\n // It is `async` so it returns a chainable Promise.\n async then(\n this: Query,\n resolve?: (data?: unknown) => void,\n reject?: (err: unknown) => void,\n ) {\n const type = this.q.returnType;\n if (!type || type === 'all' || type === 'rows' || type === 'pluck')\n resolve?.([]);\n else if (type === 'one' || type === 'value' || type === 'void') resolve?.();\n else if (type === 'rowCount') resolve?.(0);\n else reject?.(new NotFoundError(this));\n },\n // `catch` returns a Promise, so it is chainable with then/catch.\n catch: () => new Promise(noop),\n};\n","import {\n Query,\n SetQueryKind,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluck,\n SetQueryReturnsRows,\n SetQueryReturnsVoid,\n SetQueryTableAlias,\n} from '../query/query';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n OrderTsQueryConfig,\n SelectItem,\n SelectQueryData,\n SortDir,\n toSQL,\n ToSQLCtx,\n ToSQLOptions,\n TruncateQueryData,\n} from '../sql';\nimport {\n extendQuery,\n pushQueryArray,\n pushQueryValue,\n} from '../query/queryUtils';\nimport { Then } from './then';\nimport { AggregateMethods } from './aggregate';\nimport { addParserForSelectItem, Select } from './select';\nimport { From } from './from';\nimport { Join, OnQueryBuilder } from './join/join';\nimport { With } from './with';\nimport { Union } from './union';\nimport { JsonModifiers, JsonMethods } from './json';\nimport { Create } from './create';\nimport { Update } from './update';\nimport { Delete } from './delete';\nimport { Transaction } from './transaction';\nimport { For } from './for';\nimport { ColumnInfoMethods } from './columnInfo';\nimport { addWhere, Where, WhereArg, WhereResult } from './where/where';\nimport { SearchMethods } from './search';\nimport { Clear } from './clear';\nimport { Having } from './having';\nimport { QueryLog } from './log';\nimport { QueryHooks } from './hooks';\nimport { QueryUpsertOrCreate } from './upsertOrCreate';\nimport { QueryGet } from './get';\nimport { MergeQuery, MergeQueryMethods } from './merge';\nimport { RawSqlMethods } from './rawSql';\nimport { CopyMethods } from './copy';\nimport {\n applyMixins,\n Sql,\n QueryThen,\n ColumnsShapeBase,\n TemplateLiteralArgs,\n Expression,\n ColumnTypeBase,\n} from 'orchid-core';\nimport { AsMethods } from './as';\nimport { QueryBase } from '../query/queryBase';\nimport { OrchidOrmInternalError } from '../errors';\nimport { TransformMethods } from './transform';\nimport { RawSQL } from '../sql/rawSql';\nimport { noneMethods } from './none';\nimport { simpleExistingColumnToSQL } from '../sql/common';\n\n// argument of the window method\n// it is an object where keys are name of windows\n// and values can be a window options or a raw SQL\nexport type WindowArg<T extends Query> = Record<\n string,\n WindowArgDeclaration<T> | Expression\n>;\n\n// SQL window options to specify partitionBy and order of the window\nexport type WindowArgDeclaration<T extends Query = Query> = {\n partitionBy?: SelectableOrExpression<T> | SelectableOrExpression<T>[];\n order?: OrderArg<T>;\n};\n\n// add new windows to a query\ntype WindowResult<T extends Query, W extends WindowArg<T>> = T & {\n windows: Record<keyof W, true>;\n};\n\nexport type OrderArg<\n T extends Query,\n TsQuery extends PropertyKey = string | undefined extends T['meta']['tsQuery']\n ? never\n : Exclude<T['meta']['tsQuery'], undefined>,\n Key extends PropertyKey =\n | keyof T['selectable']\n | {\n [K in keyof T['result']]: T['result'][K]['dataType'] extends\n | 'array'\n | 'object'\n ? never\n : K;\n }[keyof T['result']]\n | TsQuery,\n> =\n | Key\n | {\n [K in Key]?: K extends TsQuery ? OrderTsQueryConfig : SortDir;\n }\n | Expression;\n\nexport type OrderArgs<T extends Query> = OrderArg<T>[] | TemplateLiteralArgs;\n\ntype FindArgs<T extends Query> =\n | [T['shape'][T['singlePrimaryKey']]['queryType'] | Expression]\n | TemplateLiteralArgs;\n\ntype QueryHelper<T extends Query, Args extends unknown[], Result> = <\n Q extends {\n [K in keyof T]: K extends 'then'\n ? QueryThen<unknown>\n : K extends 'result'\n ? ColumnsShapeBase\n : T[K];\n },\n>(\n q: Q,\n ...args: Args\n) => Result extends Query ? MergeQuery<Q, Result> : Result;\n\n// Result of `truncate` method: query has kind 'truncate' and returns nothing.\ntype TruncateResult<T extends Query> = SetQueryKind<\n SetQueryReturnsVoid<T>,\n 'truncate'\n>;\n\n// Expression created by `Query.column('name')`, it will prefix the column with a table name from query's context.\nexport class ColumnRefExpression<\n T extends ColumnTypeBase,\n> extends Expression<T> {\n constructor(public _type: T, public name: string) {\n super();\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return simpleExistingColumnToSQL(ctx, this.name, this._type, quotedAs);\n }\n}\n\nexport interface QueryMethods<ColumnTypes>\n extends Omit<AsMethods, 'result'>,\n AggregateMethods,\n Select,\n From,\n Join,\n With,\n Union,\n Omit<JsonModifiers, 'result'>,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n ColumnInfoMethods,\n Omit<Where, 'result'>,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n Omit<QueryHooks, 'result'>,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n RawSqlMethods<ColumnTypes>,\n CopyMethods,\n TransformMethods {}\n\nexport class QueryMethods<ColumnTypes> {\n /**\n * `.all` is a default behavior, that returns an array of objects:\n *\n * ```ts\n * const records = db.table\n * .take() // .take() will be overridden by .all()\n * .all();\n * ```\n */\n all<T extends Query>(this: T): SetQueryReturnsAll<T> {\n return this.clone()._all();\n }\n _all<T extends Query>(this: T): SetQueryReturnsAll<T> {\n this.q.returnType = 'all';\n this.q.and ??= [];\n return this as unknown as SetQueryReturnsAll<T>;\n }\n\n /**\n * Takes a single record, adds `LIMIT 1`.\n * Throws when not found.\n *\n * ```ts\n * const result: TableType = await db.table.where({ key: 'value' }).take();\n * ```\n */\n take<T extends Query>(this: T): SetQueryReturnsOne<T> {\n return this.clone()._take();\n }\n _take<T extends Query>(this: T): SetQueryReturnsOne<T> {\n this.q.returnType = 'oneOrThrow';\n return this as unknown as SetQueryReturnsOne<T>;\n }\n\n /**\n * Takes a single record, adds `LIMIT 1`.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table\n * .where({ key: 'value' })\n * .takeOptional();\n * ```\n */\n takeOptional<T extends Query>(this: T): SetQueryReturnsOneOptional<T> {\n return this.clone()._takeOptional();\n }\n _takeOptional<T extends Query>(this: T): SetQueryReturnsOneOptional<T> {\n this.q.returnType = 'one';\n return this as unknown as SetQueryReturnsOneOptional<T>;\n }\n\n /**\n * `.rows` returns an array of arrays without field names:\n *\n * ```ts\n * const rows: Array<Array<number | string>> = await db.table\n * .select('id', 'name')\n * .rows();\n *\n * rows.forEach((row) => {\n * // row is array of column values\n * row.forEach((value) => {\n * // value is an id or a name\n * });\n * });\n * ```\n */\n rows<T extends Query>(this: T): SetQueryReturnsRows<T> {\n return this.clone()._rows();\n }\n _rows<T extends Query>(this: T): SetQueryReturnsRows<T> {\n this.q.returnType = 'rows';\n return this as unknown as SetQueryReturnsRows<T>;\n }\n\n /**\n * `.pluck` returns a single array of a single selected column values:\n *\n * ```ts\n * const ids = await db.table.select('id').pluck();\n * // ids are an array of all users' id like [1, 2, 3]\n * ```\n * @param select - column name or a raw SQL\n */\n pluck<T extends Query, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n return this.clone()._pluck(select);\n }\n _pluck<T extends Query, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n this.q.returnType = 'pluck';\n (this.q as SelectQueryData).select = [select as SelectItem];\n addParserForSelectItem(this, this.q.as || this.table, 'pluck', select);\n return this as unknown as SetQueryReturnsPluck<T, S>;\n }\n\n /**\n * `.exec` won't parse the response at all, and returns undefined:\n *\n * ```ts\n * const nothing = await db.table.take().exec();\n * ```\n */\n exec<T extends Query>(this: T): SetQueryReturnsVoid<T> {\n return this.clone()._exec();\n }\n _exec<T extends Query>(this: T): SetQueryReturnsVoid<T> {\n this.q.returnType = 'void';\n return this as unknown as SetQueryReturnsVoid<T>;\n }\n\n /**\n * Call `toSQL` on a query to get an object with a `text` SQL string and a `values` array of binding values:\n *\n * ```ts\n * const sql = db.table.select('id', 'name').where({ name: 'name' }).toSQL();\n *\n * expect(sql.text).toBe(\n * 'SELECT \"table\".\"id\", \"table\".\"name\" FROM \"table\" WHERE \"table\".\"name\" = $1',\n * );\n * expect(sql.values).toEqual(['name']);\n * ```\n *\n * `toSQL` is called internally when awaiting a query.\n *\n * It is caching the result. Not mutating query methods are resetting the cache, but need to be careful with mutating methods that start with `_` - they won't reset the cache, which may lead to unwanted results.\n *\n * `toSQL` optionally accepts such parameters:\n *\n * ```ts\n * type ToSqlOptions = {\n * clearCache?: true;\n * values?: [];\n * };\n * ```\n */\n toSQL(this: Query, options?: ToSQLOptions): Sql {\n return toSQL(this, options);\n }\n\n /**\n * Adds a `DISTINCT` keyword to `SELECT`:\n *\n * ```ts\n * db.table.distinct().select('name');\n * ```\n *\n * Can accept column names or raw expressions to place it to `DISTINCT ON (...)`:\n *\n * ```ts\n * // Distinct on the name and raw SQL\n * db.table.distinct('name', db.table.sql`raw sql`).select('id', 'name');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n distinct<T extends Query>(\n this: T,\n ...columns: SelectableOrExpression<T>[]\n ): T {\n return this.clone()._distinct(...columns);\n }\n _distinct<T extends Query>(\n this: T,\n ...columns: SelectableOrExpression<T>[]\n ): T {\n return pushQueryArray(this, 'distinct', columns as string[]);\n }\n\n /**\n * The `find` method is available only for tables which has exactly one primary key.\n * And also it can accept raw SQL template literal, then the primary key is not required.\n *\n * Find record by id, throw [NotFoundError](/guide/error-handling.html) if not found:\n *\n * ```ts\n * await db.table.find(1);\n * ```\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - primary key value to find by, or a raw SQL\n */\n find<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOne<WhereResult<T>> {\n return this.clone()._find(...args);\n }\n _find<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOne<WhereResult<T>> {\n const [value] = args;\n if (Array.isArray(value)) {\n return this._find(new RawSQL(args as TemplateLiteralArgs));\n }\n\n if (value === null || value === undefined) {\n throw new OrchidOrmInternalError(\n this,\n `${value} is not allowed in the find method`,\n );\n }\n\n return this._where({\n [this.singlePrimaryKey]: value,\n } as WhereArg<T>)._take();\n }\n\n /**\n * Find a single record by the primary key (id), adds `LIMIT 1`, can accept a raw SQL.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.find(123);\n * ```\n *\n * @param args - primary key value to find by, or a raw SQL\n */\n findOptional<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this.clone()._findOptional(...args);\n }\n _findOptional<T extends Query>(\n this: T,\n ...args: FindArgs<T>\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this._find(\n ...args,\n ).takeOptional() as unknown as SetQueryReturnsOneOptional<WhereResult<T>>;\n }\n\n /**\n * The same as `where(conditions).take()`, it will filter records and add a `LIMIT 1`.\n * Throws `NotFoundError` if not found.\n *\n * ```ts\n * const result: TableType = await db.table.findBy({ key: 'value' });\n * // is equivalent to:\n * db.table.where({ key: 'value' }).take()\n * ```\n *\n * @param args - `where` conditions\n */\n findBy<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOne<WhereResult<T>> {\n return this.clone()._findBy(...args);\n }\n _findBy<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOne<WhereResult<T>> {\n return addWhere(this, args).take();\n }\n\n /**\n * The same as `where(conditions).takeOptional()`, it will filter records and add a `LIMIT 1`.\n * Returns `undefined` when not found.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.findByOptional({\n * key: 'value',\n * });\n * ```\n *\n * @param args - `where` conditions\n */\n findByOptional<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return this.clone()._findByOptional(...args);\n }\n _findByOptional<T extends Query>(\n this: T,\n ...args: WhereArg<T>[]\n ): SetQueryReturnsOneOptional<WhereResult<T>> {\n return addWhere(this, args).takeOptional();\n }\n\n /**\n * Specifies the schema to be used as a prefix of a table name.\n *\n * Though this method can be used to set the schema right when building the query,\n * it's better to specify schema when calling `db(table, () => columns, { schema: string })`\n *\n * ```ts\n * db.table.withSchema('customSchema').select('id');\n * ```\n *\n * Resulting SQL:\n *\n * ```sql\n * SELECT \"user\".\"id\" FROM \"customSchema\".\"user\"\n * ```\n *\n * @param schema - a name of the database schema to use\n */\n withSchema<T extends Query>(this: T, schema: string): T {\n return this.clone()._withSchema(schema);\n }\n _withSchema<T extends Query>(this: T, schema: string): T {\n this.q.schema = schema;\n return this;\n }\n\n /**\n * For the `GROUP BY` SQL statement, it is accepting column names or raw expressions.\n *\n * `group` is useful when aggregating values.\n *\n * ```ts\n * // Select the category and sum of prices grouped by the category\n * const results = Product.select('category')\n * .selectSum('price', { as: 'sumPrice' })\n * .group('category');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n group<T extends Query>(this: T, ...columns: SelectableOrExpression<T>[]): T {\n return this.clone()._group(...columns);\n }\n _group<T extends Query>(this: T, ...columns: SelectableOrExpression<T>[]): T {\n return pushQueryArray(this, 'group', columns);\n }\n\n /**\n * Add a window with `window` and use it later by its name for aggregate or window functions:\n *\n * ```ts\n * db.table\n * // define window `windowName`\n * .window({\n * windowName: {\n * partitionBy: 'someColumn',\n * order: {\n * id: 'DESC',\n * },\n * },\n * })\n * .select({\n * avg: (q) =>\n * // calculate average price over the window\n * q.avg('price', {\n * // use window by its name\n * over: 'windowName',\n * }),\n * });\n * ```\n *\n * @param arg - window config\n */\n window<T extends Query, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return this.clone()._window(arg);\n }\n _window<T extends Query, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return pushQueryValue(this, 'window', arg) as unknown as WindowResult<T, W>;\n }\n\n wrap<T extends Query, Q extends Query, As extends string = 't'>(\n this: T,\n query: Q,\n as?: As,\n ): SetQueryTableAlias<Q, As> {\n return this.clone()._wrap(query, as);\n }\n _wrap<T extends Query, Q extends Query, As extends string = 't'>(\n this: T,\n query: Q,\n as: As = 't' as As,\n ): SetQueryTableAlias<Q, As> {\n return (query._from(this) as Query)._as(\n as,\n ) as unknown as SetQueryTableAlias<Q, As>;\n }\n\n /**\n * Adds an order by clause to the query.\n *\n * Takes one or more arguments, each argument can be a column name, an object, or a raw expression.\n *\n * ```ts\n * db.table.order('id', 'name'); // ASC by default\n *\n * db.table.order({\n * id: 'ASC', // or DESC\n *\n * // to set nulls order:\n * name: 'ASC NULLS FIRST',\n * age: 'DESC NULLS LAST',\n * });\n *\n * // order by raw SQL expression:\n * db.table.order`raw sql`;\n * // or\n * db.table.order(db.table.sql`raw sql`);\n * ```\n *\n * `order` can refer to the values returned from `select` sub-queries (unlike `where` which cannot).\n * So you can select a count of related records and order by it.\n *\n * For example, `comment` has many `likes`.\n * We are selecting few columns of `comment`, selecting `likesCount` by a sub-query in a select, and ordering comments by likes count:\n *\n * ```ts\n * db.comment\n * .select('title', 'content', {\n * likesCount: (q) => q.likes.count(),\n * })\n * .order({\n * likesCount: 'DESC',\n * });\n * ```\n *\n * @param args - column name(s), raw SQL, or an object with column names and sort directions.\n */\n order<T extends Query>(this: T, ...args: OrderArgs<T>): T {\n return this.clone()._order(...args);\n }\n _order<T extends Query>(this: T, ...args: OrderArgs<T>): T {\n if (Array.isArray(args[0])) {\n return this._order(new RawSQL(args as TemplateLiteralArgs));\n }\n return pushQueryArray(this, 'order', args);\n }\n\n /**\n * Adds a limit clause to the query.\n *\n * ```ts\n * db.table.limit(10);\n * ```\n *\n * @param arg - limit number\n */\n limit<T extends Query>(this: T, arg: number | undefined): T {\n return this.clone()._limit(arg);\n }\n _limit<T extends Query>(this: T, arg: number | undefined): T {\n (this.q as SelectQueryData).limit = arg;\n return this;\n }\n\n /**\n * Adds an offset clause to the query.\n *\n * ```ts\n * db.table.offset(10);\n * ```\n *\n * @param arg - offset number\n */\n offset<T extends Query>(this: T, arg: number | undefined): T {\n return this.clone()._offset(arg);\n }\n _offset<T extends Query>(this: T, arg: number | undefined): T {\n (this.q as SelectQueryData).offset = arg;\n return this;\n }\n\n /**\n * Truncates the specified table.\n *\n * ```ts\n * // simply truncate\n * await db.table.truncate();\n *\n * // restart autoincrementing columns:\n * await db.table.truncate({ restartIdentity: true });\n *\n * // truncate also dependant tables:\n * await db.table.truncate({ cascade: true });\n * ```\n *\n * @param options - truncate options, may have `cascade: true` and `restartIdentity: true`\n */\n truncate<T extends Query>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): TruncateResult<T> {\n return this.clone()._truncate(options);\n }\n _truncate<T extends Query>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): TruncateResult<T> {\n const q = this.q as TruncateQueryData;\n q.type = 'truncate';\n if (options?.restartIdentity) {\n q.restartIdentity = true;\n }\n if (options?.cascade) {\n q.cascade = true;\n }\n return this._exec() as TruncateResult<T>;\n }\n\n /**\n * `none` will resolve the query into an empty result, without executing a database query.\n *\n * ```ts\n * await db.table.none(); // -> empty array\n * await db.table.findOptional(123).none(); // -> undefined\n * await db.table.find(123).none(); // throws NotFoundError\n * ```\n *\n * [create](/guide/create-update-delete.html#create) chained with `count`, [update](/guide/create-update-delete.html#update), and [delete](/guide/create-update-delete.html#del-delete) are returning a count of affected records.\n *\n * When they are called with `none`, query does not execute and 0 is returned.\n *\n * ```ts\n * await db.table.insert(data); // -> 0\n * await db.table.all().update(data); // -> 0\n * await db.table.all().delete(); // -> 0\n * ```\n */\n none<T extends Query>(this: T): T {\n return extendQuery(this, noneMethods);\n }\n\n /**\n * `modify` allows modifying the query with your function:\n *\n * ```ts\n * const doSomethingWithQuery = (q: typeof db.table) => {\n * // can use all query methods\n * return q.select('name').where({ active: true }).order({ createdAt: 'DESC' });\n * };\n *\n * const record = await db.table.select('id').modify(doSomethingWithQuery).find(1);\n *\n * record.id; // id was selected before `modify`\n * record.name; // name was selected by the function\n * ```\n *\n * It's possible to apply different `select`s inside the function, and then the result type will be a union of all possibilities:\n *\n * Use this sparingly as it complicates dealing with the result.\n *\n * ```ts\n * const doSomethingWithQuery = (q: typeof db.table) => {\n * if (Math.random() > 0.5) {\n * return q.select('one');\n * } else {\n * return q.select('two');\n * }\n * };\n *\n * const record = await db.table.modify(doSomethingWithQuery).find(1);\n *\n * // TS error: we don't know for sure if the `one` was selected.\n * record.one;\n *\n * // use `in` operator to disambiguate the result type\n * if ('one' in record) {\n * record.one;\n * } else {\n * record.two;\n * }\n * ```\n *\n * @param fn - function to modify the query with. The result type will be merged with the main query as if the `merge` method was used.\n */\n modify<T extends Query, Arg extends Query & { table: T['table'] }, Result>(\n this: T,\n fn: (q: Arg) => Result,\n ): Result extends Query ? MergeQuery<T, Result> : Result {\n return fn(this as unknown as Arg) as Result extends Query\n ? MergeQuery<T, Result>\n : Result;\n }\n\n /**\n * Use `makeHelper` to make a query helper - a function where you can modify the query, and reuse this function across different places.\n *\n * ```ts\n * const defaultAuthorSelect = db.author.makeHelper((q) => {\n * return q.select('firstName', 'lastName');\n * });\n *\n * // this will select id, firstName, lastName with a correct TS type\n * // and return a single record\n * const result = await defaultAuthorSelect(db.author.select('id').find(1));\n * ```\n *\n * Such helper is available for relation queries inside `select`:\n *\n * ```ts\n * await db.book.select({\n * author: (book) => defaultAuthorSelect(book.author),\n * });\n * ```\n *\n * Helper can accept additional arguments:\n *\n * ```ts\n * const selectFollowing = db.user.makeHelper((q, currentUser: { id: number }) => {\n * return q.select({\n * following: (q) =>\n * q.followers.where({ followerId: currentUser.id }).exists(),\n * });\n * });\n *\n * // select some columns and the `following` boolean field from users\n * await selectFollowing(db.user.select('id', 'name'), currentUser);\n * ```\n *\n * @param fn - helper function\n */\n makeHelper<T extends Query, Args extends unknown[], Result>(\n this: T,\n fn: (q: T, ...args: Args) => Result,\n ): QueryHelper<T, Args, Result> {\n return fn as unknown as QueryHelper<T, Args, Result>;\n }\n\n /**\n * Use `column` method to interpolate column names inside SQL templates.\n * The column will be prefixed with the correct table name taken from the context of the query.\n *\n * ```ts\n * db.table.sql`${db.table.column('id')} = 1`;\n * ```\n *\n * @param name\n */\n column<T extends Query, K extends keyof T['shape']>(\n this: T,\n name: K,\n ): ColumnRefExpression<T['shape'][K]> {\n const column = (this.shape as Record<PropertyKey, ColumnTypeBase>)[name];\n return new ColumnRefExpression(column as T['shape'][K], name as string);\n }\n}\n\napplyMixins(QueryMethods, [\n QueryBase,\n AsMethods,\n AggregateMethods,\n Select,\n From,\n Join,\n OnQueryBuilder,\n With,\n Union,\n JsonModifiers,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n ColumnInfoMethods,\n Where,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n RawSqlMethods,\n CopyMethods,\n TransformMethods,\n]);\n","import { Query, SelectableFromShape } from './query';\nimport {\n QueryMethods,\n handleResult,\n OnQueryBuilder,\n logParamToLogObject,\n QueryLogOptions,\n} from '../queryMethods';\nimport { QueryData, SelectQueryData, ToSQLOptions } from '../sql';\nimport {\n AdapterOptions,\n Adapter,\n QueryResult,\n QueryArraysResult,\n} from '../adapter';\nimport {\n getColumnTypes,\n getTableData,\n DefaultColumnTypes,\n columnTypes,\n} from '../columns';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n DbBase,\n ColumnsShapeBase,\n DefaultSelectColumns,\n applyMixins,\n pushOrNewArray,\n ColumnShapeOutput,\n SinglePrimaryKey,\n snakeCaseKey,\n toSnakeCase,\n Sql,\n QueryThen,\n QueryCatch,\n ColumnsParsers,\n TransactionState,\n QueryResultRow,\n TemplateLiteralArgs,\n QueryInternal,\n SQLQueryArgs,\n isRawSQL,\n EmptyObject,\n ColumnTypesBase,\n ColumnTypeBase,\n} from 'orchid-core';\nimport { inspect } from 'node:util';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { templateLiteralToSQL } from '../sql/rawSql';\nimport { RelationsBase } from '../relations';\n\nexport type NoPrimaryKeyOption = 'error' | 'warning' | 'ignore';\n\nexport type DbOptions<ColumnTypes extends ColumnTypesBase> = (\n | { adapter: Adapter }\n | Omit<AdapterOptions, 'log'>\n) &\n QueryLogOptions & {\n // concrete column types or a callback for overriding standard column types\n // this types will be used in tables to define their columns\n columnTypes?: ColumnTypes | ((t: DefaultColumnTypes) => ColumnTypes);\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n // when set to true, all columns will be translated to `snake_case` when querying database\n snakeCase?: boolean;\n // if `now()` for some reason doesn't suite your timestamps, provide a custom SQL for it\n nowSQL?: string;\n };\n\nexport type DbTableOptions = {\n schema?: string;\n // prepare all SQL queries before executing\n // true by default\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n snakeCase?: boolean;\n // default language for the full text search\n language?: string;\n} & QueryLogOptions;\n\n// Type of data returned from the table query by default, doesn't include computed columns.\n// `const user: User[] = await db.user;`\nexport type QueryDefaultReturnData<Shape extends ColumnsShapeBase> = Pick<\n ColumnShapeOutput<Shape>,\n DefaultSelectColumns<Shape>[number]\n>[];\n\nexport interface Db<\n Table extends string | undefined = undefined,\n Shape extends ColumnsShapeBase = Record<string, never>,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes,\n ShapeWithComputed extends ColumnsShapeBase = Shape,\n Data = QueryDefaultReturnData<Shape>,\n> extends DbBase<Adapter, Table, Shape, ColumnTypes, ShapeWithComputed>,\n QueryMethods<ColumnTypes> {\n new (\n adapter: Adapter,\n queryBuilder: Db<Table, Shape, Relations, ColumnTypes>,\n table?: Table,\n shape?: Shape,\n options?: DbTableOptions,\n ): this;\n internal: Query['internal'];\n queryBuilder: Db;\n onQueryBuilder: Query['onQueryBuilder'];\n primaryKeys: Query['primaryKeys'];\n q: QueryData;\n selectable: SelectableFromShape<ShapeWithComputed, Table>;\n returnType: Query['returnType'];\n then: QueryThen<Data>;\n catch: QueryCatch<Data>;\n windows: Query['windows'];\n defaultSelectColumns: DefaultSelectColumns<Shape>;\n relations: Relations;\n withData: Query['withData'];\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError<this>;\n meta: {\n kind: 'select';\n defaults: {\n [K in keyof Shape]:\n | undefined\n | unknown extends Shape[K]['data']['default']\n ? never\n : K;\n }[keyof Shape];\n };\n}\n\nexport const anyShape = {} as Record<string, ColumnTypeBase>;\n\nexport class Db<\n Table extends string | undefined = undefined,\n Shape extends ColumnsShapeBase = Record<string, never>,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes,\n ShapeWithComputed extends ColumnsShapeBase = Shape,\n> implements Query\n{\n constructor(\n public adapter: Adapter,\n public queryBuilder: Db,\n public table: Table = undefined as Table,\n public shape: ShapeWithComputed = anyShape as ShapeWithComputed,\n public columnTypes: ColumnTypes,\n transactionStorage: AsyncLocalStorage<TransactionState>,\n options: DbTableOptions,\n ) {\n const tableData = getTableData();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n this.internal = {\n ...tableData,\n transactionStorage,\n };\n\n this.baseQuery = this as Query;\n\n const logger = options.logger || console;\n\n const parsers = {} as ColumnsParsers;\n let hasParsers = false;\n let modifyQuery: ((q: Query) => void)[] | undefined = undefined;\n let hasCustomName = false;\n const { snakeCase } = options;\n for (const key in shape) {\n const column = shape[key];\n if (column.parseFn) {\n hasParsers = true;\n parsers[key] = column.parseFn;\n }\n\n if (column.data.modifyQuery) {\n modifyQuery = pushOrNewArray(modifyQuery, column.data.modifyQuery);\n }\n\n if (column.data.name) {\n hasCustomName = true;\n } else if (snakeCase) {\n const snakeName = toSnakeCase(key);\n if (snakeName !== key) {\n hasCustomName = true;\n column.data.name = snakeName;\n }\n }\n\n if (typeof column.data.default === 'function') {\n const arr = this.internal.runtimeDefaultColumns;\n if (!arr) this.internal.runtimeDefaultColumns = [key];\n else arr.push(key);\n\n if (!column.data.runtimeDefault) {\n const {\n data: { default: def },\n encodeFn,\n } = column;\n\n column.data.runtimeDefault = encodeFn\n ? () => encodeFn(def())\n : (def as () => unknown);\n }\n }\n }\n\n if (hasCustomName) {\n const list: string[] = [];\n for (const key in shape) {\n const column = shape[key];\n list.push(\n column.data.name ? `\"${column.data.name}\" AS \"${key}\"` : `\"${key}\"`,\n );\n }\n this.internal.columnsForSelectAll = list;\n }\n\n this.q = {\n adapter,\n shape: shape as ColumnsShapeBase,\n handleResult,\n logger,\n log: logParamToLogObject(logger, options.log),\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n parsers: hasParsers ? parsers : undefined,\n language: options.language,\n } as QueryData;\n\n if (options?.schema) {\n this.q.schema = options.schema;\n }\n\n this.primaryKeys = Object.keys(shape).filter(\n (key) => shape[key].data.isPrimaryKey,\n );\n const primaryKeysFromData = getTableData().primaryKey?.columns;\n if (primaryKeysFromData) this.primaryKeys.push(...primaryKeysFromData);\n\n if (this.primaryKeys.length === 1) {\n this.singlePrimaryKey = this\n .primaryKeys[0] as unknown as SinglePrimaryKey<Shape>;\n } else if (\n this.primaryKeys.length === 0 &&\n shape !== anyShape &&\n options.noPrimaryKey !== 'ignore'\n ) {\n const message = `Table ${table} has no primary key`;\n if (options.noPrimaryKey === 'error') throw new Error(message);\n else logger.warn(message);\n }\n\n const columns = Object.keys(\n shape,\n ) as unknown as (keyof ColumnShapeOutput<Shape>)[];\n const { toSQL } = this;\n\n this.columns = columns as (keyof ColumnShapeOutput<Shape>)[];\n this.defaultSelectColumns = columns.filter(\n (column) => !shape[column as keyof typeof shape].data.isHidden,\n ) as DefaultSelectColumns<Shape>;\n\n const defaultSelect =\n this.defaultSelectColumns.length === columns.length\n ? undefined\n : this.defaultSelectColumns;\n\n this.toSQL = defaultSelect\n ? function <T extends Query>(this: T, options?: ToSQLOptions): Sql {\n const q = this.clone();\n if (!(q.q as SelectQueryData).select) {\n (q.q as SelectQueryData).select = defaultSelect as string[];\n }\n return toSQL.call(q, options);\n }\n : toSQL;\n\n this.relations = {} as Relations;\n\n modifyQuery?.forEach((cb) => cb(this));\n\n this.error = class extends QueryError {\n constructor(message?: string) {\n super(self, message);\n }\n };\n }\n\n [inspect.custom]() {\n return `QueryObject<${this.table}>`;\n }\n\n /**\n * Use `query` to perform raw SQL queries.\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.query<{ one: number }>`SELECT ${value} AS one`;\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * If the query is executing inside a transaction, it will use the transaction connection automatically.\n *\n * ```ts\n * await db.transaction(async () => {\n * // both queries will execute in the same transaction\n * await db.query`SELECT 1`;\n * await db.query`SELECT 2`;\n * });\n * ```\n *\n * Alternatively, support a simple SQL string, with optional `values`:\n *\n * Note that the values is a simple array, and the SQL is referring to the values with `$1`, `$2` and so on.\n *\n * ```ts\n * const value = 1;\n *\n * // it is NOT safe to interpolate inside a simple string, use `values` to pass the values.\n * const result = await db.query<{ one: number }>({\n * raw: 'SELECT $1 AS one',\n * values: [value],\n * });\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n query<T extends QueryResultRow = QueryResultRow>(\n ...args: SQLQueryArgs\n ): Promise<QueryResult<T>> {\n return performQuery<QueryResult<T>>(this, args, 'query');\n }\n\n /**\n * The same as the {@link query}, but returns an array of arrays instead of objects:\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.queryArrays<[number]>`SELECT ${value} AS one`;\n * // `rows` is an array of arrays:\n * const row = result.rows[0];\n * row[0]; // our value\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n queryArrays<R extends any[] = any[]>(\n ...args: SQLQueryArgs\n ): Promise<QueryArraysResult<R>> {\n return performQuery<QueryArraysResult<R>>(this, args, 'arrays');\n }\n}\n\nconst performQuery = async <Result>(\n q: {\n queryBuilder: Db;\n internal: QueryInternal;\n adapter: Adapter;\n q: QueryData;\n },\n args: SQLQueryArgs,\n method: 'query' | 'arrays',\n): Promise<Result> => {\n const trx = q.internal.transactionStorage.getStore();\n let sql: Sql;\n if (isRawSQL(args[0])) {\n const values: unknown[] = [];\n sql = {\n text: args[0].toSQL({ values }),\n values,\n };\n } else {\n const values: unknown[] = [];\n sql = {\n text: templateLiteralToSQL(args as TemplateLiteralArgs, {\n queryBuilder: q.queryBuilder,\n sql: [],\n values,\n }),\n values,\n };\n }\n\n const { log } = q.q;\n let logData: unknown | undefined;\n if (log) logData = log.beforeQuery(sql);\n\n try {\n const result = (await (trx?.adapter || q.adapter)[method as 'query'](\n sql,\n )) as Promise<Result>;\n\n if (log) log.afterQuery(sql, logData);\n\n return result;\n } catch (err) {\n if (log) {\n log.onError(err as Error, sql, logData);\n }\n\n throw err;\n }\n};\n\napplyMixins(Db, [QueryMethods]);\nDb.prototype.constructor = Db;\nDb.prototype.onQueryBuilder = OnQueryBuilder;\n\nexport type DbResult<ColumnTypes> = Db<\n string,\n Record<string, never>,\n EmptyObject,\n ColumnTypes\n> & {\n <Table extends string, Shape extends ColumnsShapeBase = ColumnsShapeBase>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n options?: DbTableOptions,\n ): Db<Table, Shape, EmptyObject>;\n\n adapter: Adapter;\n close: Adapter['close'];\n};\n\nexport const createDb = <\n ColumnTypes extends ColumnTypesBase = DefaultColumnTypes,\n>({\n log,\n logger,\n columnTypes: ctOrFn = columnTypes as unknown as ColumnTypes,\n snakeCase,\n nowSQL,\n ...options\n}: DbOptions<ColumnTypes>): DbResult<ColumnTypes> => {\n const adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n noPrimaryKey: options.noPrimaryKey ?? 'error',\n snakeCase,\n };\n\n const ct =\n typeof ctOrFn === 'function'\n ? (ctOrFn as unknown as (t: DefaultColumnTypes) => ColumnTypes)(\n columnTypes,\n )\n : ctOrFn;\n\n if (snakeCase) {\n (ct as { [snakeCaseKey]?: boolean })[snakeCaseKey] = true;\n }\n\n const transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n ct,\n transactionStorage,\n commonOptions,\n );\n qb.queryBuilder = qb as unknown as Db;\n\n const db = Object.assign(\n <Table extends string, Shape extends ColumnsShapeBase = ColumnsShapeBase>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n options?: DbTableOptions,\n ): Db<Table, Shape, EmptyObject, ColumnTypes> => {\n return new Db<Table, Shape, EmptyObject, ColumnTypes>(\n adapter,\n qb as unknown as Db,\n table as Table,\n typeof shape === 'function'\n ? getColumnTypes(ct, shape, nowSQL, options?.language)\n : shape,\n ct,\n transactionStorage,\n { ...commonOptions, ...options },\n );\n },\n qb,\n { adapter, close: () => adapter.close() },\n );\n\n // Set all methods from prototype to the db instance (needed for transaction at least):\n for (const name of Object.getOwnPropertyNames(Db.prototype)) {\n (db as unknown as Record<string, unknown>)[name] =\n Db.prototype[name as keyof typeof Db.prototype];\n }\n\n return db as unknown as DbResult<ColumnTypes>;\n};\n","import { Query } from './query/query';\n\n// The `Rollback` is not an error,\n// but a command to throw by `rollback` function,\n// and catch it immediately by the transaction to handle the rollback.\nclass Rollback extends Error {}\n\n// `testTransaction` will store its state under this unique key in the `db.internal`.\nconst trxForTest: unique symbol = Symbol('trxForTest');\n\n// The state of `testTransaction` that will be stored in the `db.internal`.\ntype TrxData = {\n // promise of the full transaction lifecycle, from start to rollback.\n promise?: Promise<void>;\n // reject function of the transaction.\n // `Rollback` won't leak outside, other errors will be brought back to the caller.\n reject?(err: unknown): void;\n // Adapter methods are replaced inside the transaction.\n // Original methods are stored here to be restored on rollback.\n adapter: {\n query: unknown;\n arrays: unknown;\n transaction: unknown;\n };\n};\n\n// Type to store transaction data on `db.internal`.\ntype Internal = {\n [trxForTest]?: TrxData[];\n};\n\n// Argument of the transaction, $queryBuilder is to use ORM instance, Query to use any other queryable instance.\ntype Arg = { $queryBuilder: Query } | Query;\n\n// Get queryable instance from the transaction argument.\nconst argToDb = (arg: Arg): Query =>\n '$queryBuilder' in arg ? arg.$queryBuilder : arg;\n\n// Methods of a test transaction.\nexport const testTransaction = {\n /**\n * Start a test transaction.\n * The returned promise is resolved immediately when transaction starts, not waiting for it to end.\n *\n * @param arg - ORM instance or a queryable instance (such as db.someTable).\n */\n start(arg: Arg): Promise<void> {\n const db = argToDb(arg);\n const { transactionStorage } = db.internal;\n const { getStore } = transactionStorage;\n const { adapter } = db.baseQuery.q;\n const data: TrxData = {\n adapter: {\n query: adapter.query,\n arrays: adapter.arrays,\n transaction: adapter.transaction,\n },\n };\n ((db.internal as unknown as Internal)[trxForTest] ??= []).push(data);\n\n return new Promise<void>((resolve) => {\n data.promise = db\n .transaction(() => {\n resolve();\n return new Promise<void>((_, rej) => {\n const trx = transactionStorage.getStore();\n db.internal.transactionStorage.getStore = () => trx;\n if (trx) {\n const t = trx.adapter as unknown as typeof adapter;\n adapter.query = t.query.bind(t);\n adapter.arrays = t.arrays.bind(t);\n adapter.transaction = t.transaction.bind(t);\n }\n data.reject = rej;\n });\n })\n .catch((err) => {\n if (!(err instanceof Rollback)) {\n throw err;\n }\n })\n .finally(() => {\n db.internal.transactionStorage.getStore = getStore;\n });\n });\n },\n\n /**\n * Rollback a test transaction.\n *\n * @param arg - the same ORM or query argument passed into the `testTransaction.start`.\n */\n rollback(arg: Arg): Promise<void> | undefined {\n const db = argToDb(arg);\n const data = (db.internal as unknown as Internal)[trxForTest];\n const last = data?.pop();\n if (!last) return;\n\n // if there's only one transaction left, restore the adapter methods.\n if (data?.length === 1) {\n Object.assign(db.baseQuery.q.adapter, data[0].adapter);\n }\n\n last.reject?.(new Rollback());\n return last.promise;\n },\n\n /**\n * Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),\n * and if there's no nested test transactions left, it will close the db connection.\n *\n * @param arg - the same ORM or query argument passed into the `testTransaction.start`.\n */\n async close(arg: Arg) {\n const db = argToDb(arg);\n await this.rollback(db);\n if ((db.internal as unknown as Internal)[trxForTest]?.length === 0) {\n return db.q.adapter.close();\n }\n },\n};\n","import { Query, SelectableFromShape } from '../query/query';\nimport { ColumnsShapeBase, ColumnTypeBase, Expression } from 'orchid-core';\n\n// Type of argument for computed columns, each value is a function returning an Expression.\nexport type ComputedColumnsBase<T extends Query> = Record<\n string,\n (q: T) => Expression\n>;\n\n// Map query type to apply computed columns to it.\n// Computed columns are added to the query shape and to `selectable`.\n// Not added to `result`, `then`, `catch`, so it doesn't return computed columns by default, only after explicit selecting.\nexport type QueryWithComputed<\n T extends Query,\n Computed extends ComputedColumnsBase<T>,\n Shape extends ColumnsShapeBase = {\n [K in keyof Computed]: ReturnType<Computed[K]>['_type'];\n },\n> = {\n [K in keyof T]: K extends 'shape'\n ? T['shape'] & Shape\n : K extends 'selectable'\n ? T['selectable'] & SelectableFromShape<Shape, T['table']>\n : T[K];\n};\n\ndeclare module 'orchid-core' {\n interface ColumnDataBase {\n // Computed columns have an Expression in their data, which will be used for building SQL.\n computed?: Expression;\n }\n}\n\n// Adds computed columns to the shape of query object.\nexport function addComputedColumns<\n T extends Query,\n Computed extends ComputedColumnsBase<T>,\n>(q: T, computed: Computed): QueryWithComputed<T, Computed> {\n const { shape } = q;\n for (const key in computed) {\n const expr = computed[key](q);\n (shape as Record<string, ColumnTypeBase>)[key] = expr._type;\n expr._type.data.computed = expr;\n }\n\n return q as QueryWithComputed<T, Computed>;\n}\n"],"names":["i","__spreadProps","__spreadValues","hasOptions","col","query","table","value","q","_a","_b","quoteValue","quotedAs","args","name","types","__objRest","performQuery","require","key","resolve","reject","trx","result","fn","handleResult","columnTypes","options"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqY1B,SAEK,IACa,EAAA;AAChB,IAAA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"}
|