pqb 0.33.2 → 0.34.0
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 +10 -16
- package/dist/index.js +10 -50
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -50
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/sql/rawSql.ts","../src/columns/columnType.ts","../src/columns/columnType.utils.ts","../src/columns/code.ts","../src/sql/utils.ts","../src/columns/operators.ts","../src/columns/number.ts","../src/columns/string.ts","../src/columns/dateTime.ts","../src/columns/boolean.ts","../src/columns/json.ts","../src/query/query.ts","../src/sql/common.ts","../src/sql/distinct.ts","../src/errors.ts","../src/query/queryUtils.ts","../src/sql/where.ts","../src/sql/join.ts","../src/queryMethods/join/processJoinArgs.ts","../src/queryMethods/none.ts","../src/queryMethods/join/_join.ts","../src/columns/enum.ts","../src/columns/array.ts","../src/columns/defaultSchemaConfig.ts","../src/queryMethods/transaction.ts","../src/queryMethods/then.ts","../src/queryMethods/select.ts","../src/common/selectItemExpression.ts","../src/queryMethods/get.utils.ts","../src/queryMethods/as.ts","../src/queryMethods/from.ts","../src/queryMethods/queryMethods.utils.ts","../src/queryMethods/json.utils.ts","../src/sql/select.ts","../src/sql/orderBy.ts","../src/sql/window.ts","../src/sql/having.ts","../src/sql/with.ts","../src/sql/types.ts","../src/sql/fromAndAs.ts","../src/sql/constants.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/columns/customType.ts","../src/columns/columnTypes.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/queryMethods/clear.ts","../src/queryMethods/create.ts","../src/queryMethods/delete.ts","../src/queryMethods/for.ts","../src/queryMethods/get.ts","../src/queryMethods/having.ts","../src/queryMethods/hooks.ts","../src/queryMethods/join/join.ts","../src/queryMethods/json.ts","../src/queryMethods/log.ts","../src/queryMethods/merge.ts","../src/queryMethods/union.ts","../src/queryMethods/with.ts","../src/queryMethods/where/where.ts","../src/queryMethods/update.ts","../src/queryMethods/search.ts","../src/queryMethods/upsertOrCreate.ts","../src/queryMethods/sql.ts","../src/query/queryBase.ts","../src/queryMethods/transform.ts","../src/queryMethods/map.ts","../src/queryMethods/scope.ts","../src/queryMethods/softDelete.ts","../src/queryMethods/expressions.ts","../src/queryMethods/queryMethods.ts","../src/tableData.ts","../src/query/db.ts","../src/testTransaction.ts","../src/modules/computed.ts","../src/modules/getColumnInfo.ts","../src/modules/copyTableData.ts"],"sourcesContent":["import {\n ColumnSchemaConfig,\n DynamicSQLArg,\n emptyObject,\n Expression,\n ExpressionChain,\n ExpressionTypeMethod,\n isTemplateLiteralArgs,\n QueryColumn,\n RawSQLBase,\n RawSQLValues,\n RecordUnknown,\n SQLArgs,\n SQLQueryArgs,\n StaticSQLArgs,\n TemplateLiteralArgs,\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 QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\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 this.result = { value: type as T };\n if (type) {\n Object.assign(this, type.operators);\n }\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 QueryColumn>\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 QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n declare columnTypes: ColumnTypes;\n result: { value: T } = emptyObject as { value: T };\n q: { chain?: ExpressionChain } = {};\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 = never>(...args: StaticSQLArgs): RawSQL<QueryColumn<T>>;\nexport function raw<T = never>(\n ...args: [DynamicSQLArg]\n): DynamicRawSQL<QueryColumn<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\nexport function sqlQueryArgsToExpression(\n args: SQLQueryArgs,\n): RawSQL<QueryColumn> {\n return Array.isArray(args[0])\n ? new RawSQL(args as TemplateLiteralArgs)\n : (args[0] as never);\n}\n\nexport type SqlFn = <\n T,\n Args extends\n | [sql: TemplateStringsArray, ...values: unknown[]]\n | [sql: string]\n | [values: RecordUnknown, sql?: string],\n>(\n this: T,\n ...args: Args\n) => Args extends [RecordUnknown]\n ? (...sql: TemplateLiteralArgs) => RawSQLBase<QueryColumn, T>\n : RawSQLBase<QueryColumn, T>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sqlFn: SqlFn = (...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 RecordUnknown);\n};\n","import { Query } from '../query/query';\nimport {\n ColumnDataBase,\n ColumnNameOfTable,\n ColumnTypeBase,\n ColumnTypeSchemaArg,\n emptyObject,\n ForeignKeyTable,\n PickColumnBaseData,\n PrimaryKeyColumn,\n pushColumnData,\n QueryBaseCommon,\n RawSQLBase,\n setColumnData,\n StaticSQLArgs,\n UniqueColumn,\n} from 'orchid-core';\nimport { raw } from '../sql/rawSql';\nimport { TableData } from '../tableData';\n\n// type of data for ColumnType\nexport interface ColumnData extends ColumnDataBase {\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: TableData.ColumnIndex[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: TableData.ColumnReferences[];\n identity?: TableData.Identity;\n // raw SQL for a generated column\n generated?: RawSQLBase;\n}\n\nexport interface ColumnFromDbParams {\n isNullable?: boolean;\n default?: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n compression?: string;\n collate?: string;\n}\n\nexport interface PickColumnData {\n data: ColumnData;\n}\n\nexport abstract class ColumnType<\n Schema extends ColumnTypeSchemaArg = ColumnTypeSchemaArg,\n Type = unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InputSchema = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Ops = any,\n InputType = Type,\n OutputType = Type,\n OutputSchema = InputSchema,\n QueryType = InputType,\n QuerySchema = InputSchema,\n> extends ColumnTypeBase<\n Schema,\n Type,\n InputSchema,\n Ops,\n InputType,\n OutputType,\n OutputSchema,\n QueryType,\n QuerySchema,\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 * // database-level name can be passed:\n * id: t.uuid().primaryKey('primary_key_name'),\n * }));\n * }\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n *\n * @param name - to specify a constraint name\n */\n primaryKey<T extends PickColumnBaseData, Name extends string>(\n this: T,\n name?: Name,\n ): PrimaryKeyColumn<T, Name> {\n return setColumnData(this, 'primaryKey', name ?? (true as never)) as never;\n }\n\n /**\n * Defines a reference between different tables to enforce data integrity.\n *\n * In [snakeCase](/guide/orm-and-query-builder.html#snakecase-option) 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 migration it's different from OrchidORM table code where a callback with a table is expected:\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 *\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(), // string is varchar(255)\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,\n Table extends ForeignKeyTable,\n Column extends ColumnNameOfTable<Table>,\n >(\n this: T,\n fn: () => Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey<T, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey(\n fnOrTable: TableData.References.FnOrTable,\n column: string,\n options: TableData.References.Options = emptyObject,\n ) {\n return pushColumnData(this, 'foreignKeys', {\n fnOrTable,\n foreignColumns: [column],\n options,\n });\n }\n\n toSQL(): string {\n return this.dataType;\n }\n\n /**\n * Add an index to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // add an index to the name column with default settings:\n * name: t.text().index(),\n * // options are described below:\n * name: t.text().index({ ...options }),\n * // with a database-level name:\n * name: t.text().index('custom_index_name'),\n * // with name and options:\n * name: t.text().index('custom_index_name', { ...options }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * type IndexOptions = {\n * // NULLS NOT DISTINCT: availabe in Postgres 15+, makes sense only for unique index\n * nullsNotDistinct?: true;\n * // index algorithm to use such as GIST, GIN\n * using?: string;\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // include columns to an index to optimize specific queries\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the index. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the index\n * where?: string;\n * // mode is for dropping the index\n * mode?: 'CASCADE' | 'RESTRICT';\n * };\n * ```\n *\n * @param args\n */\n index<T extends PickColumnData>(\n this: T,\n ...args:\n | [options?: TableData.Index.ColumnArg]\n | [name: string, options?: TableData.Index.ColumnArg]\n ): T {\n return pushColumnData(this, 'indexes', {\n options: (typeof args[0] === 'string' ? args[1] : args[0]) ?? emptyObject,\n name: typeof args[0] === 'string' ? args[0] : undefined,\n });\n }\n\n /**\n * `searchIndex` is designed for [full text search](/guide/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` database type.\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.text(),\n * body: t.text(),\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', \"title\" || ' ' || \"body\"))\n * ```\n *\n * You can set different search weights (`A` to `D`) on different columns inside the index:\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.text(),\n * body: t.text(),\n * ...t.searchIndex([\n * { column: 'title', weight: 'A' },\n * { column: 'body', weight: 'B' },\n * ]),\n * }));\n * });\n * ```\n *\n * When the table has localized columns,\n * you can define different indexes for different languages by setting the `language` parameter:\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 * titleEn: t.text(),\n * bodyEn: t.text(),\n * titleFr: t.text(),\n * bodyFr: t.text(),\n * ...t.searchIndex(['titleEn', 'bodyEn'], { language: 'english' }),\n * ...t.searchIndex(['titleFr', 'bodyFr'], { language: 'french' }),\n * }));\n * });\n * ```\n *\n * Alternatively, different table records may correspond to a single language,\n * then you can define a search index that relies on a language column by using `languageColumn` parameter:\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 * lang: t.type('regconfig'),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body'], { languageColumn: 'lang' }),\n * }));\n * });\n * ```\n *\n * It can be more efficient to use a [generated](/guide/migration-column-methods.html#generated-column) column instead of indexing text column in the way described above,\n * and to set a `searchIndex` on it:\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.text(),\n * body: t.text(),\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 { data: ColumnType['data']; dataType: string }>(\n this: T,\n ...args:\n | [options?: TableData.Index.TsVectorColumnArg]\n | [name: string, options?: TableData.Index.TsVectorColumnArg]\n ): T {\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof args[0] === 'string' ? args[1] : args[0]),\n ...(this.dataType === 'tsvector'\n ? { using: 'GIN' }\n : { tsVector: true }),\n },\n name: typeof args[0] === 'string' ? args[0] : undefined,\n });\n }\n\n unique<T extends PickColumnData, Name extends string>(\n this: T,\n ...args:\n | [options?: TableData.Index.UniqueColumnArg]\n | [name: Name, options?: TableData.Index.UniqueColumnArg]\n ): UniqueColumn<T, Name> {\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof args[0] === 'string' ? args[1] : args[0]),\n unique: true,\n },\n name: typeof args[0] === 'string' ? args[0] : undefined,\n }) as never;\n }\n\n comment<T extends PickColumnData>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n compression<T extends PickColumnData>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends PickColumnData>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends PickColumnData>(this: T, cb: (q: Query) => void): T {\n return setColumnData(\n this,\n 'modifyQuery',\n cb as (q: QueryBaseCommon) => void,\n );\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 PickColumnData>(this: T, ...args: StaticSQLArgs): T {\n return setColumnData(this, 'generated', raw(...args));\n }\n}\n","import { RawSQL } from '../sql/rawSql';\nimport { ColumnFromDbParams } from './columnType';\nimport { ColumnTypeBase, RecordString, TemplateLiteralArgs } from 'orchid-core';\n\nconst knownDefaults: RecordString = {\n current_timestamp: 'now()',\n 'transaction_timestamp()': 'now()',\n};\n\nexport const simplifyColumnDefault = (value?: string) => {\n if (typeof value === 'string') {\n return new RawSQL([\n [knownDefaults[value.toLowerCase()] || value],\n ] as unknown as TemplateLiteralArgs);\n }\n return;\n};\n\nexport const instantiateColumn = (\n typeFn: () => ColumnTypeBase,\n params: ColumnFromDbParams,\n): ColumnTypeBase => {\n const column = typeFn();\n\n const { dateTimePrecision } = params;\n\n Object.assign(column.data, {\n ...params,\n dateTimePrecision:\n // 0 is default for date, 6 is default for timestamp\n dateTimePrecision && dateTimePrecision !== 6\n ? dateTimePrecision\n : undefined,\n collate: params.collate,\n default: simplifyColumnDefault(params.default),\n });\n\n return column as unknown as ColumnTypeBase;\n};\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n addCode,\n Code,\n columnDefaultArgumentToCode,\n columnErrorMessagesToCode,\n ColumnsShapeBase,\n ColumnTypeBase,\n objectHasValues,\n quoteObjectKey,\n singleQuote,\n singleQuoteArray,\n toArray,\n RawSQLBase,\n ColumnDataCheckBase,\n Codes,\n emptyObject,\n} from 'orchid-core';\nimport { TableData } from '../tableData';\n\nexport const 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 t: string,\n): Codes => {\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 return code;\n};\n\nexport const pushTableDataCode = (code: Codes, ast: TableData): Codes => {\n const lines: Codes[] = [];\n\n if (ast.primaryKey) {\n lines.push([primaryKeyInnerToCode(ast.primaryKey, 't') + ',']);\n }\n\n if (ast.indexes) {\n for (const index of ast.indexes) {\n lines.push(indexToCode(index, 't'));\n }\n }\n\n if (ast.constraints) {\n for (const constraint of ast.constraints) {\n lines.push(constraintToCode(constraint, 't', true));\n }\n }\n\n if (lines.length > 1) {\n code.push('(t) => [', ...lines, '],');\n } else if (lines[0].length === 1 && typeof lines[0][0] === 'string') {\n code.push('(t) => ' + lines[0][0]);\n } else {\n code.push('(t) => ', lines[0]);\n }\n\n return code;\n};\n\nexport const primaryKeyInnerToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.name;\n\n return `${t}.primaryKey([${primaryKey.columns.map(singleQuote).join(', ')}]${\n name ? `, ${singleQuote(name)}` : ''\n })`;\n};\n\nexport const indexToCode = (\n index: TableData.Index,\n t: string,\n prefix?: string,\n): Codes => {\n const code = indexInnerToCode(index, t);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(',')) addCode(code, ',');\n return code;\n};\n\nexport const indexInnerToCode = (index: TableData.Index, t: string): Codes => {\n const code: Codes = [];\n\n code.push(\n `${t}.${\n index.options.tsVector\n ? 'searchIndex'\n : index.options.unique\n ? 'unique'\n : 'index'\n }(`,\n );\n\n const columnOptions = ['collate', 'opclass', 'order', 'weight'] as const;\n\n const indexOptionsKeys: (undefined | keyof TableData.Index.Options)[] = [\n index.options.tsVector ? 'unique' : undefined,\n 'using',\n 'nullsNotDistinct',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'language',\n 'languageColumn',\n 'dropMode',\n ];\n\n const hasOptions = indexOptionsKeys.some((key) => key && index.options[key]);\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\n if (columnsMultiline) {\n const objects: Codes = [];\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') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Codes = [\n `${'column' in column ? 'column' : 'expression'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, hasOptions || index.name ? '],' : ']']);\n\n if (index.name) {\n addCode(code, ` ${singleQuote(index.name)},`);\n }\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n\n if (index.name) {\n addCode(code, `, ${singleQuote(index.name)}`);\n }\n }\n\n if (hasOptions) {\n if (columnsMultiline) {\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key of indexOptionsKeys) {\n if (!key) continue;\n\n const value = index.options[key];\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 m?: boolean,\n prefix?: string,\n): Codes => {\n const code = constraintInnerToCode(item, t, m);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(','))\n code[code.length - 1] += ',';\n return code;\n};\n\nexport const constraintInnerToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n): Codes => {\n if (item.references) {\n return [\n `${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name, m),\n '),',\n ];\n }\n\n return [\n `${t}.check(${(item.check as TableData.Check).toCode(t)}${\n item.name ? `, ${singleQuote(item.name)}` : ''\n })`,\n ];\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 m?: boolean,\n): Codes => {\n const args: Codes = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n if (m && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\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: TableData.ColumnReferences[],\n migration: boolean | undefined,\n): Codes => {\n const code: Codes = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey, migration)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n {\n fnOrTable,\n foreignColumns,\n options = emptyObject,\n }: TableData.ColumnReferences,\n migration: boolean | undefined,\n): Codes => {\n const code: Code = [];\n\n if (migration && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n code.push(\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString(),\n );\n\n addCode(code, `, ${singleQuote(foreignColumns[0])}`);\n\n const hasOptions =\n options.name || options.match || options.onUpdate || options.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (options.name) arr.push(`name: ${singleQuote(options.name)},`);\n if (options.match) arr.push(`match: ${singleQuote(options.match)},`);\n if (options.onUpdate)\n arr.push(`onUpdate: ${singleQuote(options.onUpdate)},`);\n if (options.onDelete)\n arr.push(`onDelete: ${singleQuote(options.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): Codes => {\n const code: Codes = [];\n for (const { options, name } of indexes) {\n addCode(code, `.${options.unique ? 'unique' : 'index'}(`);\n\n const arr: string[] = [];\n\n if (options.collate) arr.push(`collate: ${singleQuote(options.collate)},`);\n if (options.opclass) arr.push(`opclass: ${singleQuote(options.opclass)},`);\n if (options.order) arr.push(`order: ${singleQuote(options.order)},`);\n if (name) arr.push(`name: ${singleQuote(name)},`);\n if (options.using) arr.push(`using: ${singleQuote(options.using)},`);\n if (options.include)\n arr.push(\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n );\n if (options.nullsNotDistinct) arr.push(`nullsNotDistinct: true,`);\n if (options.with) arr.push(`with: ${singleQuote(options.with)},`);\n if (options.tablespace)\n arr.push(`tablespace: ${singleQuote(options.tablespace)},`);\n if (options.where) arr.push(`where: ${singleQuote(options.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 = (\n t: string,\n { sql, name }: ColumnDataCheckBase,\n): string => {\n return `.check(${sql.toCode(t)}${name ? `, { name: '${name}' }` : ''})`;\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Codes = [];\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.increment && identity.increment !== 1)\n props.push(`increment: ${identity.increment},`);\n if (identity.start && identity.start !== 1)\n props.push(`start: ${identity.start},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache && identity.cache !== 1)\n props.push(`cache: ${identity.cache},`);\n if (identity.cycle) props.push(`cycle: true,`);\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 migration: boolean | undefined,\n data = type.data,\n skip?: { 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.primaryKey) {\n addCode(\n code,\n `.primaryKey(${\n data.primaryKey === (true as never) ? '' : singleQuote(data.primaryKey)\n })`,\n );\n }\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(data.foreignKeys, migration)) {\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 (\n data.default !== undefined &&\n (!migration || typeof data.default !== 'function')\n ) {\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 code.length === 1 && typeof code[0] === 'string' ? code[0] : code;\n};\n","import { Sql } from 'orchid-core';\n\nexport const getSqlText = (sql: Sql) => {\n if ('text' in sql) return sql.text;\n throw new Error(`Batch SQL is not supported in this query`);\n};\n","import {\n PickQueryBaseQuery,\n PickQueryColumnTypes,\n PickQueryQ,\n PickQueryResultColumnTypes,\n Query,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { ToSQLCtx } from '../sql';\nimport { getSqlText } from '../sql/utils';\nimport {\n addValue,\n ColumnTypeBase,\n Expression,\n getValueKey,\n isExpression,\n MaybeArray,\n PickOutputTypeAndOperators,\n PickQueryResult,\n QueryColumn,\n RecordUnknown,\n} from 'orchid-core';\nimport { BooleanQueryColumn } from '../queryMethods';\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 interface Operator<\n Value,\n Column extends PickOutputTypeAndOperators = PickOutputTypeAndOperators,\n> {\n <T extends PickQueryResult>(this: T, arg: Value):\n | Omit<\n SetQueryReturnsColumnOrThrow<T, Column>,\n keyof T['result']['value']['operators']\n > &\n Column['operators'];\n // argument type of the function\n _opType: Value;\n}\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 **not** dropped from the query.\nexport function setQueryOperators(\n query: PickQueryBaseQuery,\n operators: RecordUnknown,\n) {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.operators !== operators) {\n q.operators = operators;\n Object.assign(query, operators);\n }\n\n return query;\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\nconst make = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any, ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: Query, value: any) {\n (this.q.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 as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\n};\n\nconst makeVarArg = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any[], ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: Query, ...args: any[]) {\n (this.q.chain ??= []).push(_op, args);\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 as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\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 `(${getSqlText((arg as Query).toSQL({ values: ctx.values }))})`;\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\n// common operators that exist for any types\ninterface Base<Value> {\n equals: Operator<Value | Query | Expression, BooleanQueryColumn>;\n not: Operator<Value | Query | Expression, BooleanQueryColumn>;\n in: Operator<Value[] | Query | Expression, BooleanQueryColumn>;\n notIn: Operator<Value[] | Query | Expression, BooleanQueryColumn>;\n}\n\nconst base: Base<unknown> = {\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};\n\ninterface OperatorsBooleanSelf extends OperatorsBoolean {\n result: { value: BooleanQueryColumn };\n}\n\n// Boolean type operators\nexport interface OperatorsBoolean extends Base<boolean> {\n and: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n or: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\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 OperatorsBoolean;\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\ninterface Ord<Value> extends Base<Value> {\n lt: Operator<Value | Query | Expression, BooleanQueryColumn>;\n lte: Operator<Value | Query | Expression, BooleanQueryColumn>;\n gt: Operator<Value | Query | Expression, BooleanQueryColumn>;\n gte: Operator<Value | Query | Expression, BooleanQueryColumn>;\n between: Operator<\n [Value | Query | Expression, Value | Query | Expression],\n BooleanQueryColumn\n >;\n}\n\nexport type OperatorsNumber = 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(\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 OperatorsNumber;\n\n// Text type operators\nexport interface OperatorsText extends Base<string> {\n contains: Operator<string | Query | Expression, BooleanQueryColumn>;\n containsSensitive: Operator<string | Query | Expression, BooleanQueryColumn>;\n startsWith: Operator<string | Query | Expression, BooleanQueryColumn>;\n startsWithSensitive: Operator<\n string | Query | Expression,\n BooleanQueryColumn\n >;\n endsWith: Operator<string | Query | Expression, BooleanQueryColumn>;\n endsWithSensitive: Operator<string | Query | Expression, BooleanQueryColumn>;\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 OperatorsText;\n\ninterface JsonPathQueryOptions {\n vars?: RecordUnknown;\n silent?: boolean;\n}\n\ninterface JsonPathQueryTypeOptions<\n T extends PickQueryColumnTypes,\n C extends QueryColumn,\n> extends JsonPathQueryOptions {\n type?: (types: T['columnTypes']) => C;\n}\n\ninterface JsonPathQuery {\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * Calls the [jsonb_path_query_first](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * Type can be provided via `{ type: (t) => t.columnType() }` options, by default the type is `unknown`.\n *\n * Optionally takes `vars` and `silent` parameters, see [Postgres docs](https://www.postgresql.org/docs/current/functions-json.html) for details.\n *\n * ```ts\n * // query a single value from a JSON data,\n * // because of the provided type, string JSON value will be parsed to a Date object.\n * const value = await db.table\n * .get('data')\n * .jsonPathQueryFirst('$.path.to.date', { type: (t) => t.date().asDate() });\n *\n * // using it in a select\n * const records = await db.table.select({\n * date: (q) =>\n * q.get('data').jsonPathQueryFirst('$[*] ? (@ = key)', {\n * type: (t) => t.integer(),\n * // defining `vars` and `silent`\n * vars: { key: 'key' },\n * silent: true,\n * }),\n * });\n *\n * // using it in `where`\n * const filtered = await db.table.where((q) =>\n * // filtering records by the `name` property from the `data` JSON column\n * q.get('data').jsonPathQueryFirst('$.name').equals('name'),\n * );\n *\n * // using it in update\n * await db.table.find(id).update({\n * // using data property to set the `name` column\n * name: (q) =>\n * q.get('data').jsonPathQueryFirst('$.name', { type: (t) => t.string() }),\n * });\n * ```\n *\n * @param path - JSON path\n * @param options - can have type, vars, silent\n */\n <\n T extends PickQueryResultColumnTypes,\n C extends QueryColumn = QueryColumn<unknown, OperatorsAny>,\n >(\n this: T,\n path: string,\n options?: JsonPathQueryTypeOptions<T, C>,\n ): Omit<\n SetQueryReturnsColumnOrThrow<T, C>,\n keyof T['result']['value']['operators']\n > &\n C['operators'];\n\n // disallow it from `where`\n _opType: never;\n}\n\n// JSON type operators\nexport interface OperatorsJson extends Base<unknown> {\n jsonPathQueryFirst: JsonPathQuery;\n jsonSupersetOf: Operator<unknown | Query | Expression, BooleanQueryColumn>;\n jsonSubsetOf: Operator<unknown | Query | Expression, BooleanQueryColumn>;\n jsonSet: {\n /**\n * Returns a JSON value/object/array where a given value is set at the given path.\n * The path is a key or an array of keys to access the value.\n *\n * Calls the [jsonb_set](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], 'new value'),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonReplace: {\n /**\n * The same as {@link jsonSet}, but sets the last argument of `jsonb_set` to false,\n * so this function only has effect when the value already existed in the JSON.\n *\n * ```ts\n * await db.table.find(id).update({\n * // data.path.to.value will be updated only if it already was defined\n * data: (q) => q.get('data').jsonReplace(['path', 'to', 'value'], 'new value'),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonInsert: {\n /**\n * Inserts a value into a given position of JSON array and returns the whole array.\n * The path is a key or an array of keys to access the value.\n *\n * If a value exists at the given path, the value is not replaced.\n *\n * Provide `{ after: true }` option to insert a value after a given position.\n *\n * Calls the [jsonb_insert](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // update the record with data { tags: ['two'] } to have data { tags: ['one', 'two'] }\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 0], 'one'),\n * });\n *\n * // add 'three' after 'two'\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 1], 'three', { after: true }),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to insert\n * @param options - can have `after: true`\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n options?: { after?: boolean },\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonRemove: {\n /**\n * Remove a value from a JSON object or array at a given path.\n * The path is a key or an array of keys to access the value.\n *\n * Uses the [#-](https://www.postgresql.org/docs/current/functions-json.html) Postgres operator.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // the record has data { tags: ['one', 'two'] }\n * // removing the first tag, the data will be { tags: ['two'] }\n * const result = await db.table.find(id).update({\n * data: (q) => q.get('data').jsonRemove(['tags', 0]),\n * });\n * ```\n *\n * @param path - key or array of keys\n */\n <T extends PickQueryResult>(this: T, path: MaybeArray<string | number>): T;\n // disallow it from `where`\n _opType: never;\n };\n}\n\nconst encodeJsonPath = (ctx: ToSQLCtx, path: MaybeArray<string | number>) =>\n addValue(ctx.values, `{${Array.isArray(path) ? path.join(', ') : path}}`);\n\nconst jsonPathQueryOp = (\n key: string,\n [path, options]: [path: string, options?: JsonPathQueryOptions],\n ctx: ToSQLCtx,\n) =>\n `jsonb_path_query_first(${key}, ${addValue(ctx.values, path)}${\n options?.vars\n ? `, ${addValue(ctx.values, JSON.stringify(options.vars))}${\n options.silent ? ', true' : ''\n }`\n : options?.silent\n ? ', NULL, true'\n : ''\n })`;\n\nconst json = {\n ...base,\n jsonPathQueryFirst: Object.assign(\n function (\n this: Query,\n path: string,\n options?: JsonPathQueryTypeOptions<PickQueryColumnTypes, ColumnTypeBase>,\n ) {\n (this.q.chain ??= []).push(jsonPathQueryOp, [path, options]);\n\n if (this.q.parsers?.[getValueKey]) {\n this.q.parsers[getValueKey] = undefined;\n }\n\n if (options?.type) {\n const parse = options.type(this.columnTypes).parseFn;\n if (parse) (this.q.parsers ??= {})[getValueKey] = parse;\n }\n\n return this;\n },\n { _op: jsonPathQueryOp },\n ) as never,\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 jsonSet: makeVarArg(\n (key, [path, value], ctx) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )})`,\n ),\n jsonReplace: makeVarArg(\n (key, [path, value], ctx) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )}, false)`,\n ),\n jsonInsert: makeVarArg(\n (key, [path, value, options], ctx) =>\n `jsonb_insert(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )}${options?.after ? ', true' : ''})`,\n ),\n jsonRemove: makeVarArg(\n (key, [path], ctx) => `(${key} #- ${encodeJsonPath(ctx, path)})`,\n ),\n} as OperatorsJson;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsAny = Base<any>;\nexport type OperatorsDate = Ord<Date | string>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsArray = Base<any>;\n\nexport type OperatorsTime = Ord<string>;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators: {\n any: OperatorsAny;\n boolean: OperatorsBoolean;\n number: OperatorsNumber;\n date: OperatorsDate;\n time: OperatorsTime;\n text: OperatorsText;\n json: OperatorsJson;\n array: OperatorsArray;\n} = {\n any: base,\n boolean,\n number: numeric,\n date: numeric,\n time: numeric,\n text,\n json,\n array: base,\n} as never;\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n Code,\n Expression,\n joinTruthy,\n BaseNumberData,\n numberDataToCode,\n setColumnData,\n addCode,\n ColumnWithDefault,\n ColumnSchemaConfig,\n PickColumnBaseData,\n Codes,\n} from 'orchid-core';\nimport { columnCode, identityToCode } from './code';\nimport { Operators, OperatorsNumber } from './operators';\nimport { TableData } from '../tableData';\n\nexport interface NumberColumnData extends BaseNumberData {\n identity: TableData.Identity;\n}\n\nexport interface SerialColumnData extends NumberColumnData {\n default: Expression;\n}\n\nexport abstract class NumberBaseColumn<\n Schema extends ColumnSchemaConfig,\n SchemaType extends Schema['type'],\n> extends ColumnType<Schema, number, SchemaType, OperatorsNumber> {\n declare data: NumberColumnData;\n operators = Operators.number;\n}\n\nexport abstract class IntegerBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['int']>> {\n declare data: NumberColumnData;\n constructor(schema: Schema) {\n super(schema, schema.int() as never);\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsNumber\n> {\n operators = Operators.number;\n declare data: ColumnData;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n}\n\nexport interface DecimalColumnData extends ColumnData {\n numericPrecision?: number;\n numericScale?: number;\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsNumber\n> {\n declare data: DecimalColumnData;\n operators = Operators.number;\n dataType = 'numeric' as const;\n\n constructor(\n schema: Schema,\n numericPrecision?: number,\n numericScale?: number,\n ) {\n super(schema, schema.stringSchema() as never);\n this.data.numericPrecision = numericPrecision;\n this.data.numericScale = numericScale;\n this.data.alias = 'decimal';\n }\n\n toCode(t: string, m?: boolean): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n t,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n m,\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 = (\n column: ColumnType,\n t: string,\n alias: string,\n m: boolean | undefined,\n): Code => {\n let code: Codes;\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, alias);\n } else {\n code = [`${alias}()`];\n }\n\n addCode(code, numberDataToCode(column.data, m, skipNumberMethods));\n\n return columnCode(column, t, code, m);\n};\n\nexport type IdentityColumn<T extends PickColumnBaseData> = ColumnWithDefault<\n T,\n Expression\n>;\n\n// signed two-byte integer\nexport class SmallIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'smallint';\n }\n\n parseItem = parseInt;\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'smallint', m);\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<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'integer';\n }\n\n parseItem = parseInt;\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'integer', m);\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<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'bigint', m);\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// single precision floating-point number (4 bytes)\nexport class RealColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['number']>> {\n dataType = 'float4' as const;\n parseItem = parseFloat;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n this.data.alias = 'real';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `real()${numberDataToCode(this.data, m)}`, m);\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'float8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'doublePrecision';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `doublePrecision()`, m);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'smallSerial';\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `smallSerial()${numberDataToCode(this.data, m, skipNumberMethods)}`,\n m,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'serial';\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `serial()${numberDataToCode(this.data, m, skipNumberMethods)}`,\n m,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `bigSerial()`, m);\n }\n}\n","import { ColumnData, ColumnType, PickColumnData } from './columnType';\nimport { NumberBaseColumn } from './number';\nimport {\n Code,\n joinTruthy,\n StringTypeData,\n stringDataToCode,\n PrimaryKeyColumn,\n TemplateLiteralArgs,\n getDefaultLanguage,\n RawSQLBase,\n StaticSQLArgs,\n ColumnSchemaConfig,\n PickColumnBaseData,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { RawSQL } from '../sql/rawSql';\nimport { SearchWeightRecord } from '../sql';\nimport { Operators, OperatorsText } from './operators';\n\nexport type TextColumnData = StringTypeData;\n\nexport abstract class TextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n declare data: TextColumnData;\n operators = Operators.text;\n\n constructor(\n schema: Schema,\n schemaType: ReturnType<\n Schema['stringSchema']\n > = schema.stringSchema() as never,\n ) {\n super(schema, schemaType);\n }\n}\n\nexport abstract class LimitedTextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n declare data: TextColumnData & { maxChars?: number };\n\n constructor(schema: Schema, limit?: number) {\n super(\n schema,\n (limit ? schema.stringMax(limit) : schema.stringSchema()) as never,\n );\n this.data.maxChars = 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 Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'varchar' as const;\n toCode(t: string, m?: boolean): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data, m)}`,\n m,\n );\n }\n}\n\nexport class StringColumn<\n Schema extends ColumnSchemaConfig,\n> extends VarCharColumn<Schema> {\n constructor(schema: Schema, limit = 255) {\n super(schema, limit);\n }\n\n toCode(t: string, m?: boolean): Code {\n let max: number | undefined = this.data.maxChars;\n if (max === 255) max = undefined;\n return columnCode(\n this,\n t,\n `string(${max ?? ''})${stringDataToCode(this.data, m)}`,\n m,\n );\n }\n}\n\n// character(n), char(n) fixed-length, blank padded\nexport class CharColumn<\n Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'char' as const;\n toCode(t: string, m?: boolean): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `char(${maxChars ?? ''})${stringDataToCode(this.data, m)}`,\n m,\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<ColumnSchemaConfig> & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n t: string,\n m?: boolean,\n) => {\n const data = { ...column.data };\n let args = '';\n const hasMax = data.maxArg !== undefined && data.max === data.maxArg;\n if ((data.minArg !== undefined && data.min === data.minArg) || hasMax) {\n if (data.minArg !== 0 || (hasMax && data.max !== Infinity)) {\n args += data.minArg;\n }\n delete data.min;\n if (hasMax) {\n if (data.maxArg !== Infinity) {\n args += `, ${data.maxArg}`;\n }\n delete data.max;\n }\n }\n return columnCode(\n column,\n t,\n `${column.dataType}(${args})${stringDataToCode(data, m)}`,\n m,\n );\n};\n\nconst minMaxToSchema = <Schema extends ColumnSchemaConfig>(\n schema: Schema,\n min?: number,\n max?: number,\n) =>\n min\n ? max\n ? schema.stringMinMax(min, max)\n : schema.stringMin(min)\n : schema.stringSchema();\n\n// text\tvariable unlimited length\nexport class TextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(schema: Schema, min?: number, max?: number) {\n super(schema, minMaxToSchema(schema, min, max) as never);\n setTextColumnData(this, min, max);\n }\n\n toCode(t: string, m?: boolean): Code {\n return textColumnToCode(this, t, m);\n }\n}\n\n// To store binary strings\nexport class ByteaColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n Buffer,\n ReturnType<Schema['buffer']>,\n OperatorsText\n> {\n dataType = 'bytea' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.buffer() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `bytea()`, m);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'point' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `point()`, m);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'line' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `line()`, m);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'lseg' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `lseg()`, m);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'box' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `box()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'path' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `path()`, m);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'polygon' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `polygon()`, m);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'circle' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `circle()`, m);\n }\n}\n\nexport class MoneyColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['stringSchema']>> {\n dataType = 'money' as const;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `money()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'cidr' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `cidr()`, m);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'inet' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `inet()`, m);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'macaddr' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `macaddr()`, m);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'macaddr8' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `macaddr8()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['bit']>,\n OperatorsText\n> {\n dataType = 'bit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: number };\n\n constructor(schema: Schema, length: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { length } = this.data;\n return columnCode(this, t, `bit(${length})`, m);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<Schema, string, ReturnType<Schema['bit']>, OperatorsText> {\n dataType = 'varbit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length?: number };\n\n constructor(schema: Schema, length?: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n this.data.alias = 'bitVarying';\n }\n\n toCode(t: string, m?: boolean): Code {\n const { length } = this.data;\n return columnCode(this, t, `bitVarying(${length ?? ''})`, m);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | SearchWeightRecord;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'tsvector' as const;\n operators = Operators.text;\n\n constructor(schema: Schema, public defaultLanguage = getDefaultLanguage()) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `tsvector()`, m);\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 PickColumnData>(\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 const language =\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn<ColumnSchemaConfig>)\n .defaultLanguage;\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('${language}', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '(') +\n `setweight(to_tsvector('${language}', coalesce(\"${key}\", '')), '${target[key]}')`;\n }\n if (sql) sql += ')';\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<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'tsquery' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `tsquery()`, m);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSQL(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['uuid']>,\n OperatorsText\n> {\n dataType = 'uuid' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.uuid() as never);\n }\n\n /**\n * see {@link ColumnType.primaryKey}\n */\n primaryKey<T extends PickColumnBaseData, Name extends string>(\n this: T,\n name?: Name,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n PrimaryKeyColumn<T, Name> & { data: { default: RawSQLBase } } {\n const column = super.primaryKey(name);\n if (!column.data.default) column.data.default = uuidDefault;\n return column as never;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { data } = this;\n return columnCode(\n this,\n t,\n `uuid()`,\n m,\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'xml' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `xml()`, m);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(schema: Schema, min?: number, max?: number) {\n super(schema, minMaxToSchema(schema, min, max) as never);\n setTextColumnData(this, min, max);\n }\n\n toCode(t: string, m?: boolean): Code {\n return textColumnToCode(this, t, m);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n Code,\n ColumnSchemaConfig,\n DateColumnData,\n dateDataToCode,\n joinTruthy,\n TimeInterval,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators, OperatorsDate, OperatorsTime } from './operators';\n\nexport type DateColumnInput = string | number | Date;\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (input: DateColumnInput) => {\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// common class for Date and DateTime columns\nexport abstract class DateBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringNumberDate']>,\n OperatorsDate,\n DateColumnInput,\n string,\n ReturnType<Schema['stringSchema']>\n> {\n declare data: DateColumnData;\n operators = Operators.date;\n encodeFn = dateTimeEncode;\n asNumber: Schema['dateAsNumber'];\n asDate: Schema['dateAsDate'];\n\n constructor(schema: Schema) {\n super(\n schema,\n schema.stringNumberDate() as never,\n schema.stringSchema() as never,\n schema.stringNumberDate() as never,\n );\n this.asNumber = schema.dateAsNumber;\n this.asDate = schema.dateAsDate;\n }\n}\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n dataType = 'date' as const;\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `date()${dateDataToCode(this.data, m)}`,\n m,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema);\n this.data.dateTimePrecision = dateTimePrecision;\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\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 = (\n self:\n | TimestampColumn<ColumnSchemaConfig>\n | TimestampTZColumn<ColumnSchemaConfig>,\n t: string,\n m: boolean | undefined,\n) => {\n const { dateTimePrecision: p } = self.data;\n\n const { defaultTimestamp } = self.data;\n if (defaultTimestamp) {\n const noTz = self instanceof TimestampColumn ? 'NoTZ' : '';\n\n const def = self.data.default;\n const modifyQuery = self.data.modifyQuery;\n self.data.default = undefined;\n self.data.modifyQuery = undefined;\n\n const code = columnCode(\n self,\n t,\n `timestamps${noTz}(${\n p && p !== 6 ? p : ''\n }).${defaultTimestamp}${dateDataToCode(self.data, m)}`,\n m,\n self.data,\n skipDateMethodsFromToCode,\n );\n\n self.data.default = def;\n self.data.modifyQuery = modifyQuery;\n\n return code;\n } else {\n return columnCode(\n self,\n t,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data, m)}`,\n m,\n self.data,\n skipDateMethodsFromToCode,\n );\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n dataType = 'timestamp' as const;\n toCode(t: string, m?: boolean): Code {\n return timestampToCode(this, t, m);\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeTzBaseClass<Schema> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(t: string, m?: boolean): Code {\n return timestampToCode(this, t, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsTime\n> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema, schema.stringSchema() as never);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n t,\n `time(${dateTimePrecision || ''})${dateDataToCode(this.data, m)}`,\n m,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n TimeInterval,\n ReturnType<Schema['timeInterval']>,\n OperatorsDate\n> {\n declare data: ColumnData & { fields?: string; precision?: number };\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(schema: Schema, fields?: string, precision?: number) {\n super(schema, schema.timeInterval() as never);\n this.data.fields = fields;\n this.data.precision = precision;\n }\n\n toCode(t: string, m?: boolean): 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 m,\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, ColumnSchemaConfig } from 'orchid-core';\nimport { Operators, OperatorsBoolean } from './operators';\n\n// 1 byte, true or false\nexport class BooleanColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n boolean,\n ReturnType<Schema['boolean']>,\n OperatorsBoolean\n> {\n dataType = 'bool' as const;\n operators = Operators.boolean;\n\n constructor(schema: Schema) {\n super(schema, schema.boolean() as never);\n this.data.alias = 'boolean';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, 'boolean()', m);\n }\n\n parseItem = (input: string) => input[0] === 't';\n}\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Operators, OperatorsJson, OperatorsText } from './operators';\nimport { Code, ColumnSchemaConfig, ColumnTypeSchemaArg } from 'orchid-core';\n\nconst encodeFn = (x: unknown) => (x === null ? x : JSON.stringify(x));\n\n// skip adding the default `encode` function to code\nconst toCodeSkip = { encodeFn };\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n> extends ColumnType<Schema, T, Schema['type'], OperatorsJson> {\n dataType = 'jsonb' as const;\n operators = Operators.json;\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `json()`, m, this.data, toCodeSkip);\n }\n}\n\n// Encode data of both types with JSON.stringify\nJSONColumn.prototype.encodeFn = encodeFn;\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'json' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `jsonText()`, m, this.data, toCodeSkip);\n }\n}\n","import { GetStringArg, QueryMetaHasWhere, QueryMethods } from '../queryMethods';\nimport { QueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport { Db } from './db';\nimport { RelationsBase } from '../relations';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n ColumnShapeOutput,\n EmptyObject,\n Expression,\n OperatorsNullable,\n PickOutputType,\n PickQueryMeta,\n PickQueryMetaResult,\n PickQueryMetaResultReturnType,\n PickQueryMetaReturnType,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryTable,\n PickType,\n QueryCatch,\n QueryColumn,\n QueryColumns,\n QueryInternalBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryBase } from './queryBase';\nimport { ColumnType } from '../columns';\nimport { TableData } from '../tableData';\n\nexport interface DbExtension {\n name: string;\n version?: string;\n}\n\nexport type DbDomainArg<ColumnTypes> = (columnTypes: ColumnTypes) => ColumnType;\n\nexport type DbDomainArgRecord = { [K: string]: DbDomainArg<any> }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface QueryInternal<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SinglePrimaryKey = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumns = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumnNames = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumnTuples = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueConstraints = any,\n> extends QueryInternalBase {\n singlePrimaryKey: SinglePrimaryKey;\n uniqueColumns: UniqueColumns;\n uniqueColumnNames: UniqueColumnNames;\n uniqueColumnTuples: UniqueColumnTuples;\n uniqueConstraints: UniqueConstraints;\n extensions?: DbExtension[];\n domains?: DbDomainArgRecord;\n tableData: TableData;\n // access with `getPrimaryKeys` utility\n primaryKeys?: string[];\n}\n\nexport type SelectableFromShape<\n Shape extends QueryColumns,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape & string as `${Table}.${K}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport interface WithDataItem {\n table: string;\n shape: QueryColumns;\n}\n\nexport interface WithDataItems {\n [K: string]: WithDataItem;\n}\n\nexport type WithDataBase = EmptyObject;\n\nexport interface Query extends QueryBase, QueryMethods<unknown> {\n queryBuilder: Db;\n columnTypes: unknown;\n shape: QueryColumns;\n inputType: RecordUnknown;\n q: QueryData;\n then: QueryThen<unknown>;\n catch: QueryCatch;\n windows: EmptyObject;\n defaultSelectColumns: string[];\n relations: RelationsBase;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n}\n\nexport interface PickQueryWithData {\n withData: WithDataBase;\n}\n\nexport interface PickQueryWindows {\n windows: EmptyObject;\n}\n\nexport interface PickQueryRelations {\n relations: RelationsBase;\n}\n\nexport interface PickQueryQ {\n q: QueryData;\n}\n\nexport interface PickQueryInternal {\n internal: QueryInternal;\n}\n\nexport interface PickQueryBaseQuery {\n baseQuery: Query;\n}\n\nexport interface PickQueryMetaRelations\n extends PickQueryMeta,\n PickQueryRelations {}\n\nexport interface PickQueryMetaResultRelations\n extends PickQueryResult,\n PickQueryMeta,\n PickQueryRelations {}\n\nexport interface PickQueryMetaResultRelationsWindows\n extends PickQueryMetaResultRelations,\n PickQueryWindows {}\n\nexport interface PickQueryColumnTypes {\n columnTypes: unknown;\n}\n\nexport interface PickQueryMetaResultRelationsWindowsColumnTypes\n extends PickQueryMetaResultRelationsWindows,\n PickQueryColumnTypes {}\n\nexport interface PickQueryWithDataColumnTypes\n extends PickQueryWithData,\n PickQueryColumnTypes {}\n\nexport interface PickQueryResultColumnTypes\n extends PickQueryResult,\n PickQueryColumnTypes {}\n\nexport interface PickQueryMetaWithDataColumnTypes\n extends PickQueryMeta,\n PickQueryWithData,\n PickQueryColumnTypes {}\n\nexport interface PickQueryMetaTable extends PickQueryMeta, PickQueryTable {}\n\nexport interface PickQueryMetaTableShape\n extends PickQueryMetaTable,\n PickQueryShape {}\n\nexport interface PickQueryMetaWithData\n extends PickQueryMeta,\n PickQueryWithData {}\n\nexport interface PickQueryRelationsWithData\n extends PickQueryWithData,\n PickQueryRelations {}\n\nexport interface PickQueryMetaShapeRelationsWithData\n extends PickQueryMeta,\n PickQueryShape,\n PickQueryRelations,\n PickQueryWithData {}\n\nexport interface PickQueryMetaResultRelationsWithDataReturnType\n extends PickQueryMeta,\n PickQueryResult,\n PickQueryRelations,\n PickQueryWithData,\n PickQueryReturnType {}\n\nexport interface PickQueryMetaTableShapeReturnTypeWithData\n extends PickQueryMetaTableShape,\n PickQueryReturnType,\n PickQueryMetaWithData {}\n\nexport interface PickQueryMetaResultRelationsWithDataReturnTypeShape\n extends PickQueryMetaResultRelationsWithDataReturnType,\n PickQueryShape {}\n\nexport interface PickQueryMetaResultReturnTypeWithDataWindows\n extends PickQueryMetaResultReturnType,\n PickQueryWithData,\n PickQueryWindows {}\n\nexport interface PickQueryMetaResultReturnTypeWithDataWindowsTable<\n Table extends string | undefined,\n> extends PickQueryMetaResultReturnType,\n PickQueryWithData,\n PickQueryWindows {\n table: Table;\n}\n\nexport interface PickQueryQAndInternal extends PickQueryQ, PickQueryInternal {}\n\nexport interface PickQueryQAndBaseQuery\n extends PickQueryQ,\n PickQueryBaseQuery {}\n\nexport interface PickQuerySinglePrimaryKey {\n internal: {\n singlePrimaryKey: unknown;\n };\n}\n\nexport interface PickQueryShapeSinglePrimaryKey\n extends PickQueryShape,\n PickQuerySinglePrimaryKey {}\n\nexport interface PickQueryShapeResultSinglePrimaryKey\n extends PickQueryShapeSinglePrimaryKey,\n PickQueryResult {}\n\nexport type SelectableOfType<T extends PickQueryMeta, Type> = {\n [K in keyof T['meta']['selectable']]: T['meta']['selectable'][K]['column']['type'] extends Type | null\n ? K\n : never;\n}[keyof T['meta']['selectable']];\n\nexport type SelectableOrExpressionOfType<\n T extends PickQueryMeta,\n C extends PickType,\n> = SelectableOfType<T, C['type']> | Expression<QueryColumn<C['type'] | null>>;\n\nexport interface QueryWithTable extends Query {\n table: string;\n}\n\nexport const queryTypeWithLimitOne = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n} as { [K in 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 ? true : T extends 'all' ? true : false;\n\nexport type GetQueryResult<\n T extends PickQueryReturnType,\n Result extends QueryColumns,\n> = QueryReturnsAll<T['returnType']> extends true\n ? ColumnShapeOutput<Result>[]\n : T['returnType'] extends 'one'\n ? ColumnShapeOutput<Result> | undefined\n : T['returnType'] extends 'oneOrThrow'\n ? ColumnShapeOutput<Result>\n : T['returnType'] extends 'value'\n ? Result['value']['outputType'] | undefined\n : T['returnType'] extends 'valueOrThrow'\n ? Result['value']['outputType']\n : T['returnType'] extends 'rows'\n ? ColumnShapeOutput<Result>[keyof Result][][]\n : T['returnType'] extends 'pluck'\n ? Result['pluck']['outputType'][]\n : T['returnType'] extends 'rowCount'\n ? number\n : void;\n\nexport type AddQuerySelect<\n T extends PickQueryMetaResultReturnType,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? {\n [K in\n | (T['meta']['hasSelect'] extends true ? keyof T['result'] : never)\n | keyof Result]: K extends keyof Result\n ? Result[K]\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Result>>\n : T[K];\n} & QueryMetaHasSelect;\n\n// Merge { hasSelect: true } into 'meta' if it's not true yet.\nexport interface QueryMetaHasSelect {\n meta: {\n hasSelect: true;\n };\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 PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsAllKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsAllKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'all'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsOneOptional<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']> | undefined>\n : T[K];\n};\n\nexport type SetQueryReturnsOne<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<Result>>\n : T[K];\n};\n\nexport type SetQueryReturnsRows<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'rows'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[keyof T['result']][][]>\n : T[K];\n};\n\nexport type SetQueryReturnsPluck<\n T extends PickQueryMeta,\n S extends keyof T['meta']['selectable'] | Expression,\n> = SetQueryReturnsPluckColumn<\n T,\n S extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][S]['column']\n : S extends Expression\n ? S['result']['value']\n : never\n>;\n\nexport type SetQueryReturnsPluckColumn<T, C extends QueryColumn> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: C }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<C['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsPluckColumnKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsPluckColumnKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsValueOrThrow<\n T extends PickQueryMeta,\n Arg extends keyof T['meta']['selectable'],\n> = SetQueryReturnsColumnOrThrow<T, T['meta']['selectable'][Arg]['column']> &\n T['meta']['selectable'][Arg]['column']['operators'];\n\nexport type SetQueryReturnsValueOptional<\n T extends PickQueryMeta,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsColumnOptional<\n T,\n {\n [K in keyof T['meta']['selectable'][Arg]['column']]: K extends 'outputType'\n ? T['meta']['selectable'][Arg]['column'][K] | undefined\n : T['meta']['selectable'][Arg]['column'][K];\n }\n> &\n Omit<T['meta']['selectable'][Arg]['column']['operators'], 'equals' | 'not'> &\n OperatorsNullable<T['meta']['selectable'][Arg]['column']>;\n\nexport type SetQueryReturnsColumnOrThrow<T, Column extends PickOutputType> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnOptional<T, Column extends PickOutputType> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<Column['outputType'] | undefined>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['pluck']['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Result['pluck']['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsRowCount<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'rowCount'\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsVoid<T> = {\n [K in keyof T]: K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\n\nexport type SetQueryReturnsVoidKind<\n T extends PickQueryMeta,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\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 PickQueryMeta, 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 SetQueryKindResult<\n T extends PickQueryMetaReturnType,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Result>>\n : T[K];\n};\n\nexport type SetQueryTableAlias<\n T extends PickQueryMetaTableShape,\n As extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta'] | 'as']: K extends 'as'\n ? As\n : K extends 'selectable'\n ? Omit<\n T['meta']['selectable'],\n `${AliasOrTable<T>}.${keyof T['shape'] & string}`\n > & {\n [K in keyof T['shape'] & string as `${As}.${K}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : T['meta'][K];\n }\n : T[K];\n};\n\nexport interface QueryOrExpression<T> {\n result: { value: QueryColumn<T> };\n}\n\nexport type QueryOrExpressionBooleanOrNullResult = QueryOrExpression<\n boolean | null\n>;\n","import { SelectableOrExpression } from '../common/utils';\nimport { PickQueryDataShapeAndJoinedShapes, QueryData } from './data';\nimport { ToSQLCtx } from './toSQL';\nimport {\n ColumnTypeBase,\n Expression,\n QueryColumn,\n QueryColumns,\n} 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?: QueryColumn,\n quotedAs?: string,\n): string {\n if (!column) return `\"${key}\"`;\n\n const { data } = column as ColumnTypeBase;\n return data.computed\n ? data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || 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: QueryColumn,\n quotedAs?: string,\n): string {\n const { data } = column as ColumnTypeBase;\n return data.computed\n ? data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || key}\"`;\n}\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: QueryData['joinedShapes'];\n joinOverrides?: QueryData['joinOverrides'];\n },\n shape: QueryColumns,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n return columnWithDotToSql(\n ctx,\n data,\n shape,\n column,\n index,\n quotedAs,\n select,\n );\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n return simpleColumnToSQL(ctx, column, shape[column], quotedAs);\n};\n\n/**\n * in a case when ordering or grouping by a column which was selected as expression:\n * ```ts\n * table.select({ x: (q) => q.sum('x') }).group('x').order('x')\n * ```\n * the column must not be prefixed with a table name.\n */\nexport const maybeSelectedColumnToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n return columnWithDotToSql(ctx, data, data.shape, column, index, quotedAs);\n } else {\n if (data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n if (data.select) {\n for (const s of data.select) {\n if (typeof s === 'object' && 'selectAs' in s) {\n if (column in s.selectAs) {\n return simpleColumnToSQL(ctx, column, data.shape[column]);\n }\n }\n }\n }\n\n return simpleColumnToSQL(ctx, column, data.shape[column], quotedAs);\n }\n};\n\nconst columnWithDotToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: QueryData['joinedShapes'];\n joinOverrides?: QueryData['joinOverrides'];\n },\n shape: QueryColumns,\n column: string,\n index: number,\n quotedAs?: string,\n select?: true,\n) => {\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 ) as ColumnTypeBase | undefined;\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\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}.` : ''}\"${col.data.name}\" \"${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 ? ` \"${column}\"` : ''\n }`;\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: PickQueryDataShapeAndJoinedShapes,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n shape: QueryColumns = data.shape,\n select?: true,\n) => {\n return typeof expr === 'string'\n ? columnToSql(ctx, data, shape, expr, quotedAs, select)\n : (expr as Expression).toSQL(ctx, quotedAs);\n};\n\nexport const quoteSchemaAndTable = (\n schema: string | undefined,\n table: string,\n) => {\n return schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n};\n","import { rawOrColumnToSql } from './common';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { SelectQueryData } from './data';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 { Query } from './query/query';\nimport { PickQueryShape } 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 PickQueryShape = PickQueryShape,\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 { QueryData } from '../sql';\nimport {\n emptyObject,\n pushOrNewArrayToObject,\n RecordUnknown,\n} from 'orchid-core';\nimport { OrchidOrmInternalError } from '../errors';\nimport { PickQueryQ, PickQueryQAndBaseQuery, 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 never as RecordUnknown)[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 PickQueryQ>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObject(\n q.q as unknown as { [K: 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 { [K: string]: RecordUnknown })[object] = {\n [key]: value,\n };\n else (q.q as unknown as { [K: string]: RecordUnknown })[object][key] = 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: PickQueryQ, method: string): void => {\n if (!q.q.or && !q.q.and && !q.q.scopes && !q.q.all) {\n throw new OrchidOrmInternalError(\n q as Query,\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 PickQueryQAndBaseQuery,\n Methods extends RecordUnknown,\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\nexport const getPrimaryKeys = (q: Query) => {\n return (q.internal.primaryKeys ??= collectPrimaryKeys(q));\n};\n\nconst collectPrimaryKeys = (q: Query): string[] => {\n const primaryKeys = [];\n const { shape } = q.q;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n primaryKeys.push(key);\n }\n }\n\n if (q.internal.primaryKeys) {\n primaryKeys.push(...q.internal.primaryKeys);\n }\n\n return primaryKeys;\n};\n","import { Query } from '../query/query';\nimport {\n JoinItemArgs,\n WhereInItem,\n WhereItem,\n WhereJsonPathEqualsItem,\n WhereOnItem,\n WhereOnJoinItem,\n WhereSearchItem,\n} from './types';\nimport {\n columnToSql,\n simpleColumnToSQL,\n simpleExistingColumnToSQL,\n} from './common';\nimport { getQueryAs, joinSubQuery } from '../common/utils';\nimport { processJoinItem } from './join';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n CommonQueryData,\n JoinedShapes,\n PickQueryDataShapeAndJoinedShapes,\n QueryScopeData,\n} from './data';\nimport {\n addValue,\n ColumnTypeBase,\n Expression,\n isExpression,\n MaybeArray,\n OperatorToSQL,\n RecordUnknown,\n toArray,\n} from 'orchid-core';\nimport { getSqlText } from './utils';\nimport { selectToSql } from './select';\n\ninterface QueryDataForWhere {\n and?: CommonQueryData['and'];\n or?: CommonQueryData['or'];\n shape: CommonQueryData['shape'];\n joinedShapes?: CommonQueryData['joinedShapes'];\n scopes?: { [K: string]: QueryScopeData };\n}\n\ninterface QueryDataWithLanguage extends QueryDataForWhere {\n language?: CommonQueryData['language'];\n}\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs);\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: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, parens);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n if (query.scopes) {\n let sql = andOrToSql(ctx, table, query, quotedAs, true);\n\n const data = Object.create(query);\n for (const key in query.scopes) {\n const scope = query.scopes[key];\n data.and = scope.and;\n data.or = scope.or;\n const scopeSql = andOrToSql(ctx, table, data, quotedAs, true);\n if (scopeSql) sql = sql ? sql + ' AND ' + scopeSql : scopeSql;\n }\n\n return sql;\n }\n\n return andOrToSql(ctx, table, query, quotedAs, parens);\n};\n\nconst andOrToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n let sql;\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n sql = ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs))\n .join(' OR ');\n } else if (query.and) {\n sql = processAnds(query.and, ctx, table, query, quotedAs);\n } else {\n return;\n }\n\n return parens ? `(${sql})` : sql;\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs);\n }\n const sql = ands.join(' AND ');\n return parens && ands.length > 1 ? `(${sql})` : sql;\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataWithLanguage,\n data: WhereItem,\n quotedAs?: string,\n) => {\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n if (query.q.expr) {\n if (query.q.subQuery === 1) {\n ands.push(selectToSql(ctx, table, query.q, quotedAs));\n } else {\n const q = joinSubQuery(table, query);\n q.q.select = [query.q.expr];\n ands.push(`(${getSqlText(makeSQL(q as Query, ctx))})`);\n }\n } else {\n pushWhereToSql(\n ands,\n ctx,\n query,\n query.q,\n query.table && `\"${query.table}\"`,\n true,\n );\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as RecordUnknown)[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));\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))\n .join(' OR ')})`,\n );\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(`NOT ${processAnds(arr, ctx, table, query, quotedAs, true)}`);\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 `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(`${leftColumn} ${op} ${rightColumn}`);\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as JoinItemArgs[];\n\n const joinSet = joinItems.length > 1 ? new Set<string>() : null;\n\n for (const args of joinItems) {\n const { target, on } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n const sql = `EXISTS (SELECT 1 FROM ${target}${\n on ? ` WHERE ${on}` : ''\n })`;\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ands.push(sql);\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (typeof value === 'object' && value && !(value instanceof Date)) {\n if (isExpression(value)) {\n ands.push(\n `${columnToSql(\n ctx,\n query,\n query.shape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column: ColumnTypeBase | undefined = 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 column = query.joinedShapes?.[key]?.value;\n quotedColumn = `\"${key}\".r`;\n }\n\n if (!column || !quotedColumn) {\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n }\n\n if (value instanceof ctx.queryBuilder.constructor) {\n ands.push(\n `${quotedColumn} = (${getSqlText((value as Query).toSQL(ctx))})`,\n );\n } else {\n for (const op in value) {\n const operator = (column.operators as RecordUnknown)[op];\n if (!operator) {\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 `${(\n operator as unknown as { _op: OperatorToSQL<any, ToSQLCtx> }\n )._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n } else {\n const column = columnToSql(ctx, query, query.shape, key, quotedAs);\n if (typeof value === 'function') {\n const expr = value(table);\n ands.push(`${column} = ${expr.toSQL(ctx, quotedAs)}`);\n } else {\n ands.push(\n `${column} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\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: PickQueryDataShapeAndJoinedShapes,\n ands: 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 value = `(${getSqlText(makeSQL(arg.values, ctx))})`;\n }\n\n const columnsSql = arg.columns\n .map((column) => columnToSql(ctx, query, query.shape, column, quotedAs))\n .join(', ');\n\n ands.push(`${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`);\n};\n","import { quoteSchemaAndTable, rawOrColumnToSql, columnToSql } from './common';\nimport { JoinItem, JoinItemArgs, SimpleJoinItemNonSubQueryArgs } from './types';\nimport { PickQueryQAndBaseQuery, Query, QueryWithTable } from '../query/query';\nimport { whereToSql } from './where';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n JoinedShapes,\n PickQueryDataShapeAndJoinedShapes,\n QueryData,\n} from './data';\nimport {\n Expression,\n isExpression,\n QueryColumns,\n RecordBoolean,\n RecordUnknown,\n} from 'orchid-core';\nimport { RawSQL } from './rawSql';\nimport { getSqlText } from './utils';\n\ntype ItemOf2Or3Length =\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\ninterface SqlJoinItem {\n target: string;\n on?: string;\n}\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: PickQueryDataShapeAndJoinedShapes,\n args: JoinItemArgs,\n quotedAs: string | undefined,\n): SqlJoinItem => {\n let target: string;\n let on: string | undefined;\n\n if ('j' in args) {\n const { j, s, r } = args;\n\n const tableName = (\n typeof j.q.from === 'string' ? j.q.from : j.table\n ) as string;\n\n const quotedTable = quoteSchemaAndTable(j.q.schema, tableName);\n target = quotedTable;\n\n const as = j.q.as as string;\n const joinAs = `\"${as}\"`;\n if (as !== tableName) {\n target += ` AS ${joinAs}`;\n }\n\n if (r && s) {\n target = `LATERAL ${subJoinToSql(ctx, j, quotedTable, joinAs, true)}`;\n } else {\n on = whereToSql(ctx, j, j.q, joinAs);\n }\n } else if ('w' in args) {\n const { w } = args;\n target = `\"${w}\"`;\n\n if ('r' in args) {\n const { s, r } = args;\n if (s) {\n target = `LATERAL ${subJoinToSql(ctx, r, target, target)}`;\n } else {\n on = whereToSql(ctx, r as Query, r.q, target);\n }\n } else {\n on = processArgs(\n args.a,\n ctx,\n query,\n target,\n (query.joinedShapes as JoinedShapes)[w],\n quotedAs,\n );\n }\n } else {\n const { q, s } = args;\n let joinAs;\n\n if ('r' in args) {\n const { r } = args;\n\n const res = getArgQueryTarget(ctx, q, s, s);\n target = s ? `LATERAL ${res.target}` : res.target;\n joinAs = res.joinAs;\n\n if (!s) {\n on = whereToSql(ctx, r, r.q, joinAs);\n }\n } else {\n const res = getArgQueryTarget(ctx, q, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if ('a' in args) {\n on = processArgs(args.a, ctx, query, joinAs, q.shape, quotedAs);\n }\n }\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!s) {\n const whereSql = whereToSql(\n ctx,\n q,\n {\n ...q.q,\n joinedShapes: {\n ...query.joinedShapes,\n ...q.q.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.shape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (on) on += ` AND ${whereSql}`;\n else on = whereSql;\n }\n }\n }\n\n return { target, on };\n};\n\nconst getArgQueryTarget = (\n ctx: ToSQLCtx,\n first: QueryWithTable,\n joinSubQuery: boolean,\n cloned?: boolean,\n) => {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const addAs = qAs && qAs !== joinAs;\n\n if (joinSubQuery) {\n return {\n target: subJoinToSql(ctx, first, joinAs, qAs, cloned),\n joinAs: addAs ? qAs : joinAs,\n };\n } else {\n let target =\n quotedFrom || quoteSchemaAndTable(joinQuery.schema, first.table);\n if (addAs) {\n joinAs = qAs;\n target += ` AS ${qAs}`;\n }\n return { target, joinAs };\n }\n};\n\nconst subJoinToSql = (\n ctx: ToSQLCtx,\n jq: Query,\n innerAs: string,\n outerAs?: string,\n cloned?: boolean,\n) => {\n if (!jq.q.select && jq.internal.columnsForSelectAll) {\n if (!cloned) jq = jq.clone();\n jq.q.select = [new RawSQL(`${innerAs}.*`)];\n }\n\n return `(${getSqlText(\n jq.toSQL({\n values: ctx.values,\n }),\n )}) ${outerAs || innerAs}`;\n};\n\nconst processArgs = (\n args: SimpleJoinItemNonSubQueryArgs,\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n joinAs: string,\n joinShape: QueryColumns,\n quotedAs?: string,\n): string => {\n return args.length === 1\n ? getObjectOrRawConditions(ctx, query, args[0], quotedAs, joinAs, joinShape)\n : getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf2Or3Length,\n joinShape,\n );\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n target: string,\n quotedAs: string | undefined,\n args: ItemOf2Or3Length,\n joinShape: QueryColumns,\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: PickQueryDataShapeAndJoinedShapes,\n data: { [K: string]: string | Expression } | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: QueryColumns,\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: ToSQLQuery,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\n\n for (const item of query.join) {\n let sql;\n if (Array.isArray(item)) {\n const q = item[1];\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n\n const as = item[2];\n sql = `${item[0]} LATERAL (${getSqlText(q.toSQL(ctx))}) \"${\n query.joinOverrides?.[as] || as\n }\" ON true`;\n\n ctx.aliasValue = aliasValue;\n } else {\n const { target, on = 'true' } = processJoinItem(\n ctx,\n table,\n query,\n item.args,\n quotedAs,\n );\n\n sql = `${item.type} ${target} ON ${on}`;\n }\n\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ctx.sql.push(sql);\n }\n};\n\nconst skipQueryKeysForSubQuery: RecordBoolean = {\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: PickQueryQAndBaseQuery) => {\n const {\n q,\n baseQuery: { q: baseQ },\n } = query;\n for (const key in q) {\n if (\n !skipQueryKeysForSubQuery[key] &&\n (q as never as RecordUnknown)[key] !==\n (baseQ as never as RecordUnknown)[key]\n ) {\n return true;\n }\n }\n return false;\n};\n","import { Query, QueryWithTable } from '../../query/query';\nimport { JoinArgs, JoinFirstArg, JoinQueryBuilder } from './join';\nimport {\n JoinedShapes,\n QueryDataJoinTo,\n SelectQueryData,\n JoinItemArgs,\n SimpleJoinItemNonSubQueryArgs,\n} from '../../sql';\nimport { RelationJoinQuery } from '../../relations';\nimport { pushQueryArray } from '../../query/queryUtils';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { QueryBase } from '../../query/queryBase';\nimport { returnArg } from 'orchid-core';\n\n/**\n * Processes arguments of join {@link JoinArgs} into {@link JoinItemArgs} type for building sql.\n * Resolves join callback.\n * Detects if the join should be an implicit lateral join.\n *\n * @param joinTo - main query\n * @param first - first join argument\n * @param args - rest join arguments\n * @param joinSubQuery - callee should find out whether first argument should result in a sub-queried join\n */\nexport const processJoinArgs = (\n joinTo: Query,\n first: JoinFirstArg<never>,\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n joinSubQuery: boolean,\n): JoinItemArgs => {\n if (typeof first === 'string') {\n if (first in joinTo.relations) {\n const { query: toQuery, joinQuery } =\n joinTo.relations[first].relationConfig;\n\n const j = joinQuery(toQuery, joinTo);\n if (typeof args[0] === 'function') {\n const r = args[0](\n makeJoinQueryBuilder(j, j.q.joinedShapes, joinTo),\n ) as Query;\n return { j: j.merge(r), s: joinSubQuery || getIsJoinSubQuery(r), r };\n }\n\n return { j, s: joinSubQuery };\n } else if (typeof args[0] !== 'function') {\n return { w: first, a: args as SimpleJoinItemNonSubQueryArgs };\n } else {\n const joinToQ = joinTo.q;\n const shape = joinToQ.withShapes?.[first];\n if (!shape) {\n throw new Error('Cannot get shape of `with` statement');\n }\n\n const j = joinTo.queryBuilder.baseQuery.clone();\n j.table = first;\n j.q = {\n shape,\n adapter: joinToQ.adapter,\n handleResult: joinToQ.handleResult,\n returnType: 'all',\n logger: joinToQ.logger,\n } as SelectQueryData;\n j.baseQuery = j as Query;\n\n const joinedShapes = {\n ...joinToQ.joinedShapes,\n [(joinToQ.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = args[0](\n makeJoinQueryBuilder(\n j,\n j.q.joinedShapes\n ? {\n ...j.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n ),\n ) as Query;\n\n return { w: first, r, s: joinSubQuery || getIsJoinSubQuery(r) };\n }\n }\n\n const args0 = args.length ? args[0] : returnArg;\n if (typeof args0 === 'function') {\n const q = first as QueryWithTable & {\n joinQueryAfterCallback?: RelationJoinQuery;\n };\n\n if (q.joinQueryAfterCallback) {\n let base = q.baseQuery;\n if (q.q.as) {\n base = base.as(q.q.as);\n }\n\n const { q: query } = q.joinQueryAfterCallback(base, joinTo);\n if (query.and) {\n pushQueryArray(q, 'and', query.and);\n }\n if (query.or) {\n pushQueryArray(q, 'or', query.or);\n }\n if (query.scopes) {\n q.q.scopes = { ...q.q.scopes, ...query.scopes };\n }\n }\n\n const joinedShapes = {\n ...joinTo.q.joinedShapes,\n [(joinTo.q.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = args0(\n makeJoinQueryBuilder(\n q,\n q.q.joinedShapes\n ? {\n ...q.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n ),\n ) as Query;\n\n joinSubQuery ||= getIsJoinSubQuery(r);\n return { q: joinSubQuery ? q.merge(r) : q, r, s: joinSubQuery };\n }\n\n return {\n q: first as QueryWithTable,\n a: args as SimpleJoinItemNonSubQueryArgs,\n s: joinSubQuery,\n };\n};\n\n/**\n * Creates {@link JoinQueryBuilder} argument for join callback.\n *\n * @param joinedQuery - the query that is joining\n * @param joinedShapes\n * @param joinTo\n */\nconst makeJoinQueryBuilder = (\n joinedQuery: QueryBase,\n joinedShapes: JoinedShapes | undefined,\n joinTo: QueryDataJoinTo,\n): JoinQueryBuilder<Query, Query> => {\n const q = joinedQuery.baseQuery.clone();\n q.baseQuery = q as unknown as Query;\n q.q.as = joinedQuery.q.as;\n q.q.joinedShapes = joinedShapes;\n q.q.joinTo = joinTo;\n return q as never;\n};\n","import { Query } from '../query/query';\nimport { noop } from 'orchid-core';\nimport { NotFoundError } from '../errors';\nimport { extendQuery, pushQueryValue } from '../query/queryUtils';\nimport { RawSQL } from '../sql/rawSql';\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\nexport const _queryNone = <T>(q: T): T => {\n if (isQueryNone(q)) return q;\n\n q = extendQuery(q as Query, noneMethods) as T;\n pushQueryValue(q as Query, 'and', new RawSQL('false'));\n return q;\n};\n\nexport const isQueryNone = (q: unknown) =>\n (q as Query).then === noneMethods.then;\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryQ,\n Query,\n} from '../../query/query';\nimport {\n ColumnsParsers,\n ColumnsShapeBase,\n ColumnTypeBase,\n PickQueryTableMetaResult,\n QueryColumns,\n QueryMetaBase,\n} 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 JoinFirstArg,\n JoinLateralCallback,\n JoinLateralResult,\n JoinResult,\n} from './join';\nimport { getQueryAs, resolveSubQueryCallback } from '../../common/utils';\nimport { processJoinArgs } from './processJoinArgs';\nimport { _queryNone, isQueryNone } from '../none';\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 first - the first argument of join: join target\n * @param args - rest join arguments: columns to join with, or a callback\n */\nexport const _join = <\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n R extends PickQueryTableMetaResult,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n>(\n query: T,\n require: RequireJoined,\n type: string,\n first: JoinFirstArg<never>,\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n): JoinResult<T, R, RequireJoined, RequireMain> => {\n let joinKey: string | undefined;\n let shape: QueryColumns | undefined;\n let parsers: ColumnsParsers | undefined;\n let joinSubQuery = false;\n\n if (typeof first === 'function') {\n first = (\n first as unknown as (q: { [K: string]: Query }) => JoinFirstArg<Query>\n )(query.relations);\n (\n first as unknown as { joinQueryAfterCallback: unknown }\n ).joinQueryAfterCallback = (\n first as unknown as { joinQuery: unknown }\n ).joinQuery;\n }\n\n if (typeof first === 'object') {\n if (require && isQueryNone(first)) {\n return _queryNone(query) as JoinResult<T, R, RequireJoined, RequireMain>;\n }\n\n const q = first as Query;\n joinSubQuery = getIsJoinSubQuery(q);\n\n joinKey = q.q.as || q.table;\n if (joinKey) {\n shape = getShapeFromSelect(q, joinSubQuery);\n parsers = q.q.parsers;\n\n if (joinSubQuery) {\n first = q.clone() as JoinFirstArg<Query>;\n (first as Query).shape = shape as ColumnsShapeBase;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = query.relations[joinKey];\n if (relation) {\n shape = getShapeFromSelect(relation.relationConfig.query);\n parsers = relation.relationConfig.query.q.parsers;\n } else {\n shape = (query as unknown as PickQueryQ).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] as ColumnTypeBase).parseFn;\n if (parser) {\n parsers[key] = parser;\n }\n }\n }\n }\n }\n\n if (joinKey) {\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedShapes',\n joinKey,\n shape,\n );\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedParsers',\n joinKey,\n parsers,\n );\n }\n\n const joinArgs = processJoinArgs(\n query as unknown as Query,\n first,\n args,\n joinSubQuery,\n );\n\n if (joinKey && 's' in joinArgs && joinArgs.s) {\n const j =\n 'j' in joinArgs\n ? joinArgs.r ?? joinArgs.j\n : 'r' in joinArgs\n ? joinArgs.r\n : joinArgs.q;\n\n if (j.q.select || !j.internal.columnsForSelectAll) {\n const shape = getShapeFromSelect(j, true);\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedShapes',\n joinKey,\n shape,\n );\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedParsers',\n joinKey,\n j.q.parsers,\n );\n }\n } else if (require && 'r' in joinArgs && isQueryNone(joinArgs.r)) {\n return _queryNone(query) as JoinResult<T, R, RequireJoined, RequireMain>;\n }\n\n return pushQueryValue(query as unknown as PickQueryQ, 'join', {\n type,\n args: joinArgs,\n }) as never;\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 self - 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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n RequireJoined extends boolean,\n>(\n self: T,\n type: string,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n as?: string,\n): JoinLateralResult<T, Table, Meta, Result, RequireJoined> => {\n const q = self as unknown as Query;\n\n let relation: RelationQueryBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = relation.relationConfig.query.clone() as unknown as Arg;\n } else {\n const shape = q.q.withShapes?.[arg];\n if (shape) {\n const t = Object.create((q as unknown as Query).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 = resolveSubQueryCallback(query, cb as never) as unknown as Query;\n\n if (relation) {\n result = relation.relationConfig.joinQuery(\n result as unknown as Query,\n q as unknown as Query,\n ) as unknown as Query;\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 never;\n};\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code, ColumnTypeSchemaArg } from 'orchid-core';\nimport { Operators, OperatorsAny } from './operators';\n\nexport class EnumColumn<\n Schema extends ColumnTypeSchemaArg,\n SchemaType extends Schema['type'],\n U extends string = string,\n T extends readonly [U, ...U[]] = [U],\n> extends ColumnType<Schema, T[number], SchemaType, OperatorsAny> {\n operators = Operators.any;\n dataType = 'enum';\n\n constructor(\n schema: Schema,\n public enumName: string,\n public options: T,\n schemaType: SchemaType,\n ) {\n super(schema, schemaType);\n this.inputSchema = this.outputSchema = this.querySchema = schemaType;\n }\n\n toCode(t: string, m?: boolean): Code {\n const options = m\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, t, `enum('${this.enumName}'${options})`, m);\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 {\n addCode,\n Code,\n ArrayMethodsData,\n arrayDataToCode,\n ColumnSchemaConfig,\n ColumnTypeSchemaArg,\n ColumnDataBase,\n Codes,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators, OperatorsArray } from './operators';\n\nexport interface ArrayColumnValue {\n type: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n inputType: unknown;\n outputType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n queryType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n toSQL(): string;\n toCode(t: string, m?: boolean): Code;\n parseItem?(input: string): unknown;\n data: ColumnDataBase;\n}\n\nexport interface ArrayData<Item extends ArrayColumnValue>\n extends ColumnData,\n ArrayMethodsData {\n item: Item;\n}\n\nexport class ArrayColumn<\n Schema extends ColumnTypeSchemaArg,\n Item extends ArrayColumnValue,\n InputType,\n OutputType,\n QueryType,\n> extends ColumnType<\n Schema,\n Item['type'][],\n InputType,\n OperatorsArray,\n Item['inputType'][],\n Item['outputType'][],\n OutputType,\n Item['queryType'][],\n QueryType\n> {\n dataType = 'array' as const;\n operators = Operators.array;\n declare data: ArrayData<Item>;\n\n constructor(\n schema: Schema,\n item: Item,\n inputType: InputType,\n outputType?: OutputType,\n queryType?: QueryType,\n ) {\n super(schema, inputType, outputType, queryType);\n this.data.item = item;\n this.data.name = item.data.name;\n }\n\n toSQL(): string {\n return `${this.data.item.toSQL()}[]`;\n }\n\n toCode(\n this: ArrayColumn<\n ColumnSchemaConfig,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n t: string,\n m?: boolean,\n ): Code {\n const code: Codes = ['array('];\n addCode(code, this.data.item.toCode(t));\n addCode(code, `)${arrayDataToCode(this.data, m)}`);\n return columnCode(this, t, code, m);\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: ArrayColumnValue,\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 = (\n item as unknown as { data: ArrayData<ArrayColumnValue> }\n ).data.item as ArrayColumnValue;\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\nconst pushEntry = (\n input: string,\n start: number,\n pos: number,\n entries: unknown[],\n item: ArrayColumnValue,\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 {\n ColumnSchemaConfig,\n ColumnTypeBase,\n EncodeColumn,\n MaybeArray,\n noop,\n ParseColumn,\n RecordUnknown,\n setColumnData,\n} from 'orchid-core';\nimport {\n DateBaseColumn,\n DateColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\nimport { EnumColumn } from './enum';\nimport { ArrayColumn, ArrayColumnValue } from './array';\nimport { JSONColumn } from './json';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport {\n CharColumn,\n CitextColumn,\n MoneyColumn,\n StringColumn,\n TextColumn,\n VarCharColumn,\n} from './string';\nimport { ColumnType } from './columnType';\n\nexport interface DefaultSchemaConfig extends ColumnSchemaConfig<ColumnType> {\n parse<T extends { type: unknown }, Output>(\n this: T,\n fn: (input: T['type']) => Output,\n ): ParseColumn<T, unknown, Output>;\n\n encode<T extends { type: unknown }, Input>(\n this: T,\n fn: (input: Input) => unknown,\n ): EncodeColumn<T, unknown, Input>;\n\n asType<\n T,\n Types extends {\n type: unknown;\n inputType: unknown;\n outputType: unknown;\n queryType: unknown;\n },\n >(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _fn: (\n type: <Type, Input = Type, Output = Type, Query = Type>() => {\n type: Type;\n inputType: Input;\n outputType: Output;\n queryType: Query;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n dateAsNumber(): ParseColumn<\n DateBaseColumn<DefaultSchemaConfig>,\n unknown,\n number\n >;\n\n dateAsDate(): ParseColumn<DateBaseColumn<DefaultSchemaConfig>, unknown, Date>;\n\n enum<U extends string, T extends readonly [U, ...U[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<DefaultSchemaConfig, unknown, U, T>;\n\n array<Item extends ArrayColumnValue>(\n item: Item,\n ): ArrayColumn<DefaultSchemaConfig, Item, unknown, unknown, unknown>;\n\n json<T>(): JSONColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T\n ? MaybeArray<string | number | boolean | RecordUnknown>\n : T,\n DefaultSchemaConfig\n >;\n\n inputSchema(): undefined;\n outputSchema(): undefined;\n querySchema(): undefined;\n updateSchema(): undefined;\n pkeySchema(): undefined;\n\n smallint(): SmallIntColumn<DefaultSchemaConfig>;\n integer(): IntegerColumn<DefaultSchemaConfig>;\n real(): RealColumn<DefaultSchemaConfig>;\n smallSerial(): SmallSerialColumn<DefaultSchemaConfig>;\n serial(): SerialColumn<DefaultSchemaConfig>;\n\n bigint(): BigIntColumn<DefaultSchemaConfig>;\n decimal(\n precision?: number,\n scale?: number,\n ): DecimalColumn<DefaultSchemaConfig>;\n doublePrecision(): DoublePrecisionColumn<DefaultSchemaConfig>;\n bigSerial(): BigSerialColumn<DefaultSchemaConfig>;\n money(): MoneyColumn<DefaultSchemaConfig>;\n varchar(limit?: number): VarCharColumn<DefaultSchemaConfig>;\n char(limit?: number): CharColumn<DefaultSchemaConfig>;\n text(min: number, max: number): TextColumn<DefaultSchemaConfig>;\n string(limit?: number): StringColumn<DefaultSchemaConfig>;\n citext(min: number, max: number): CitextColumn<DefaultSchemaConfig>;\n\n date(): DateColumn<DefaultSchemaConfig>;\n timestampNoTZ(precision?: number): TimestampColumn<DefaultSchemaConfig>;\n timestamp(precision?: number): TimestampTZColumn<DefaultSchemaConfig>;\n}\n\n// parse a date string to number, with respect to null\nconst parseDateToNumber = (value: unknown): number =>\n (value ? Date.parse(value as string) : value) as number;\n\n// parse a date string to date object, with respect to null\nconst parseDateToDate = (value: unknown): Date =>\n (value ? new Date(value as string) : value) as Date;\n\n(parseDateToNumber as unknown as { hideFromCode: boolean }).hideFromCode = (\n parseDateToDate as unknown as { hideFromCode: boolean }\n).hideFromCode = true;\n\nexport const defaultSchemaConfig = {\n parse(fn: unknown) {\n return Object.assign(Object.create(this), {\n parseFn: fn,\n parseItem: fn,\n });\n },\n encode(fn: unknown) {\n return Object.assign(Object.create(this), {\n encodeFn: fn,\n });\n },\n asType() {\n return this as never;\n },\n dateAsNumber(this: { parse(fn: unknown): unknown }) {\n return this.parse(parseDateToNumber);\n },\n dateAsDate(this: { parse(fn: unknown): unknown }) {\n return this.parse(parseDateToDate);\n },\n enum<T extends readonly [string, ...string[]]>(dataType: string, type: T) {\n return new EnumColumn(defaultSchemaConfig, dataType, type, undefined);\n },\n array<Item extends ArrayColumnValue>(item: Item) {\n return new ArrayColumn(defaultSchemaConfig, item, undefined);\n },\n boolean: noop,\n buffer: noop,\n unknown: noop,\n never: noop,\n stringSchema: noop,\n stringMin: noop,\n stringMax: noop,\n stringMinMax: noop,\n number: noop,\n int: noop,\n stringNumberDate: noop,\n timeInterval: noop,\n bit: noop,\n uuid: noop,\n nullable(this: ColumnTypeBase) {\n return setColumnData(this, 'isNullable', true);\n },\n json() {\n return new JSONColumn(defaultSchemaConfig, undefined);\n },\n setErrors: noop,\n\n smallint: () => new SmallIntColumn(defaultSchemaConfig),\n integer: () => new IntegerColumn(defaultSchemaConfig),\n real: () => new RealColumn(defaultSchemaConfig),\n smallSerial: () => new SmallSerialColumn(defaultSchemaConfig),\n serial: () => new SerialColumn(defaultSchemaConfig),\n\n bigint: () => new BigIntColumn(defaultSchemaConfig),\n decimal: (precision?: number, scale?: number) =>\n new DecimalColumn(defaultSchemaConfig, precision, scale),\n doublePrecision: () => new DoublePrecisionColumn(defaultSchemaConfig),\n bigSerial: () => new BigSerialColumn(defaultSchemaConfig),\n money: () => new MoneyColumn(defaultSchemaConfig),\n varchar: (limit?: number) => new VarCharColumn(defaultSchemaConfig, limit),\n char: (limit?: number) => new CharColumn(defaultSchemaConfig, limit),\n text: (min: number, max: number) =>\n new TextColumn(defaultSchemaConfig, min, max),\n string: (limit?: number) => new StringColumn(defaultSchemaConfig, limit),\n citext: (min: number, max: number) =>\n new CitextColumn(defaultSchemaConfig, min, max),\n\n date: () => new DateColumn(defaultSchemaConfig),\n timestampNoTZ: (precision?: number) =>\n new TimestampColumn(defaultSchemaConfig, precision),\n timestamp: (precision?: number) =>\n new TimestampTZColumn(defaultSchemaConfig, precision),\n} as unknown as DefaultSchemaConfig;\n","import { PickQueryQAndInternal } from '../query/query';\nimport {\n AfterCommitHook,\n emptyArray,\n emptyObject,\n SingleSqlItem,\n TransactionAdapterBase,\n TransactionState,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nexport const commitSql: SingleSqlItem = {\n text: 'COMMIT',\n};\n\nexport const rollbackSql: SingleSqlItem = {\n text: 'ROLLBACK',\n};\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport interface TransactionOptions {\n level: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\nexport class Transaction {\n transaction<T extends PickQueryQAndInternal, Result>(\n this: T,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<T extends PickQueryQAndInternal, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<T extends PickQueryQAndInternal, 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 SingleSqlItem;\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 } 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 applyTransforms,\n callWithThis,\n ColumnParser,\n ColumnsParsers,\n emptyArray,\n getValueKey,\n QueryReturnType,\n RecordString,\n RecordUnknown,\n SingleSqlItem,\n Sql,\n TransactionState,\n} from 'orchid-core';\nimport { commitSql } from './transaction';\n\nexport const queryMethodByReturnType: {\n [K in QueryReturnType]: '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 // 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: (\n this: Query,\n) => (this: Query, resolve?: Resolve, reject?: Reject) => Promise<unknown>;\n\n// workaround for the bun issue: https://github.com/romeerez/orchid-orm/issues/198\nif (process.versions.bun) {\n getThen = function () {\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 configurable: true,\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: RecordString = {};\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 beginSql: SingleSqlItem = { text: 'BEGIN' };\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 const { returnType = 'all' } = query;\n const returns = hookSelect ? 'all' : returnType;\n\n let result;\n let queryResult;\n\n if ('text' in sql) {\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 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 result = query.handleResult(q, returns, queryResult);\n } else {\n // autoPreparedStatements in batch doesn't seem to make sense\n\n const queryMethod = hookSelect\n ? 'query'\n : (queryMethodByReturnType[returnType] as 'query');\n\n if (!trx) {\n if (query.log) logData = query.log.beforeQuery(beginSql);\n await adapter.arrays(beginSql);\n if (query.log) query.log.afterQuery(beginSql, logData);\n }\n\n for (const item of sql.batch) {\n sql = item;\n\n if (query.log) {\n logData = query.log.beforeQuery(sql);\n }\n\n const result = (await adapter[queryMethod](sql)) as QueryResult;\n\n if (queryResult) {\n queryResult.rowCount += result.rowCount;\n queryResult.rows.push(...result.rows);\n } else {\n queryResult = result;\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\n if (!trx) {\n if (query.log) logData = query.log.beforeQuery(commitSql);\n await adapter.arrays(commitSql);\n if (query.log) query.log.afterQuery(commitSql, logData);\n }\n\n if (query.patchResult) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await query.patchResult(q, queryResult!);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result = query.handleResult(q, returns, queryResult!);\n }\n\n if (afterHooks || afterCommitHooks || query.after) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result = filterResult(q, returnType, queryResult!, hookSelect, result);\n }\n\n if (query.transform) {\n result = applyTransforms(returnType, query.transform, result);\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 as SingleSqlItem, 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: RecordUnknown = {};\n for (const key of pick) {\n filtered[key] = (full as RecordUnknown)[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 RecordUnknown)[key] = (row as RecordUnknown)[key];\n }\n }\n return result;\n }\n }\n\n if (returnType === 'value') {\n return (result as RecordUnknown[])[0]?.[queryResult.fields[0].name];\n }\n\n if (returnType === 'valueOrThrow') {\n const row = (result as RecordUnknown[])[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 RecordUnknown[]).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 RecordUnknown)[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 {\n GetQueryResult,\n PickQueryQ,\n Query,\n QueryMetaHasSelect,\n QueryReturnsAll,\n WithDataBase,\n} from '../query/query';\nimport {\n ColumnsShapeToNullableObject,\n ColumnsShapeToObject,\n ColumnsShapeToObjectArray,\n ColumnsShapeToPluck,\n} from '../columns';\nimport { JSONTextColumn } from '../columns/json';\nimport { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { SelectItem, SelectQueryData, ToSQLQuery } from '../sql';\nimport { QueryResult } from '../adapter';\nimport {\n applyTransforms,\n ColumnTypeBase,\n emptyArray,\n Expression,\n getValueKey,\n isExpression,\n MaybeArray,\n PickQueryMeta,\n QueryColumn,\n QueryColumns,\n QueryMetaBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n setColumnData,\n setParserToQuery,\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';\nimport { defaultSchemaConfig } from '../columns/defaultSchemaConfig';\nimport { RelationsBase } from '../relations';\nimport { parseRecord } from './then';\nimport { _queryNone, isQueryNone } from './none';\nimport { NotFoundError } from '../errors';\n\ninterface SelectSelf {\n shape: QueryColumns;\n relations: RelationsBase;\n result: QueryColumns;\n meta: QueryMetaBase;\n returnType: QueryReturnType;\n withData: WithDataBase;\n}\n\n// .select method argument.\nexport type SelectArg<T extends SelectSelf> =\n | '*'\n | keyof T['meta']['selectable'];\n\nexport type SelectArgs<T extends SelectSelf> = (\n | '*'\n | keyof T['meta']['selectable']\n)[];\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.\ninterface SelectAsArg<T extends SelectSelf> {\n [K: string]:\n | keyof T['meta']['selectable']\n | Expression\n | ((q: {\n [K in keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['relationConfig']['methodQuery']\n : T[K];\n }) => QueryBase | Expression);\n}\n\n// Result type of select without the ending object argument.\ntype SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = {\n [K in keyof T]: K extends 'result'\n ? ('*' extends Columns[number]\n ? {\n [K in\n | Columns[number]\n | keyof T['shape'] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }\n : {\n [K in Columns[number] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }) &\n (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]> // Omit is optimal\n : unknown)\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n ('*' extends Columns[number]\n ? {\n [K in\n | Columns[number]\n | keyof T['shape'] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }\n : {\n [K in Columns[number] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }) &\n (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n >\n : T[K];\n} & QueryMetaHasSelect;\n\ntype SelectResultObj<T extends SelectSelf, Obj> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & {\n hasSelect: true;\n selectable: SelectAsSelectable<Obj>;\n }\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in T['meta']['hasSelect'] extends true\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n {\n [K in T['meta']['hasSelect'] extends true\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n >\n >\n : T[K];\n};\n\n// Result type of select with the ending object argument.\ntype SelectResultColumnsAndObj<\n T extends SelectSelf,\n Columns extends PropertyKey[],\n Obj,\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & {\n hasSelect: true;\n selectable: SelectAsSelectable<Obj>;\n }\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj as K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['as']\n : K]: K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : never;\n } & (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj as K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['as']\n : K]: K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : never;\n } & (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n >\n : T[K];\n};\n\n// Add new 'selectable' types based on the select object argument.\ntype SelectAsSelectable<Arg> = {\n [K in keyof Arg]: Arg[K] extends (q: never) => {\n returnType: 'value' | 'valueOrThrow';\n result: QueryColumns;\n }\n ? {\n [P in K]: {\n as: K;\n column: ReturnType<Arg[K]>['result']['value'];\n };\n }\n : Arg[K] extends (q: never) => {\n result: QueryColumns;\n }\n ? {\n [C in keyof ReturnType<Arg[K]>['result'] & string as `${K &\n string}.${C}`]: {\n as: C;\n column: ReturnType<Arg[K]>['result'][C];\n };\n }\n : never;\n}[keyof Arg];\n\n// map a single value of select object arg into a column\ntype SelectAsValueResult<\n T extends SelectSelf,\n Arg,\n> = Arg extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][Arg]['column']\n : Arg extends Expression\n ? Arg['result']['value']\n : Arg extends (q: never) => QueryBase\n ? SelectSubQueryResult<ReturnType<Arg>>\n : Arg extends (q: never) => Expression\n ? ReturnType<Arg>['result']['value']\n : Arg extends (q: never) => QueryBase | Expression\n ?\n | SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>>\n | Exclude<ReturnType<Arg>, QueryBase>['result']['value']\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 SelectSelf> = QueryReturnsAll<\n Arg['returnType']\n> extends true\n ? ColumnsShapeToObjectArray<Arg['result']>\n : Arg['returnType'] extends 'value' | 'valueOrThrow'\n ? Arg['result']['value']\n : Arg['returnType'] extends 'pluck'\n ? ColumnsShapeToPluck<Arg['result']>\n : Arg['returnType'] extends 'one'\n ? ColumnsShapeToNullableObject<Arg['result']>\n : ColumnsShapeToObject<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: PickQueryQ,\n key: string | getValueKey,\n raw: Expression,\n) => {\n const type = raw.result.value as unknown as ColumnTypeBase;\n if (type?.parseFn) setParserToQuery(q.q, key, 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: PickQueryQ,\n arg: string,\n as: string | getValueKey = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (row) => parseRecord(parsers, row));\n }\n};\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends PickQueryMeta>(\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 as never, key, arg);\n } else {\n const { q: query } = arg;\n if (query.parsers || query.transform) {\n setParserToQuery((q as unknown as Query).q, key, (item) => {\n const t = query.returnType || 'all';\n\n subQueryResult.rows =\n t === 'value' || t === 'valueOrThrow'\n ? [[item]]\n : t === 'one' || t === 'oneOrThrow'\n ? [item]\n : (item as unknown[]);\n\n const result = query.handleResult(arg, t, subQueryResult, true);\n return query.transform\n ? applyTransforms(t, query.transform, result)\n : result;\n });\n }\n\n if (\n query.returnType === 'valueOrThrow' ||\n query.returnType === 'oneOrThrow'\n ) {\n pushQueryValue(\n q as unknown as PickQueryQ,\n 'transform',\n (data: MaybeArray<RecordUnknown>) => {\n if (Array.isArray(data)) {\n for (const item of data) {\n if (item[key as string] === undefined) {\n throw new NotFoundError(q as unknown as Query);\n }\n }\n } else {\n if (data[key as string] === undefined) {\n throw new NotFoundError(q as unknown as Query);\n }\n }\n return data;\n },\n );\n }\n }\n return arg;\n }\n\n return setParserForSelectedString(q as never, arg as string, as, key);\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 SelectSelf>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string | getValueKey,\n): SelectItem | undefined => {\n if (typeof arg === 'string') {\n return setParserForSelectedString(q as unknown as Query, arg, as, columnAs);\n }\n\n const selectAs: { [K: 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 as unknown as ToSQLQuery, value);\n\n if (isQueryNone(value)) {\n if (value.q.innerJoinLateral) {\n return;\n }\n } else if (!isExpression(value) && value.joinQuery) {\n value = value.joinQuery(value, q);\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 as unknown as Query).q.joinOverrides ??=\n {});\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?.subQuery && value.q.expr) {\n value = value.q.expr;\n }\n }\n\n selectAs[key] = addParserForSelectItem(\n q as unknown as Query,\n as,\n key,\n value,\n );\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: PickQueryQ,\n arg: string,\n as: string | getValueKey | undefined,\n columnAs?: string | getValueKey,\n): string => {\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 return table === as ? column : arg;\n } else {\n if (table === as) {\n const parser = q.q.parsers?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n return column;\n } else {\n const parser = q.q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n return arg;\n }\n }\n } else {\n const parser = q.q.parsers?.[arg];\n if (parser) setParserToQuery(q.q, columnAs || arg, parser);\n return arg;\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: QueryColumns;\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.result.value as unknown as ColumnTypeBase;\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(defaultSchemaConfig);\n }\n }\n }\n } else if (isExpression(item)) {\n result.value = item.result.value;\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: QueryColumns,\n query: SelectQueryData,\n result: QueryColumns,\n isSubQuery?: boolean,\n key?: string,\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: QueryColumn, isSubQuery?: boolean) => {\n // `?` is needed for case when wrong column is passed to subquery (see issue #236)\n return isSubQuery && (column as ColumnTypeBase)?.data.name\n ? setColumnData(column as ColumnTypeBase, 'name', undefined)\n : column;\n};\n\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n>(q: T, columns: Columns): SelectResult<T, Columns>;\nexport function _querySelect<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n q: T,\n obj: Obj,\n): SelectResultObj<T, Obj>;\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n>(\n q: T,\n args: [...columns: Columns, obj: Obj],\n): SelectResultColumnsAndObj<T, Columns, Obj>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _querySelect(q: Query, args: any[]): any {\n const len = args.length;\n if (!len) {\n return q;\n }\n\n const as = q.q.as || q.table;\n const selectArgs = new Array(len) as (SelectItem | undefined)[];\n for (let i = 0; i < len; i++) {\n selectArgs[i] = processSelectArg(q, as, args[i]);\n if (!selectArgs[i]) {\n return _queryNone(q);\n }\n }\n\n return pushQueryArray(q, 'select', selectArgs);\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, specify the returning type via <generic> syntax:\n * db.table.select({\n * raw: sql<number>`1 + 2`,\n * });\n *\n * // select raw SQL value, the resulting type can be set by providing a column type in such way:\n * db.table.select({\n * raw: sql`1 + 2`.type((t) => t.integer()),\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`1 + 2`.type((t) => t.integer()),\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 SelectSelf, Columns extends SelectArgs<T>>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n select<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n this: T,\n obj: Obj,\n ): SelectResultObj<T, Obj>;\n select<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultColumnsAndObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(this: SelectSelf, ...args: any[]): any {\n return _querySelect((this as Query).clone(), args);\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 SelectSelf>(this: T): SelectResult<T, ['*']> {\n const q = (this as unknown as Query).clone();\n q.q.select = ['*'];\n return q as never;\n }\n}\n","import { Expression, QueryColumn } from 'orchid-core';\nimport {\n QueryData,\n SelectAs,\n SelectItem,\n SelectQueryData,\n ToSQLCtx,\n ToSQLQuery,\n} from '../sql';\nimport { selectAllSql, selectedObjectToSQL } from '../sql/select';\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 QueryColumn = QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: QueryData;\n\n constructor(\n public query: ToSQLQuery,\n public item: string | Expression,\n value?: T,\n ) {\n super();\n this.result = { value: value as T };\n this.q = query.q;\n if (value) Object.assign(this, value.operators);\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.query, this.q as SelectQueryData, quotedAs)\n : ctx.aliasValue\n ? columnToSql(ctx, this.q, this.q.shape, this.item, quotedAs, true)\n : columnToSqlWithAs(ctx, this.q, this.item, quotedAs, true)\n : selectedObjectToSQL(ctx, quotedAs, this.item);\n }\n}\n","import {\n PickQueryMetaTable,\n Query,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsColumnOrThrow,\n SetQueryReturnsValueOptional,\n SetQueryReturnsValueOrThrow,\n} from '../query/query';\nimport {\n Expression,\n getValueKey,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport { SelectQueryData } from '../sql';\nimport {\n addParserForRawExpression,\n setParserForSelectedString,\n} from './select';\nimport { getQueryAs } from '../common/utils';\nimport { SelectItemExpression } from '../common/selectItemExpression';\nimport { Operators, setQueryOperators } from '../columns/operators';\n\nexport type QueryGetSelf = PickQueryMetaTable;\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryGetSelf> = GetStringArg<T> | Expression;\n\nexport type GetStringArg<T extends PickQueryMeta> =\n keyof T['meta']['selectable'] & string;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\nexport type GetResult<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOrThrow<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<T, Arg['result']['value']>\n : never;\n\nexport type GetResultOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOptional<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOptional<T, Arg['result']['value']>\n : never;\n\n// mutate the query to get a single value\nconst _get = <\n T extends QueryGetSelf,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n query: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n const q = (query as unknown as Query).q;\n q.returnType = returnType;\n\n let type: QueryColumn | undefined;\n if (typeof arg === 'string') {\n type = 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.as || (query as unknown as Query).table)) {\n type = q.shape[column];\n } else {\n type = q.joinedShapes?.[table]?.[column];\n }\n }\n }\n\n (q as SelectQueryData)[getValueKey] = type;\n\n setParserForSelectedString(\n query as unknown as Query,\n arg,\n getQueryAs(query as unknown as Query),\n getValueKey,\n );\n\n q.expr = new SelectItemExpression(query as unknown as Query, arg, type);\n } else {\n type = arg.result.value;\n (q as SelectQueryData)[getValueKey] = type;\n addParserForRawExpression(query as unknown as Query, getValueKey, arg);\n q.expr = arg;\n }\n\n q.select = [q.expr];\n\n return setQueryOperators(\n query as unknown as Query,\n type?.operators || Operators.any,\n ) as unknown as GetResult<T, Arg> & GetResultOptional<T, Arg>;\n};\n\nexport function _queryGet<T extends QueryGetSelf, Arg extends GetArg<T>>(\n self: T,\n arg: Arg,\n): GetResult<T, Arg> {\n return _get(self, 'valueOrThrow', arg);\n}\n\nexport function _queryGetOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n>(self: T, arg: Arg): GetResultOptional<T, Arg> {\n return _get(self, 'value', arg);\n}\n","import {\n PickQueryMetaTableShape,\n Query,\n SetQueryTableAlias,\n} from '../query/query';\n\nexport type AsQueryArg = PickQueryMetaTableShape;\n\nexport const _queryAs = <T extends AsQueryArg, As extends string>(\n self: T,\n as: As,\n): SetQueryTableAlias<T, As> => {\n (self as unknown as Query).q.as = as;\n return self as SetQueryTableAlias<T, As>;\n};\n\nexport abstract class AsMethods {\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 AsQueryArg, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return _queryAs((this as unknown as Query).clone(), as) as never;\n }\n}\n","import {\n Query,\n SelectableFromShape,\n SetQueryTableAlias,\n WithDataItems,\n PickQueryQ,\n PickQueryMetaTableShapeReturnTypeWithData,\n GetQueryResult,\n} from '../query/query';\nimport { RecordOfColumnsShapeBase, SelectQueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport {\n QueryThen,\n ColumnsShapeBase,\n PickQueryTableMetaResult,\n SQLQueryArgs,\n isExpression,\n Expression,\n MaybeArray,\n PickQueryTableMetaResultInputType,\n} from 'orchid-core';\nimport { getShapeFromSelect } from './select';\nimport { QueryBase } from '../query/queryBase';\nimport { sqlQueryArgsToExpression } from '../sql/rawSql';\n\nexport type FromQuerySelf = PickQueryMetaTableShapeReturnTypeWithData;\n\nexport type FromArg<T extends FromQuerySelf> =\n | PickQueryTableMetaResult\n | Expression\n | Exclude<keyof T['withData'], symbol | number>;\n\ntype UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (\n x: infer I,\n) => void\n ? I\n : never;\n\nexport type FromResult<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n> = Arg extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'as'\n ? string | undefined\n : K extends 'selectable'\n ? SelectableFromShape<T['withData'][Arg]['shape'], Arg>\n : K extends 'kind'\n ? 'select'\n : T['meta'][K];\n }\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, T['withData'][Arg]['shape']>>\n : T[K];\n }\n : SetQueryTableAlias<T, Arg>\n : Arg extends PickQueryTableMetaResultInputType\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'as'\n ? AliasOrTable<Arg>\n : K extends 'selectable'\n ? SelectableFromShape<Arg['result'], AliasOrTable<Arg>>\n : K extends 'kind'\n ? 'select'\n : T['meta'][K];\n }\n : K extends 'result'\n ? Arg['result']\n : K extends 'shape'\n ? Arg['result']\n : K extends 'inputType'\n ? Arg['inputType']\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Arg['result']>>\n : T[K];\n }\n : Arg extends (infer A)[]\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? UnionToIntersection<\n A extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T['withData'][A]['shape'] &\n string as `${A}.${K}`]: {\n as: K;\n column: T['withData'][A]['shape'][K];\n };\n }\n : never\n : A extends PickQueryTableMetaResult\n ? {\n [K in keyof A['result'] &\n string as `${AliasOrTable<A>}.${K}`]: K extends string\n ? {\n as: K;\n column: A['result'][K];\n }\n : never;\n }\n : never\n >\n : T['meta'][K];\n }\n : T[K];\n }\n : T;\n\nexport function queryFrom<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n>(self: T, arg: Arg): FromResult<T, Arg> {\n const data = (self as unknown as PickQueryQ).q;\n if (typeof arg === 'string') {\n data.as ||= arg;\n data.shape = data.withShapes?.[arg] as ColumnsShapeBase;\n } else if (isExpression(arg)) {\n data.as ||= 't';\n } else if (Array.isArray(arg)) {\n const { shape } = data;\n const parsers = (data.parsers ??= {});\n for (const item of arg) {\n if (typeof item === 'string') {\n const withShape = (data.withShapes as RecordOfColumnsShapeBase)[item];\n\n Object.assign(shape, withShape);\n\n for (const key in withShape) {\n if (withShape[key].parseFn) {\n parsers[key] = withShape[key].parseFn;\n }\n }\n } else if (!isExpression(item)) {\n Object.assign(shape, getShapeFromSelect(item as QueryBase, true));\n Object.assign(parsers, item.q.parsers);\n }\n }\n } else {\n const q = arg as Query;\n data.as ||= q.q.as || q.table || 't';\n data.shape = getShapeFromSelect(arg as QueryBase, true) as ColumnsShapeBase;\n data.parsers = q.q.parsers;\n }\n\n data.from = arg as Query;\n\n return self as never;\n}\n\nexport function queryFromSql<T extends FromQuerySelf>(\n self: T,\n args: SQLQueryArgs,\n): T {\n const data = (self as unknown as PickQueryQ).q;\n data.as ||= 't';\n data.from = sqlQueryArgsToExpression(args);\n return self;\n}\n\nexport class FromMethods {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * `from` determines a set of available tables and columns withing the query,\n * and thus it must not follow `select`, use `select` only after `from`.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(db.otherTable.select('foo', 'bar'));\n *\n * // accepts alias of `WITH` expression:\n * q.with('withTable', db.table.select('id', 'name'))\n * .from('withTable')\n * // `select` is after `from`\n * .select('id', 'name');\n * ```\n *\n * `from` can accept multiple sources:\n *\n * ```ts\n * db.table\n * // add a `WITH` statement called `withTable\n * .with('withTable', db.table.select('one'))\n * // select from `withTable` and from `otherTable`\n * .from('withTable', db.otherTable.select('two'))\n * // source names and column names are properly typed when selecting\n * .select('withTable.one', 'otherTable.two');\n * ```\n *\n * @param arg - query or name of CTE table\n */\n from<T extends FromQuerySelf, Arg extends MaybeArray<FromArg<T>>>(\n this: T,\n arg: T['meta']['hasSelect'] extends true\n ? '`select` must be placed after `from`'\n : Arg,\n ): FromResult<T, Arg> {\n return queryFrom((this as unknown as Query).clone(), arg as never) as never;\n }\n\n /**\n * Set the `FROM` value with custom SQL:\n *\n * ```ts\n * const value = 123;\n * db.table.fromSql`value = ${value}`;\n * ```\n *\n * @param args - SQL expression\n */\n fromSql<T extends FromQuerySelf>(this: T, ...args: SQLQueryArgs): T {\n return queryFromSql(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * Adds `ONLY` SQL keyword to the `FROM`.\n * When selecting from a parent table that has a table inheritance,\n * setting `only` will make it to select rows only from the parent table.\n *\n * ```ts\n * db.table.only();\n *\n * // disabling `only` after being enabled\n * db.table.only().only(false);\n * ```\n *\n * @param only - can be disabled by passing `false` if was enabled previously.\n */\n only<T>(this: T, only = true): T {\n const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).only = only;\n return q as T;\n }\n}\n","import { Query, SetQueryTableAlias } from '../query/query';\nimport { _queryAs } from './as';\nimport { queryFrom } from './from';\nimport { WrapQueryArg } from './queryMethods';\nimport { PickQueryTableMetaResult } from 'orchid-core';\n\nexport function queryWrap<\n T extends PickQueryTableMetaResult,\n Q extends WrapQueryArg,\n As extends string = 't',\n>(self: T, query: Q, as: As = 't' as As): SetQueryTableAlias<Q, As> {\n return _queryAs(queryFrom(query, self), as) as never;\n}\n\n/**\n * This function is useful when wrapping a query,\n * such as when doing `SELECT json_agg(t.*) FROM (...) AS t`,\n * to get rid of default scope conditions (WHERE deletedAt IS NULL)\n * that otherwise would be duplicated inside the `FROM` and after `AS t`.\n */\nexport function cloneQueryBaseUnscoped(query: Query) {\n const q = query.baseQuery.clone();\n q.q.or = q.q.and = q.q.scopes = undefined;\n return q;\n}\n","import { _queryGetOptional } from './get.utils';\nimport { RawSQL } from '../sql/rawSql';\nimport {\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { QueryColumn } from 'orchid-core';\nimport { cloneQueryBaseUnscoped, queryWrap } from './queryMethods.utils';\n\nexport function queryJson<T>(\n self: T,\n coalesce?: boolean,\n): SetQueryReturnsColumnOptional<T, QueryColumn<string>> {\n const q = queryWrap(\n self as Query,\n cloneQueryBaseUnscoped(self as Query),\n ) as unknown as Query;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n _queryGetOptional(\n q,\n new RawSQL(\n queryTypeWithLimitOne[(self as Query).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 never;\n}\n","import { SelectItem } from './types';\nimport { RawSQL } from './rawSql';\nimport { columnToSql, columnToSqlWithAs } from './common';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../errors';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { SelectableOrExpression } from '../common/utils';\nimport { addValue, Expression, isExpression } from 'orchid-core';\nimport { Query } from '../query/query';\nimport { _queryGetOptional } from '../queryMethods/get.utils';\nimport { queryJson } from '../queryMethods/json.utils';\nimport { queryWrap } from '../queryMethods/queryMethods.utils';\nimport { isQueryNone } from '../queryMethods/none';\nimport { IntegerBaseColumn } from '../columns';\nimport { getSqlText } from './utils';\n\nexport const pushSelectSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['join'] },\n quotedAs?: string,\n) => {\n ctx.sql.push(selectToSql(ctx, table, query, quotedAs));\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['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 {\n [K: string]: SelectableOrExpression | ToSQLQuery;\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}\"`);\n } else {\n pushSubQuerySql(ctx, value, 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}\"`,\n );\n }\n }\n } else {\n list.push(selectedObjectToSQL(ctx, 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: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['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 quotedAs: string | undefined,\n item: Expression,\n) {\n const sql = item.toSQL(ctx, quotedAs);\n return ctx.aliasValue ? `${sql} r` : sql;\n}\n\nexport const selectAllSql = (\n table: ToSQLQuery,\n query: { join?: 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: ToSQLQuery,\n as: string,\n list: string[],\n quotedAs?: string,\n) => {\n const { returnType = 'all' } = query.q;\n\n if (isQueryNone(query)) {\n let sql: string;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n case 'void':\n return;\n case 'value':\n case 'valueOrThrow':\n if (query.q.expr?.result.value instanceof IntegerBaseColumn) {\n sql = '0';\n } else {\n return;\n }\n break;\n case 'all':\n case 'pluck':\n case 'rows':\n sql = `'[]'::json`;\n break;\n case 'rowCount':\n sql = '0';\n break;\n default:\n throw new UnhandledTypeError(query as Query, returnType);\n }\n list.push(`${sql} \"${as}\"`);\n return;\n }\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 as 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 = queryJson(query) 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 as 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 = queryWrap(cloned, cloned.baseQuery.clone());\n _queryGetOptional(query, 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 as Query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${getSqlText(makeSQL(query, ctx))})`,\n quotedAs,\n )} \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\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 { maybeSelectedColumnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { addValue, 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 `${maybeSelectedColumnToSql(ctx, data, 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 { 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 { WithItem, WithOptions } from './types';\nimport { emptyObject, Expression } from 'orchid-core';\nimport { getSqlText } from './utils';\n\nexport const pushWithSql = (ctx: ToSQLCtx, items: WithItem[]) => {\n if (!items.length) return;\n\n ctx.sql.push(\n 'WITH',\n items\n .map((item) => {\n let inner: string;\n if (item.q) {\n inner = getSqlText(makeSQL(item.q, ctx));\n } else {\n inner = (item.s as Expression).toSQL(ctx, `\"${item.n}\"`);\n }\n\n const o = item.o ?? (emptyObject as WithOptions);\n return `${o.recursive ? 'RECURSIVE ' : ''}\"${item.n}\"${\n o.columns ? `(${o.columns.map((x) => `\"${x}\"`).join(', ')})` : ''\n } AS ${\n o.materialized\n ? 'MATERIALIZED '\n : o.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`;\n })\n .join(', '),\n );\n};\n","import { Query, QueryWithTable } from '../query/query';\nimport { RelationQuery } from '../relations';\nimport { SelectableOrExpression } from '../common/utils';\nimport { SelectQueryData } from './data';\nimport {\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n SelectableBase,\n RecordUnknown,\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 q.q.scopes\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 'only',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n\nexport type WithItem = {\n // name\n n: string;\n // options\n o?: WithOptions;\n // query\n q?: Query;\n // sql\n s?: Expression;\n};\n\nexport interface WithOptions {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport type SelectItem = string | SelectAs | Expression;\n\nexport interface SelectAs {\n selectAs: SelectAsValue;\n}\n\ninterface SelectAsValue {\n [K: string]: string | Query | Expression;\n}\n\nexport type OrderTsQueryConfig = true | OrderTsQueryConfigObject;\n\ninterface OrderTsQueryConfigObject {\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> | SearchWeightRecord;\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 SimpleJoinItemNonSubQueryArgs =\n | [{ [K: string]: string | Expression } | Expression | true]\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n\nexport type JoinItemArgs =\n | {\n // relation query from `relationConfig.joinQuery`\n j: Query;\n // join sub query\n s: boolean;\n // callback result, if callback is present\n r?: Query;\n }\n | {\n // `with` item name\n w: string;\n // callback result\n r: Query;\n // join sub query\n s: boolean;\n }\n | {\n // `with` item name\n w: string;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n }\n | {\n // joining query\n q: QueryWithTable;\n // join sub query\n s: boolean;\n }\n | {\n // joining query\n q: QueryWithTable;\n // callback result\n r: Query;\n // join sub query\n s: boolean;\n }\n | {\n // joining query\n q: QueryWithTable;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n // join sub query\n s: boolean;\n };\n\nexport interface SimpleJoinItem {\n type: string;\n args: JoinItemArgs;\n}\n\nexport type JoinLateralItem = [type: string, joined: Query, as: string];\n\nexport type WhereItem =\n | {\n [K: string]:\n | unknown\n | { [K: string]: unknown | Query | Expression }\n | Expression;\n\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<JoinItemArgs>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n }\n | ((q: unknown) => QueryBase | RelationQuery | Expression)\n | Query\n | Expression;\n\nexport interface 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 interface 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 SearchWeightRecord = { [K: string]: SearchWeight };\n\nexport interface 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 | { [K: 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 = { [K: string]: WindowDeclaration | Expression };\n\nexport interface WindowDeclaration {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n}\n\nexport interface UnionItem {\n a: Query | Expression;\n k: UnionKind;\n}\n\nexport interface UnionSet {\n b: Query;\n u: UnionItem[];\n}\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport type OnConflictTarget =\n | string\n | string[]\n | Expression\n | { constraint: string };\n\nexport type OnConflictSet = RecordUnknown | Expression;\n\nexport type OnConflictMerge = string | string[] | { except: string | string[] };\n","import { columnToSql, quoteSchemaAndTable } from './common';\nimport { checkIfASimpleQuery, QuerySourceItem } from './types';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData, QueryDataFromItem, SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\nimport { addValue, isExpression, isRawSQL, MaybeArray } from 'orchid-core';\nimport { getSqlText } from './utils';\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n table: QueryBase,\n data: SelectQueryData,\n quotedAs?: string,\n) => {\n let sql = 'FROM ';\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 data: SelectQueryData,\n quotedAs?: string,\n) => {\n if (data.from) {\n const { from } = data;\n if (Array.isArray(from)) {\n return from\n .map((item) => fromToSql(ctx, data, item, quotedAs))\n .join(', ');\n }\n\n return fromToSql(ctx, data, from, quotedAs);\n }\n\n let sql = quoteSchemaAndTable(data.schema, table.table as string);\n if (data.only) sql = `ONLY ${sql}`;\n return sql;\n};\n\nconst fromToSql = (\n ctx: ToSQLCtx,\n data: SelectQueryData,\n from: QueryDataFromItem,\n quotedAs?: string,\n) => {\n let only: boolean | undefined;\n let sql;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n sql = from.toSQL(ctx, quotedAs);\n } else {\n only = (from.q as SelectQueryData).only;\n\n if (!from.table) {\n sql = `(${getSqlText(makeSQL(from, ctx))})`;\n }\n // if query contains more than just schema return (SELECT ...)\n else if (!checkIfASimpleQuery(from)) {\n sql = `(${getSqlText(makeSQL(from, ctx))})`;\n } else {\n sql = quoteSchemaAndTable(from.q.schema, from.table);\n }\n }\n } else {\n sql = quoteSchemaAndTable(data.schema, from);\n }\n\n return (only === undefined ? data.only : only) ? `ONLY ${sql}` : sql;\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","export const MAX_BINDING_PARAMS = 65536;\n","import { ownColumnToSql } from './common';\nimport { pushWhereStatementSql } from './where';\nimport { Query } from '../query/query';\nimport { selectToSql } from './select';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { InsertQueryData, QueryData, QueryHookSelect } from './data';\nimport {\n addValue,\n ColumnTypeBase,\n emptyArray,\n Expression,\n isExpression,\n MaybeArray,\n pushOrNewArray,\n SingleSqlItem,\n Sql,\n} from 'orchid-core';\nimport { joinSubQuery } from '../common/utils';\nimport { Db } from '../query/db';\nimport { RawSQL } from './rawSql';\nimport { OnConflictTarget } from './types';\nimport { getSqlText } from './utils';\nimport { MAX_BINDING_PARAMS } from './constants';\n\n// reuse array for the columns list\nconst quotedColumns: string[] = [];\n\nexport const makeInsertSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: InsertQueryData,\n quotedAs: string,\n): Sql => {\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] as ColumnTypeBase;\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(\n `INSERT INTO ${quotedAs}(${quotedColumns.join(', ')})`,\n null as never,\n );\n\n const QueryClass = ctx.queryBuilder.constructor as unknown as Db;\n\n if (query.onConflict) {\n ctx.sql.push('ON CONFLICT');\n\n const { target } = query.onConflict;\n if (target) {\n if (typeof target === 'string') {\n ctx.sql.push(`(\"${shape[target]?.data.name || target}\")`);\n } else if (Array.isArray(target)) {\n ctx.sql.push(\n `(${target.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else if ('toSQL' in target) {\n ctx.sql.push(target.toSQL(ctx, quotedAs));\n } else {\n ctx.sql.push(`ON CONSTRAINT \"${target.constraint}\"`);\n }\n }\n\n // merge: undefined should also be handled by this `if`\n if ('merge' in query.onConflict) {\n let sql: string;\n\n const { merge } = query.onConflict;\n if (merge) {\n if (typeof merge === 'string') {\n const name = shape[merge]?.data.name || merge;\n sql = `DO UPDATE SET \"${name}\" = excluded.\"${name}\"`;\n } else if ('except' in merge) {\n sql = mergeColumnsSql(columns, quotedColumns, target, merge.except);\n } else {\n sql = `DO UPDATE SET ${merge.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '')}`;\n }\n } else {\n sql = mergeColumnsSql(columns, quotedColumns, target);\n }\n\n ctx.sql.push(sql);\n } else if (query.onConflict.set) {\n let sql: string;\n\n const { set } = query.onConflict;\n if (isExpression(set)) {\n sql = set.toSQL(ctx, quotedAs);\n } else {\n const arr: string[] = [];\n for (const key in set) {\n arr.push(\n `\"${shape[key]?.data.name || key}\" = ${addValue(\n ctx.values,\n set[key],\n )}`,\n );\n }\n sql = arr.join(', ');\n }\n\n ctx.sql.push('DO UPDATE SET', sql);\n } else {\n ctx.sql.push('DO NOTHING');\n }\n }\n\n pushWhereStatementSql(ctx, q, query, quotedAs);\n\n const hookSelect = pushReturningSql(\n ctx,\n q,\n query,\n quotedAs,\n query.afterCreateSelect,\n );\n\n if (query.kind === 'object') {\n const valuesSql: string[] = [];\n let ctxValues = ctx.values;\n const restValuesLen = ctxValues.length;\n let currentValuesLen = restValuesLen;\n let batch: SingleSqlItem[] | undefined;\n\n for (let i = 0; i < (values as unknown[][]).length; i++) {\n const encodedRow = `(${encodeRow(\n ctx,\n ctxValues,\n q,\n QueryClass,\n (values as unknown[][])[i],\n runtimeDefaults,\n quotedAs,\n )})`;\n\n if (ctxValues.length > MAX_BINDING_PARAMS) {\n if (ctxValues.length - currentValuesLen > MAX_BINDING_PARAMS) {\n throw new Error(\n `Too many parameters for a single insert row, max is ${MAX_BINDING_PARAMS}`,\n );\n }\n\n // save current batch\n ctx.sql[1] = `VALUES ${valuesSql.join(',')}`;\n ctxValues.length = currentValuesLen;\n batch = pushOrNewArray(batch, {\n text: ctx.sql.join(' '),\n values: ctxValues,\n });\n\n // reset sql and values for the next batch, repeat the last cycle\n ctxValues = ctx.values = [];\n valuesSql.length = 0;\n i--;\n } else {\n currentValuesLen = ctxValues.length;\n valuesSql.push(encodedRow);\n }\n }\n\n if (batch) {\n ctx.sql[1] = `VALUES ${valuesSql.join(',')}`;\n batch.push({\n text: ctx.sql.join(' '),\n values: ctxValues,\n });\n\n return {\n hookSelect,\n batch,\n };\n } else {\n ctx.sql[1] = `VALUES ${valuesSql.join(', ')}`;\n }\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[1] = `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[1] = `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(\n ctx,\n ctx.values,\n q,\n QueryClass,\n v[0],\n runtimeDefaults,\n quotedAs,\n ),\n ),\n );\n }\n\n ctx.sql[1] = getSqlText(makeSQL(q, { values: ctx.values }));\n }\n\n return {\n hookSelect,\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n};\n\nconst mergeColumnsSql = (\n columns: string[],\n quotedColumns: string[],\n target: OnConflictTarget | undefined,\n except?: MaybeArray<string>,\n): string => {\n const notExcluded: string[] = [];\n\n const exclude =\n typeof target === 'string'\n ? [target]\n : Array.isArray(target)\n ? [...target]\n : [];\n\n if (except) {\n if (typeof except === 'string') {\n exclude.push(except);\n } else {\n exclude.push(...except);\n }\n }\n\n for (let i = 0; i < columns.length; i++) {\n if (!exclude.includes(columns[i])) {\n notExcluded.push(quotedColumns[i]);\n }\n }\n\n return notExcluded.length\n ? `DO UPDATE SET ${notExcluded\n .map((column) => `${column} = excluded.${column}`)\n .join(', ')}`\n : 'DO NOTHING';\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n values: unknown[],\n q: ToSQLQuery,\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n) => {\n const arr = row.map((value) => {\n if (value && typeof value === 'object') {\n if (value instanceof Expression) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n return `(${getSqlText(joinSubQuery(q, value as Query).toSQL(ctx))})`;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(values, value);\n });\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(values, fn()));\n }\n }\n\n return arr.join(', ');\n};\n\nexport const pushReturningSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\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 { quoteSchemaAndTable } from './common';\nimport { pushReturningSql } from './insert';\nimport { pushWhereStatementSql } from './where';\nimport { pushLimitSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n QueryHookSelect,\n SelectQueryData,\n UpdateQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from './data';\nimport { addValue, isExpression, pushOrNewArray } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { joinSubQuery } from '../common/utils';\nimport { selectToSql } from './select';\nimport { countSelect } from './rawSql';\nimport { getSqlText } from './utils';\nimport { Query } from '../query/query';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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: ToSQLQuery,\n set: string[],\n data: UpdateQueryDataItem[],\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n const QueryClass = ctx.queryBuilder.constructor as unknown 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: ToSQLQuery,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n if ((value as Query).q.subQuery === 1) {\n return selectToSql(ctx, table, (value as Query).q, quotedAs);\n }\n\n return `(${getSqlText(\n joinSubQuery(table, value as ToSQLQuery).toSQL(ctx),\n )})`;\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 { pushWhereStatementSql } from './where';\nimport { pushReturningSql } from './insert';\nimport { processJoinItem } from './join';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { DeleteQueryData, QueryHookSelect } from './data';\nimport { getSqlText } from './utils';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 targets: string[] = [];\n const ons: string[] = [];\n\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\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\n const as = item[2];\n targets.push(\n `LATERAL (${getSqlText(q.toSQL(ctx))}) \"${\n query.joinOverrides?.[as] || as\n }\"`,\n );\n\n ctx.aliasValue = aliasValue;\n } else {\n const join = processJoinItem(ctx, table, query, item.args, quotedAs);\n\n const key = `${join.target}${join.on}`;\n if (joinSet) {\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n targets.push(join.target);\n if (join.on) ons.push(join.on);\n }\n }\n\n if (targets.length) {\n ctx.sql.push(`USING ${targets.join(', ')}`);\n }\n\n conditions = ons.join(' AND ');\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n\n if (conditions) {\n if (query.and?.length || query.or?.length || query.scopes) {\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 { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { ColumnInfoQueryData } from './data';\nimport { addValue } from 'orchid-core';\n\nexport const pushColumnInfoSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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, ToSQLQuery } from './toSQL';\nimport { CopyQueryData } from './data';\nimport { quoteString } from '../quote';\nimport { pushWhereStatementSql } from './where';\n\nexport const pushCopySql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 { maybeSelectedColumnToSql } 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 { makeInsertSql } 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 { addValue, isExpression, Sql } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { getSqlText } from './utils';\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 type ToSQLQuery = {\n __isQuery: Query['__isQuery'];\n q: Query['q'];\n queryBuilder: Query['queryBuilder'];\n table?: Query['table'];\n internal: Query['internal'];\n relations: Query['relations'];\n withData: Query['withData'];\n clone: Query['clone'];\n baseQuery: Query['baseQuery'];\n meta: Query['meta'];\n returnType: Query['returnType'];\n result: Query['result'];\n shape: Query['shape'];\n};\n\nexport const toSQL = (table: ToSQLQuery, options?: ToSQLOptions): Sql => {\n return (\n (!options?.clearCache && table.q[toSQLCacheKey]) ||\n (table.q[toSQLCacheKey] = makeSQL(table, options))\n );\n};\n\nexport const makeSQL = (\n table: ToSQLQuery,\n options?: ToSqlOptionsInternal,\n): 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 const tableName = table.table ?? query.as;\n if (!tableName) throw new Error(`Table is missing for ${query.type}`);\n\n if (query.type === 'truncate') {\n pushTruncateSql(ctx, tableName, query);\n return { text: sql.join(' '), values };\n }\n\n if (query.type === 'columnInfo') {\n pushColumnInfoSql(ctx, table, query);\n return { text: sql.join(' '), values };\n }\n\n const quotedAs = `\"${query.as || tableName}\"`;\n\n if (query.type === 'insert') {\n return makeInsertSql(ctx, table, query, `\"${tableName}\"`);\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 if (query.union) {\n sql.push(`(${getSqlText(makeSQL(query.union.b, { values }))})`);\n\n for (const u of query.union.u) {\n const itemSql = isExpression(u.a)\n ? u.a.toSQL(ctx, quotedAs)\n : getSqlText(makeSQL(u.a, { values }));\n sql.push(`${u.k} (${itemSql})`);\n }\n } else {\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 || query.scopes) {\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 : maybeSelectedColumnToSql(ctx, table.q, 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\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 { PickQueryQ, Query } from '../query/query';\nimport { QueryLogger, QueryLogObject } from '../queryMethods';\nimport { Adapter, QueryResult } from '../adapter';\nimport { toSQLCacheKey } from './toSQL';\nimport {\n HavingItem,\n JoinItem,\n OnConflictTarget,\n OnConflictSet,\n OrderItem,\n QuerySourceItem,\n SelectItem,\n UnionItem,\n WhereItem,\n WindowItem,\n WithItem,\n OnConflictMerge,\n} from './types';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n ColumnsShapeBase,\n MaybeArray,\n Sql,\n getValueKey,\n ColumnsParsers,\n Expression,\n QueryColumn,\n RecordString,\n RecordUnknown,\n QueryReturnType,\n PickQueryTable,\n ExpressionChain,\n QueryDataTransform,\n} from 'orchid-core';\nimport { RelationQuery } from '../relations';\n\nexport interface RecordOfColumnsShapeBase {\n [K: string]: ColumnsShapeBase;\n}\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = RecordOfColumnsShapeBase;\n\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport interface JoinedParsers {\n [K: string]: ColumnsParsers;\n}\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 = RecordString;\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 interface QueryScopes {\n [K: string]: QueryScopeData;\n}\n\n// Query data stored for a specific scope to be applied to the query.\nexport interface QueryScopeData {\n and?: WhereItem[];\n or?: WhereItem[][];\n}\n\nexport type QueryDataFromItem = string | Query | Expression;\n\nexport interface QueryDataJoinTo extends PickQueryTable, PickQueryQ {}\n\nexport interface 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?: RecordOfColumnsShapeBase;\n joinTo?: QueryDataJoinTo;\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?: MaybeArray<QueryDataFromItem>;\n sources?: { [K: string]: QuerySourceItem };\n and?: WhereItem[];\n or?: WhereItem[][];\n coalesceValue?: unknown | Expression;\n parsers?: ColumnsParsers;\n notFoundDefault?: unknown;\n defaults?: RecordUnknown;\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?: QueryDataTransform[];\n // default language for the full text search\n language?: string;\n // Is set for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `subQuery` is true,\n // the join will be applied after callback is resolved.\n // 1 for the same query, 2 for relation queries returned from the callback.\n subQuery?: number;\n // Chained relations, such as `db.user.messages.chat` are stored into array.\n relChain?: (Query | RelationQuery)[];\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?: RecordUnknown;\n // Track the applied scopes, this is used when removing the scope from the query.\n scopes?: { [K: string]: QueryScopeData };\n // to allow updating or deleting all records\n all?: true;\n\n chain?: ExpressionChain;\n}\n\nexport interface SelectQueryData extends CommonQueryData {\n type: undefined;\n distinct?: SelectableOrExpression[];\n only?: boolean;\n join?: JoinItem[];\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: { b: Query; u: UnionItem[] };\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]?: QueryColumn;\n}\n\nexport type CreateKind = 'object' | 'raw' | 'from';\n\nexport interface InsertQueryData extends 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 target?: OnConflictTarget;\n set?: OnConflictSet;\n merge?: OnConflictMerge;\n };\n}\n\nexport interface UpdateQueryDataObject {\n [K: string]: 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 interface UpdateQueryData extends CommonQueryData {\n type: 'update';\n updateData: UpdateQueryDataItem[];\n}\n\nexport interface DeleteQueryData extends CommonQueryData {\n type: 'delete';\n join?: JoinItem[];\n}\n\nexport interface TruncateQueryData extends CommonQueryData {\n type: 'truncate';\n restartIdentity?: boolean;\n cascade?: boolean;\n}\n\nexport interface ColumnInfoQueryData extends CommonQueryData {\n type: 'columnInfo';\n column?: string;\n}\n\nexport interface CopyQueryData extends 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 interface PickQueryDataShapeAndJoinedShapes {\n shape: ColumnsShapeBase;\n joinedShapes?: JoinedShapes;\n}\n\nexport const cloneQuery = (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 if (q.scopes) q.scopes = { ...q.scopes };\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 = { b: q.union.b, u: q.union.u.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 { cloneQuery, QueryData, toSQLCacheKey, ToSQLQuery } from '../sql';\nimport type { Query } from '../query/query';\nimport type { QueryColumn } from 'orchid-core';\nimport { RelationQuery } from '../relations';\nimport { Expression, PickQueryMeta } from 'orchid-core';\nimport { PickQueryMetaTable } from '../query/query';\n\nexport type AliasOrTable<T extends PickQueryMetaTable> =\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 PickQueryMeta = PickQueryMeta,\n C extends QueryColumn = QueryColumn,\n> = '*' | keyof T['meta']['selectable'] | Expression<C>;\n\nexport type SelectableOrExpressions<\n T extends PickQueryMeta = PickQueryMeta,\n C extends QueryColumn = QueryColumn,\n> = ('*' | keyof T['meta']['selectable'] | Expression<C>)[];\n\nexport type ExpressionOutput<\n T extends PickQueryMeta,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][Expr]['column']\n : Expr extends Expression\n ? Expr['result']['value']\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 cloneQuery(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: ToSQLQuery,\n cb: (q: ToSQLQuery) => ToSQLQuery,\n): ToSQLQuery => {\n const { subQuery, relChain } = q.q;\n q.q.subQuery = 1;\n q.q.relChain = undefined;\n const result = cb(q);\n q.q.subQuery = subQuery;\n q.q.relChain = relChain;\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: ToSQLQuery, sub: ToSQLQuery): Query => {\n if (!('relationConfig' in sub)) return sub as Query;\n\n return (sub as unknown as RelationQuery).relationConfig.joinQuery(\n sub as unknown as Query,\n q as Query,\n );\n};\n","import {\n Code,\n ColumnDataBase,\n ColumnSchemaConfig,\n ColumnTypeBase,\n setColumnData,\n singleQuote,\n} from 'orchid-core';\nimport { ColumnType } from './columnType';\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<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n unknown,\n ReturnType<Schema['unknown']>,\n typeof Operators.any\n> {\n operators = Operators.any;\n\n constructor(schema: Schema, public dataType: string) {\n super(\n schema,\n schema.unknown() as never,\n schema.unknown() as never,\n schema.unknown() as never,\n );\n this.data.isOfCustomType = true;\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `type(${singleQuote(this.dataType)})`, m);\n }\n\n as<\n T extends { inputType: unknown; outputType: unknown; data: ColumnDataBase },\n // Omit is optimal\n C extends Omit<ColumnTypeBase, 'inputType' | 'outputType'> & {\n inputType: T['inputType'];\n outputType: T['outputType'];\n },\n >(this: T, column: C): C {\n const c = setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as C;\n\n c.inputSchema = column.inputSchema;\n c.outputSchema = column.outputSchema;\n c.querySchema = column.querySchema;\n\n return c;\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn<\n Schema extends ColumnSchemaConfig,\n> extends CustomTypeColumn<Schema> {\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `domain(${singleQuote(this.dataType)})`, m);\n }\n}\n","import { IdentityColumn, IntegerColumn } from './number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n XMLColumn,\n} from './string';\nimport { IntervalColumn, TimeColumn } from './dateTime';\nimport { BooleanColumn } from './boolean';\nimport { JSONTextColumn } from './json';\nimport {\n ColumnSchemaConfig,\n makeTimestampsHelpers,\n QueryColumnsInit,\n setCurrentColumnName,\n setDefaultLanguage,\n setDefaultNowFn,\n TimestampHelpers,\n} from 'orchid-core';\nimport { makeRegexToFindInSql } from '../common/utils';\nimport { CustomTypeColumn, DomainColumn } from './customType';\nimport { RawSQL, sqlFn, SqlFn } from '../sql/rawSql';\nimport { TableData } from '../tableData';\n\nexport const getColumnTypes = <ColumnTypes, Shape extends QueryColumnsInit>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n): Shape => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n return fn(types);\n};\n\nexport interface DefaultColumnTypes<SchemaConfig extends ColumnSchemaConfig>\n extends TimestampHelpers {\n schema: SchemaConfig;\n enum: SchemaConfig['enum'];\n array: SchemaConfig['array'];\n\n name<T>(this: T, name: string): T;\n\n sql: SqlFn;\n\n smallint: SchemaConfig['smallint'];\n integer: SchemaConfig['integer'];\n bigint: SchemaConfig['bigint'];\n numeric: SchemaConfig['decimal'];\n decimal: SchemaConfig['decimal'];\n real: SchemaConfig['real'];\n doublePrecision: SchemaConfig['doublePrecision'];\n identity(\n options?: TableData.Identity,\n ): IdentityColumn<ReturnType<SchemaConfig['integer']>>;\n smallSerial: SchemaConfig['smallSerial'];\n serial: SchemaConfig['serial'];\n bigSerial: SchemaConfig['bigSerial'];\n money: SchemaConfig['money'];\n varchar: SchemaConfig['varchar'];\n char: SchemaConfig['char'];\n text: SchemaConfig['text'];\n // `varchar` column with optional limit defaulting to 255.\n string: SchemaConfig['string'];\n citext: SchemaConfig['citext'];\n bytea(): ByteaColumn<SchemaConfig>;\n date: SchemaConfig['date'];\n timestampNoTZ: SchemaConfig['timestampNoTZ'];\n timestamp: SchemaConfig['timestamp'];\n time(precision?: number): TimeColumn<SchemaConfig>;\n interval(fields?: string, precision?: number): IntervalColumn<SchemaConfig>;\n boolean(): BooleanColumn<SchemaConfig>;\n point(): PointColumn<SchemaConfig>;\n line(): LineColumn<SchemaConfig>;\n lseg(): LsegColumn<SchemaConfig>;\n box(): BoxColumn<SchemaConfig>;\n path(): PathColumn<SchemaConfig>;\n polygon(): PolygonColumn<SchemaConfig>;\n circle(): CircleColumn<SchemaConfig>;\n cidr(): CidrColumn<SchemaConfig>;\n inet(): InetColumn<SchemaConfig>;\n macaddr(): MacAddrColumn<SchemaConfig>;\n macaddr8(): MacAddr8Column<SchemaConfig>;\n bit(length: number): BitColumn<SchemaConfig>;\n bitVarying(length?: number): BitVaryingColumn<SchemaConfig>;\n tsvector(): TsVectorColumn<SchemaConfig>;\n tsquery(): TsQueryColumn<SchemaConfig>;\n uuid(): UUIDColumn<SchemaConfig>;\n xml(): XMLColumn<SchemaConfig>;\n json: SchemaConfig['json'];\n jsonText(): JSONTextColumn<SchemaConfig>;\n type(dataType: string): CustomTypeColumn<SchemaConfig>;\n domain(dataType: string): DomainColumn<SchemaConfig>;\n}\n\nexport const makeColumnTypes = <SchemaConfig extends ColumnSchemaConfig>(\n schema: SchemaConfig,\n): DefaultColumnTypes<SchemaConfig> => {\n return {\n schema,\n enum: schema.enum,\n array: schema.array,\n\n name(name: string) {\n setCurrentColumnName(name);\n return this;\n },\n\n sql: sqlFn,\n\n smallint: schema.smallint,\n integer: schema.integer,\n bigint: schema.bigint,\n numeric: schema.decimal,\n decimal: schema.decimal,\n real: schema.real,\n doublePrecision: schema.doublePrecision,\n identity(options) {\n return (schema.integer() as IntegerColumn<SchemaConfig>).identity(\n options,\n ) as never;\n },\n smallSerial: schema.smallSerial,\n serial: schema.serial,\n bigSerial: schema.bigSerial,\n money: schema.money,\n varchar: schema.varchar,\n char: schema.char,\n text: schema.text,\n string: schema.string,\n citext: schema.citext,\n bytea() {\n return new ByteaColumn<SchemaConfig>(schema);\n },\n date: schema.date,\n timestampNoTZ: schema.timestampNoTZ,\n timestamp: schema.timestamp,\n time(precision) {\n return new TimeColumn<SchemaConfig>(schema, precision);\n },\n interval(fields, precision) {\n return new IntervalColumn<SchemaConfig>(schema, fields, precision);\n },\n boolean() {\n return new BooleanColumn<SchemaConfig>(schema);\n },\n point() {\n return new PointColumn<SchemaConfig>(schema);\n },\n line() {\n return new LineColumn<SchemaConfig>(schema);\n },\n lseg() {\n return new LsegColumn<SchemaConfig>(schema);\n },\n box() {\n return new BoxColumn<SchemaConfig>(schema);\n },\n path() {\n return new PathColumn<SchemaConfig>(schema);\n },\n polygon() {\n return new PolygonColumn<SchemaConfig>(schema);\n },\n circle() {\n return new CircleColumn<SchemaConfig>(schema);\n },\n cidr() {\n return new CidrColumn<SchemaConfig>(schema);\n },\n inet() {\n return new InetColumn<SchemaConfig>(schema);\n },\n macaddr() {\n return new MacAddrColumn<SchemaConfig>(schema);\n },\n macaddr8() {\n return new MacAddr8Column<SchemaConfig>(schema);\n },\n bit(length) {\n return new BitColumn<SchemaConfig>(schema, length);\n },\n bitVarying(length) {\n return new BitVaryingColumn<SchemaConfig>(schema, length);\n },\n tsvector() {\n return new TsVectorColumn<SchemaConfig>(schema);\n },\n tsquery() {\n return new TsQueryColumn<SchemaConfig>(schema);\n },\n uuid() {\n return new UUIDColumn<SchemaConfig>(schema);\n },\n xml() {\n return new XMLColumn<SchemaConfig>(schema);\n },\n json: schema.json,\n jsonText() {\n return new JSONTextColumn<SchemaConfig>(schema);\n },\n type(dataType) {\n return new CustomTypeColumn<SchemaConfig>(schema, dataType);\n },\n domain(dataType) {\n return new DomainColumn<SchemaConfig>(schema, dataType);\n },\n\n ...makeTimestampsHelpers(makeRegexToFindInSql),\n };\n};\n\nRawSQL.prototype.columnTypes = makeColumnTypes;\n","import { ColumnType } from './columnType';\nimport { CreateCtx, CreateSelf, UpdateCtx, UpdateSelf } from '../queryMethods';\nimport { Operators, OperatorsAny } from './operators';\nimport { ColumnSchemaConfig, RecordUnknown } from 'orchid-core';\n\nexport abstract class VirtualColumn<\n Schema extends ColumnSchemaConfig,\n InputSchema extends Schema['type'] = ReturnType<Schema['never']>,\n> extends ColumnType<Schema, unknown, InputSchema, OperatorsAny> {\n dataType = '';\n operators = Operators.any;\n\n constructor(\n schema: Schema,\n inputSchema: InputSchema = schema.never() as InputSchema,\n ) {\n super(schema, inputSchema);\n }\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: CreateSelf,\n ctx: CreateCtx,\n item: RecordUnknown,\n rowIndex: number,\n ): void;\n\n update?(q: UpdateSelf, ctx: UpdateCtx, set: RecordUnknown): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { ColumnSchemaConfig } from 'orchid-core';\nimport { RawSQL } from '../sql/rawSql';\nimport { defaultSchemaConfig } from './defaultSchemaConfig';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn<\n Schema extends ColumnSchemaConfig,\n> extends VirtualColumn<Schema> {\n constructor(schema: Schema) {\n super(schema, schema.unknown() as never);\n }\n}\n\nRawSQL.prototype.result = { value: new UnknownColumn(defaultSchemaConfig) };\n","import { ColumnSchemaConfig, ColumnTypeBase } from 'orchid-core';\nimport { makeColumnTypes } from './columnTypes';\nimport { ColumnType } from './columnType';\n\nexport interface ColumnsByType {\n [K: string]: () => ColumnTypeBase;\n}\n\nexport const makeColumnsByType = (schema: ColumnSchemaConfig) => {\n const t = makeColumnTypes(schema);\n\n return {\n bool: t.boolean,\n boolean: t.boolean,\n bytea: t.bytea,\n char: t.char,\n int8: t.bigint,\n bigint: t.bigint,\n int2: t.smallint,\n smallint: t.smallint,\n int4: t.integer,\n integer: t.integer,\n text() {\n return t.text(0, Infinity);\n },\n json: t.jsonText,\n xml: t.xml,\n point: t.point,\n lseg: t.lseg,\n path: t.path,\n box: t.box,\n polygon: t.polygon,\n line: t.line,\n cidr: t.cidr,\n float4: t.real,\n real: t.real,\n float8: t.doublePrecision,\n 'double precision': t.doublePrecision,\n circle: t.circle,\n macaddr8: t.macaddr8,\n money: t.money,\n macaddr: t.macaddr,\n inet: t.inet,\n bpchar: t.char,\n character: t.char,\n varchar: t.varchar,\n 'character varying': t.varchar,\n date: t.date,\n time: t.time,\n 'time without time zone': t.time,\n timestamp: t.timestampNoTZ,\n 'timestamp without time zone': t.timestampNoTZ,\n timestamptz: t.timestamp,\n 'timestamp with time zone': t.timestamp,\n interval: t.interval,\n bit() {\n return t.bit(Infinity);\n },\n varbit: t.bitVarying,\n 'bit varying': t.bitVarying,\n numeric: t.decimal,\n decimal: t.decimal,\n uuid: t.uuid,\n tsvector: t.tsvector,\n tsquery: t.tsquery,\n jsonb: schema.json as () => ColumnType,\n smallserial: t.smallSerial,\n serial: t.serial,\n bigserial: t.bigSerial,\n } as ColumnsByType;\n};\n","import pg, { Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n emptyObject,\n FnUnknownToUnknown,\n QueryInput,\n QueryResultRow,\n setAdapterConnectRetry,\n SingleSqlItem,\n Sql,\n} from 'orchid-core';\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface 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 interface 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: FnUnknownToUnknown = (arg) => arg;\n\nconst rollbackSql = { text: 'ROLLBACK' };\nconst commitSql: SingleSqlItem = { text: 'COMMIT' };\n\nexport interface AdapterConfig\n extends AdapterConfigBase,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n schema?: string;\n databaseURL?: string;\n}\n\nexport interface AdapterOptions extends 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 if (config.connectRetry) {\n setAdapterConnectRetry(\n this,\n () => this.pool.connect(),\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n }\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return performQuery(this, query, types) as never;\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(this, query, types, 'array') as never;\n }\n\n async transaction<Result>(\n begin: SingleSqlItem,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n end: SingleSqlItem = commitSql,\n ): Promise<Result> {\n const client = await this.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, rollbackSql, this.types);\n throw err;\n }\n await performQueryOnClient(client, end, 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\ninterface ConnectionSchema {\n connection: { schema?: string };\n}\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 adapter: Adapter,\n query: QueryInput,\n types?: TypeParsers,\n rowMode?: 'array',\n) => {\n const client = await adapter.connect();\n try {\n await setSearchPath(client, adapter.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 schema?: string;\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 this.schema = adapter.schema;\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\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 {\n PickQueryMetaResultRelationsWindows,\n Query,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport {\n addValue,\n ColumnTypeBase,\n emptyObject,\n Expression,\n ExpressionTypeMethod,\n getValueKey,\n PickQueryMeta,\n PickQueryMetaResultWindows,\n QueryColumn,\n setParserToQuery,\n toArray,\n} from 'orchid-core';\nimport { SelectableOrExpression } from './utils';\nimport {\n OrderItem,\n QueryData,\n SelectQueryData,\n ToSQLCtx,\n WhereItem,\n} from '../sql';\nimport { columnToSql, rawOrColumnToSql } from '../sql/common';\nimport { pushOrderBySql } from '../sql/orderBy';\nimport { whereToSql } from '../sql/where';\nimport { windowToSql } from '../sql/window';\nimport {\n OrderArg,\n OrderArgs,\n WhereArg,\n WhereArgs,\n WindowArgDeclaration,\n} from '../queryMethods';\nimport { extendQuery } from '../query/queryUtils';\n\n// Additional SQL options that can be accepted by any aggregate function.\nexport interface AggregateOptions<\n T extends PickQueryMetaResultRelationsWindows,\n> {\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> | OrderArgs<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?: WhereArgs<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 PickQueryMetaResultWindows> =\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 PickQueryMeta> = (\n | SelectableOrExpression<Q>\n | FnExpressionArgsPairs<Q>\n | FnExpressionArgsValue\n)[];\n\nexport interface FnExpressionArgsPairs<Q extends PickQueryMeta> {\n pairs: { [K: string]: SelectableOrExpression<Q> };\n}\n\nexport interface FnExpressionArgsValue {\n value: unknown;\n}\n\n// Expression for SQL function calls.\nexport class FnExpression<\n Q extends Query = Query,\n T extends QueryColumn = QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: QueryData;\n\n /**\n * @param query - query object.\n * @param fn - SQL function name.\n * @param args - arguments of the function.\n * @param options - aggregate options.\n * @param value - column type of the function result.\n */\n constructor(\n public query: Q,\n public fn: string,\n public args: FnExpressionArgs<Q>,\n public options: AggregateOptions<Q> = emptyObject,\n value: T,\n ) {\n super();\n this.result = { value };\n (this.q = query.q).expr = this;\n Object.assign(query, value.operators);\n\n // Throw happens only on `undefined`, which is not the case for `sum` and other functions that can return `null`.\n query.q.returnType = 'valueOrThrow';\n (query.q as SelectQueryData).returnsOne = true;\n (query.q as SelectQueryData)[getValueKey] = value;\n query.q.select = [this];\n\n const { parseFn } = value as never as ColumnTypeBase;\n if (parseFn) {\n setParserToQuery(query.q, getValueKey, parseFn);\n }\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, this.q.shape, arg, quotedAs, true);\n } else if (arg instanceof Expression) {\n return arg.toSQL(ctx, quotedAs);\n } else if ('pairs' in (arg as FnExpressionArgsPairs<Query>)) {\n const args: string[] = [];\n const { pairs } = arg as FnExpressionArgsPairs<Query>;\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,\n pairs[key as keyof typeof pairs] as never,\n quotedAs,\n )}`,\n );\n }\n return args.join(', ');\n } else {\n return addValue(values, (arg as FnExpressionArgsValue).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,\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.query,\n {\n and: options.filter ? ([options.filter] as WhereItem[]) : undefined,\n or: options.filterOr?.map((item) => [item]) as WhereItem[][],\n shape: this.q.shape,\n joinedShapes: this.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, options.over as string, quotedAs)}`,\n );\n }\n\n return sql.join('');\n }\n}\n\n// Applies a function expression to the query.\nexport function makeFnExpression<\n T extends PickQueryMetaResultRelationsWindows,\n C extends QueryColumn,\n>(\n self: T,\n type: C,\n fn: string,\n args: FnExpressionArgs<Query>,\n options?: AggregateOptions<T>,\n): SetQueryReturnsColumnOrThrow<T, C> & C['operators'] {\n const q = extendQuery(self as unknown as Query, type.operators);\n (q.baseQuery as unknown as ExpressionTypeMethod).type =\n ExpressionTypeMethod.prototype.type;\n\n new FnExpression<Query, QueryColumn>(\n q,\n fn,\n args,\n options as AggregateOptions<Query> | undefined,\n type,\n );\n\n return q as never;\n}\n","import {\n PickQueryMetaResultRelationsWindows,\n PickQueryQ,\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { ExpressionOutput, SelectableOrExpression } from '../common/utils';\nimport {\n emptyArray,\n emptyObject,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../common/fn';\nimport {\n OperatorsAny,\n OperatorsArray,\n OperatorsBoolean,\n OperatorsNumber,\n OperatorsText,\n} from '../columns/operators';\nimport { RawSQL } from '../sql/rawSql';\nimport { IntegerColumn, RealColumn } from '../columns';\nimport { defaultSchemaConfig } from '../columns/defaultSchemaConfig';\nimport { _queryGetOptional, QueryGetSelf } from './get.utils';\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: PickQueryQ) => {\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(defaultSchemaConfig);\nint.parseItem = int.parseFn = (input): number => parseInt(input as never);\n\n// Parse nullable string to int, the nullable string may happen because of `bigint` db type.\nconst nullableInt = new IntegerColumn(defaultSchemaConfig);\nnullableInt.parseItem = nullableInt.parseFn = (input): number =>\n (input === null ? null : parseInt(input as never)) as number;\n\n// double-precision is represented by string in JS, parse it to float.\nconst nullableFloat = new RealColumn(defaultSchemaConfig);\nnullableFloat.parseItem = nullableFloat.parseFn = (input): number =>\n (input === null ? null : parseFloat(input as never)) as number;\n\ntype QueryReturnsAgg<T, C, Op> = SetQueryReturnsColumnOrThrow<\n T,\n QueryColumn<C, Op>\n> &\n Op;\n\ntype CountReturn<T> = QueryReturnsAgg<T, number, OperatorsNumber> & {\n isCount: true;\n};\n\ntype NumberColumn = QueryColumn<number, OperatorsNumber>;\n\ntype NumberNullable = QueryColumn<number | null, OperatorsNumber>;\n\ntype NullableNumberReturn<T> = SetQueryReturnsColumnOrThrow<T, NumberNullable> &\n OperatorsNumber;\n\nexport type BooleanQueryColumn = QueryColumn<boolean, OperatorsBoolean>;\n\ntype BooleanNullable = QueryColumn<boolean | null, OperatorsBoolean>;\n\ntype NullableBooleanReturn<T> = SetQueryReturnsColumnOrThrow<\n T,\n BooleanNullable\n> &\n OperatorsBoolean;\n\ntype NullableJSONAggReturn<\n T extends PickQueryMeta,\n Arg extends SelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type: (ExpressionOutput<T, Arg>['type'] | null)[] | null;\n outputType: (ExpressionOutput<T, Arg>['outputType'] | null)[] | null;\n queryType: (ExpressionOutput<T, Arg>['queryType'] | null)[] | null;\n operators: OperatorsArray;\n }\n> &\n OperatorsArray;\n\ninterface RecordSelectableOrExpression<T extends PickQueryMeta> {\n [K: string]: SelectableOrExpression<T>;\n}\n\ntype NullableJSONObjectReturn<\n T extends PickQueryMeta,\n Obj extends RecordSelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['type'];\n }\n | null;\n outputType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['outputType'];\n }\n | null;\n queryType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['queryType'];\n }\n | null;\n operators: OperatorsAny;\n }\n> &\n OperatorsAny;\n\ntype StringColumn = QueryColumn<string, OperatorsText>;\n\ntype StringNullable = QueryColumn<string | null, OperatorsText>;\n\ntype NullableStringReturn<T> = SetQueryReturnsColumnOrThrow<T, StringNullable> &\n OperatorsText;\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\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 QueryGetSelf>(\n this: T,\n ): SetQueryReturnsColumnOrThrow<T, BooleanQueryColumn> {\n const q = _queryGetOptional(\n (this as unknown as Query).clone(),\n new RawSQL('true'),\n );\n q.q.notFoundDefault = false;\n q.q.coalesceValue = new RawSQL('false');\n return q as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): CountReturn<T> {\n return makeFnExpression(this, int, 'count', [arg], options) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'min',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'max',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'sum',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'avg',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'bit_and',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'bit_or',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'bool_and',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'bool_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'every',\n [arg],\n options,\n ) as never;\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<\n T extends PickQueryMetaResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n emptyObject as never,\n 'json_agg',\n [arg],\n options,\n );\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<\n T extends PickQueryMetaResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n emptyObject as never,\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: 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: 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 PickQueryMetaResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n emptyObject as never,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends PickQueryMetaResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n emptyObject as never,\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n ) as NullableStringReturn<T>;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'xmlagg',\n [arg],\n options,\n ) as NullableStringReturn<T>;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'row_number', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'dense_rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'percent_rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableFloat, 'cume_dist', emptyArray, {\n over,\n }) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { isExpression, RecordUnknown } 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 const q = this.clone();\n clears.forEach((clear) => {\n if (clear === 'where') {\n delete q.q.and;\n delete q.q.or;\n } else if (clear === 'counters') {\n if ('type' in q.q && q.q.type === 'update') {\n q.q.updateData = q.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 RecordUnknown;\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 (q.q as never as RecordUnknown)[clear];\n }\n });\n return q;\n }\n}\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Query,\n QueryOrExpression,\n QueryReturnsAll,\n queryTypeWithLimitOne,\n SetQueryKind,\n SetQueryKindResult,\n SetQueryReturnsAllKind,\n SetQueryReturnsAllKindResult,\n SetQueryReturnsColumnKind,\n SetQueryReturnsColumnKindResult,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsOneKind,\n SetQueryReturnsOneKindResult,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluckColumnKind,\n SetQueryReturnsPluckColumnKindResult,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport { RelationConfigDataForCreate, RelationsBase } from '../relations';\nimport {\n CreateKind,\n InsertQueryData,\n OnConflictMerge,\n ToSQLQuery,\n} from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape } from '../query/db';\nimport {\n Expression,\n ColumnSchemaConfig,\n RecordUnknown,\n PickQueryUniqueProperties,\n QueryColumn,\n FnUnknownToUnknown,\n isExpression,\n} from 'orchid-core';\nimport { isSelectingCount } from './aggregate';\nimport { resolveSubQueryCallback } from '../common/utils';\n\nexport interface CreateSelf\n extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryUniqueProperties {\n inputType: RecordUnknown;\n}\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 CreateSelf,\n BelongsToData = CreateBelongsToData<T>,\n> = RelationsBase extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaults<T, keyof T['meta']['defaults']>\n : CreateRelationsData<T, BelongsToData>;\n\ntype CreateDataWithDefaults<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults]?: K extends keyof T['inputType'] ? CreateColumn<T, K> : never;\n};\n\ntype CreateDataWithDefaultsForRelations<\n T extends CreateSelf,\n Defaults extends keyof T['inputType'],\n OmitFKeys extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults | OmitFKeys\n ? never\n : K]: K extends Defaults | OmitFKeys ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults as K extends OmitFKeys ? never : K]?: CreateColumn<T, K>;\n};\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<\n T extends CreateSelf,\n K extends keyof T['inputType'],\n> =\n | T['inputType'][K]\n | QueryOrExpression<T['inputType'][K]>\n | ((q: T) => QueryOrExpression<T['inputType'][K]>);\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<T extends CreateSelf, BelongsToData> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsForRelations<\n T,\n keyof T['meta']['defaults'],\n T['relations'][keyof T['relations']]['relationConfig']['omitForeignKeyInCreate']\n > &\n BelongsToData &\n // Union of the rest relations objects, intersection is not needed here because there are no required properties:\n // { foo: object } | { bar: object }\n T['relations'][keyof T['relations']]['relationConfig']['optionalDataForCreate'];\n\n// Intersection of objects for `belongsTo` relations:\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateBelongsToData<T extends CreateSelf> =\n CreateRelationsDataOmittingFKeys<\n T,\n T['relations'][keyof T['relations']]['relationConfig']['dataForCreate']\n >;\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 CreateSelf,\n // Collect a union of `belongsTo` relation objects.\n Union,\n> =\n // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n (\n Union extends RelationConfigDataForCreate\n ? (\n u: // omit relation columns if they are in defaults, is tested in factory.test.ts\n keyof Union['columns'] extends keyof T['meta']['defaults']\n ? Omit<Union['columns'], keyof T['meta']['defaults']> & {\n [P in keyof T['meta']['defaults'] &\n keyof Union['columns']]?: Union['columns'][P];\n } & Partial<Union['nested']>\n : Union['columns'] | Union['nested'],\n ) => void\n : never\n ) extends // must be handled as a function argument, belongsTo.test relies on this\n (u: infer Obj extends RecordUnknown) => void\n ? Obj\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 CreateSelf, BT> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>;\n\ntype CreateRawOrFromResult<T extends CreateSelf> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKind<T, 'create'>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKind<T, 'create'>\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<\n T extends CreateSelf,\n BT,\n> = T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryReturnsRowCount<T, 'create'>;\n\ntype InsertRawOrFromResult<T extends CreateSelf> =\n T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKind<T, 'create'>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKind<T, 'create'>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<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 CreateSelf, BT> = T extends { isCount: true }\n ? SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>;\n\ntype CreateManyRawOrFromResult<T extends CreateSelf> = T extends {\n isCount: true;\n}\n ? SetQueryKind<T, 'create'>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKind<T, 'create'>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKind<T, 'create'>\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<\n T extends CreateSelf,\n BT,\n> = T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKindResult<\n T,\n 'create',\n NarrowCreateResult<T, BT>\n >\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryReturnsRowCount<T, 'create'>;\n\ntype InsertManyRawOrFromResult<T extends CreateSelf> =\n T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKind<T, 'create'>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKind<T, 'create'>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<T, 'create'>;\n\n/**\n * When creating a record with a *belongs to* nested record,\n * un-nullify foreign key columns of the result.\n *\n * The same should work as well with any non-null columns passed to `create`, but it's to be implemented later.\n */\ntype NarrowCreateResult<T extends CreateSelf, BT> = [\n T['relations'][keyof T['relations'] &\n keyof BT]['relationConfig']['omitForeignKeyInCreate'],\n] extends [never]\n ? T['result']\n : {\n [K in keyof T['result']]: K extends T['relations'][keyof T['relations'] &\n keyof BT]['relationConfig']['omitForeignKeyInCreate']\n ? QueryColumn<\n Exclude<T['result'][K]['type'], null>,\n T['result'][K]['operators']\n >\n : T['result'][K];\n };\n\n// `onConflictDoNothing()` 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 CreateSelf> = T['returnType'] extends 'oneOrThrow'\n ? SetQueryReturnsOneOptional<T>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturnsColumnOptional<T, T['result']['value']>\n : T;\n\n// `createRaw` method argument.\n// Contains array of columns and a raw SQL for values.\ninterface CreateRawData<T extends CreateSelf> {\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.\ninterface CreateManyRawData<T extends CreateSelf> {\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 CreateSelf> = {\n [K in keyof T['inputType'] as K extends keyof T['meta']['defaults']\n ? never\n : null | 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 CreateSelf,\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 keyof RawRequiredColumns<T> & string,\n Arg['columns'][number]\n >}`,\n ];\n\n// Argument of `onConflict`, can be:\n// - a unique column name\n// - an array of unique column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends PickQueryUniqueProperties> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples']\n | Expression\n | { constraint: T['internal']['uniqueConstraints'] };\n\nexport type AddQueryDefaults<T extends CreateSelf, Defaults> = {\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 interface CreateCtx {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: RecordUnknown[];\n}\n\n// Type of `encodeFn` of columns.\ninterface RecordEncoder {\n [K: string]: FnUnknownToUnknown;\n}\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: CreateSelf,\n item: RecordUnknown,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: RecordEncoder,\n) => {\n const { shape } = (q as Query).q;\n for (const key in item) {\n if (shape[key] instanceof VirtualColumn) {\n (shape[key] as VirtualColumn<ColumnSchemaConfig>).create?.(\n q,\n ctx,\n item,\n rowIndex,\n );\n } else {\n if (typeof item[key] === 'function') {\n item[key] = resolveSubQueryCallback(\n q as unknown as ToSQLQuery,\n item[key] as (q: ToSQLQuery) => ToSQLQuery,\n );\n }\n\n 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 FnUnknownToUnknown;\n }\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 RecordUnknown[],\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: RecordEncoder,\n data: RecordUnknown,\n): unknown[] => {\n return columns.map((key) =>\n encoders[key] && !isExpression(data[key])\n ? encoders[key](data[key])\n : 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: CreateSelf,\n data: RecordUnknown,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).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: CreateSelf,\n data: RecordUnknown[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).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: CreateSelf,\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 unknown as { q: InsertQueryData };\n\n delete q.and;\n delete q.or;\n delete q.scopes;\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: CreateSelf,\n obj?: { columns: string[] },\n many?: boolean,\n) => {\n if (!many && !queryTypeWithLimitOne[(from as Query).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 as Query).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 CreateSelf,\n Q extends Query,\n Many extends boolean,\n>(\n q: T,\n from: Q,\n many: Many,\n data?: Omit<CreateData<T, never>, 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\nexport const _queryCreate = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>,\n): CreateResult<T, BT> => {\n createSelect(q as unknown as Query);\n return _queryInsert(q, data) as never;\n};\n\nexport const _queryInsert = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>,\n): InsertResult<T, BT> => {\n const ctx = createCtx();\n const obj = handleOneData(q, data, ctx) as {\n columns: string[];\n values: InsertQueryData['values'];\n };\n\n const values = ((q as unknown as Query).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(q, obj, 'object') as never;\n};\n\nexport const _queryCreateMany = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>[],\n): CreateManyResult<T, BT> => {\n createSelect(q as unknown as Query);\n return _queryInsertMany(q, data as never) as never;\n};\n\nexport const _queryInsertMany = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>[],\n): InsertManyResult<T, BT> => {\n const ctx = createCtx();\n let result = insert(\n q,\n handleManyData(q, data, ctx),\n 'object',\n true,\n ) as InsertManyResult<T, BT>;\n if (!data.length)\n result = (result as Query).none() as InsertManyResult<T, BT>;\n return result;\n};\n\nexport const _queryCreateRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateRawData<T>>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as never;\n};\n\nexport const _queryInsertRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateRawData<T>>,\n): InsertRawOrFromResult<T> => {\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as never;\n};\n\nexport const _queryCreateManyRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateManyRawData<T>>,\n): CreateManyRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return _queryInsertManyRaw(q, args as never) as never;\n};\n\nexport const _queryInsertManyRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateManyRawData<T>>,\n): InsertManyRawOrFromResult<T> => {\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression[] },\n 'raw',\n true,\n ) as never;\n};\n\nexport const _queryCreateFrom = <\n T extends CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFromQuery(q, query, false, data as never) as never;\n};\n\nexport const _queryInsertFrom = <\n T extends CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n): InsertRawOrFromResult<T> => {\n return insertFromQuery(q, query, false, data as never) as never;\n};\n\nexport const _queryCreateManyFrom = <T extends CreateSelf>(\n q: T,\n query: Query,\n): CreateManyRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFromQuery(q, query, true) as never;\n};\n\nexport const _queryInsertManyFrom = <T extends CreateSelf>(\n q: T,\n query: Query,\n): InsertManyRawOrFromResult<T> => {\n return insertFromQuery(q, query, true) as never;\n};\n\nexport const _queryDefaults = <\n T extends CreateSelf,\n Data extends Partial<CreateData<T, CreateBelongsToData<T>>>,\n>(\n q: T,\n data: Data,\n): AddQueryDefaults<T, { [K in keyof Data]: true }> => {\n (q as unknown as Query).q.defaults = data;\n return q as never;\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 | 'insert'\n | 'createMany'\n | 'insertMany'\n | 'createRaw'\n | 'insertRaw'\n | 'createFrom'\n | 'insertFrom'\n | 'createManyFrom'\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 `.onConflictDoNothing()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflictDoNothing();\n *\n * await db.table.create({\n * // raw SQL\n * column1: (q) => q.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 * `create` and `insert` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // create a record in one table\n * .with('a', db.table.select('id').create(data))\n * // create a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').create({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n create<T extends CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>,\n ): CreateResult<T, BT> {\n return _queryCreate((this as unknown as Query).clone(), data) as never;\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 CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>,\n ): InsertResult<T, BT> {\n return _queryInsert((this as unknown as Query).clone(), data) as never;\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 * Because of a limitation of Postgres protocol, queries having more than **65535** of values are going to fail in runtime.\n * To solve this seamlessly, OrchidORM will automatically batch such queries, and wrap them into a transaction, unless they are already in a transaction.\n *\n * ```ts\n * // OK: executes 2 inserts wrapped into a transaction\n * await db.table.createMany(\n * Array.from({ length: 65536 }, () => ({ text: 'text' })),\n * );\n * ```\n *\n * However, this only works in the case shown above. This **won't** work if you're using the `createMany` in `with` statement,\n * or if the insert is used as a sub-query in other query part.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>[],\n ): CreateManyResult<T, BT> {\n return _queryCreateMany((this as unknown as Query).clone(), data) as never;\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 CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>[],\n ): InsertManyResult<T, BT> {\n return _queryInsertMany((this as unknown as Query).clone(), data) as never;\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: sql`'name', random()`,\n * });\n * ```\n *\n * @param args - object with columns list and raw SQL for values\n */\n createRaw<T extends CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateRawData<T>>\n ): CreateRawOrFromResult<T> {\n return _queryCreateRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateRawData<T>>\n ): InsertRawOrFromResult<T> {\n return _queryInsertRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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: [sql`'one', 2`, 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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateManyRawData<T>>\n ): CreateManyRawOrFromResult<T> {\n return _queryCreateManyRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateManyRawData<T>>\n ): InsertManyRawOrFromResult<T> {\n return _queryInsertManyRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n ): CreateRawOrFromResult<T> {\n return _queryCreateFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n data,\n );\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 CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n ): InsertRawOrFromResult<T> {\n return _queryInsertFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n data,\n );\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 CreateSelf>(\n this: T,\n query: Query,\n ): CreateManyRawOrFromResult<T> {\n return _queryCreateManyFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n );\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 CreateSelf>(\n this: T,\n query: Query,\n ): InsertManyRawOrFromResult<T> {\n return _queryInsertManyFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n );\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 {@link create} and {@link 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<\n T extends CreateSelf,\n Data extends Partial<CreateData<T, CreateBelongsToData<T>>>,\n >(this: T, data: Data): AddQueryDefaults<T, { [K in keyof Data]: true }> {\n return _queryDefaults(\n (this as unknown as Query).clone() as unknown as T,\n data,\n );\n }\n\n /**\n * By default, violating unique constraint will cause the creative query to throw,\n * you can define what to do on a conflict: to ignore it, or to merge the existing record with a new data.\n *\n * A conflict occurs when a table has a primary key or a unique index on a column,\n * or a composite primary key unique index on a set of columns,\n * and a row being created has the same value as a row that already exists in the table in this column(s).\n *\n * Use {@link onConflictDoNothing} to suppress the error and continue without updating the record,\n * or the `merge` to update the record with new values automatically,\n * or the `set` to specify own values for the update.\n *\n * `onConflict` only accepts column names that are defined in `primaryKey` or `unique` in the table definition.\n * To specify a constraint, its name also must be explicitly set in `primaryKey` or `unique` in the table code.\n *\n * Postgres has a limitation that a single `INSERT` query can have only a single `ON CONFLICT` clause that can target only a single unique constraint\n * for updating the record.\n *\n * If your table has multiple potential reasons for unique constraint violation, such as username and email columns in a user table,\n * consider using `upsert` instead.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflictDoNothing();\n *\n * // single column:\n * // (this requires a composite primary key or unique index, see below)\n * db.table.create(data).onConflict('email').merge();\n *\n * // array of columns:\n * db.table.create(data).onConflict(['email', 'name']).merge();\n *\n * // constraint name\n * db.table.create(data).onConflict({ constraint: 'unique_index_name' }).merge();\n *\n * // raw SQL expression:\n * db.table\n * .create(data)\n * .onConflict(sql`(email) where condition`)\n * .merge();\n * ```\n *\n * :::info\n * A primary key or a unique index for a **single** column can be fined on a column:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns((t) => ({\n * pkey: t.uuid().primaryKey(),\n * unique: t.string().unique(),\n * }));\n * }\n * ```\n *\n * But for composite primary keys or indexes (having multiple columns), define it in a separate function:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns(\n * (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * three: t.boolean(),\n * }),\n * (t) => [t.primaryKey(['one', 'two']), t.unique(['two', 'three'])],\n * );\n * }\n * ```\n * :::\n *\n * You can use the `sql` function exported from your `BaseTable` file 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(sql`(email) where active`)\n * .ignore();\n * ```\n *\n * For `merge` and `set`, you can append `where` to update data only for the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as Arg);\n }\n\n /**\n * Use `onConflictDoNothing` to suppress unique constraint violation error when creating a record.\n *\n * Adds `ON CONFLICT (columns) DO NOTHING` clause to the insert statement, columns are optional.\n *\n * Can also accept a constraint name.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * // on any conflict:\n * .onConflictDoNothing()\n * // or, for a specific column:\n * .onConflictDoNothing('email')\n * // or, for a specific constraint:\n * .onConflictDoNothing({ constraint: 'unique_index_name' });\n * ```\n *\n * When there is a conflict, nothing can be returned from the database, so `onConflictDoNothing` adds `| undefined` part to the response type.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflictDoNothing();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflictDoNothing();\n * ```\n *\n * When creating multiple records, only 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]).onConflictDoNothing();\n * ```\n */\n onConflictDoNothing<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): IgnoreResult<T> {\n const q = (this as unknown as Query).clone();\n (q.q as InsertQueryData).onConflict = {\n target: arg as never,\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 never;\n }\n}\n\nexport class OnConflictQueryBuilder<\n T extends CreateSelf,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(private query: T, private onConflict: Arg) {}\n\n /**\n * Available only after `onConflict`.\n *\n * Updates the record with a given data when conflict occurs.\n *\n * ```ts\n * db.table.create(data).onConflict('column').set({\n * description: 'setting different data on conflict',\n * });\n * ```\n *\n * The `set` can take a raw SQL expression:\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict()\n * .set(sql`raw SQL expression`);\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({ key: 'value' })\n * .where({ ...certainConditions });\n * ```\n *\n * @param set - object containing new column values, or raw SQL\n */\n set(set: Partial<T['inputType']> | Expression): T {\n ((this.query as unknown as Query).q as InsertQueryData).onConflict = {\n target: this.onConflict as never,\n set,\n };\n return this.query;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Use this method to merge all the data you have passed into `create` to update the existing record on conflict.\n *\n * If the table has columns with **dynamic** default values, such values will be applied as well.\n *\n * You can exclude certain columns from being merged by passing the `exclude` option.\n *\n * ```ts\n * // merge the full data\n * db.table.create(data).onConflict('email').merge();\n *\n * // merge only a single column\n * db.table.create(data).onConflict('email').merge('name');\n *\n * // merge multiple columns\n * db.table.create(data).onConflict('email').merge(['name', 'quantity']);\n *\n * // merge all columns except some\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge({ except: ['name', 'quantity'] });\n *\n * // merge can be applied also for batch creates\n * db.table.createMany([data1, data2, data2]).onConflict('email').merge();\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge()\n * .where({ ...certainConditions });\n * ```\n *\n * @param merge - no argument will merge all data, or provide a column(s) to merge, or provide `except` to update all except some.\n */\n merge(\n merge?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | { except: keyof T['shape'] | (keyof T['shape'])[] },\n ): T {\n ((this.query as unknown as Query).q as InsertQueryData).onConflict = {\n target: this.onConflict as never,\n merge: merge as OnConflictMerge,\n };\n return this.query;\n }\n}\n","import { Query, SetQueryKind, SetQueryReturnsRowCount } from '../query/query';\nimport { throwIfNoWhere } from '../query/queryUtils';\nimport { EmptyTuple, PickQueryMetaResult } from 'orchid-core';\n\nexport type DeleteMethodsNames = 'delete';\n\nexport type DeleteArgs<T extends PickQueryMetaResult> =\n T['meta']['hasWhere'] extends true ? EmptyTuple : [never];\n\nexport type DeleteResult<T extends PickQueryMetaResult> =\n T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'delete'>\n : SetQueryReturnsRowCount<T, 'delete'>;\n\nexport const _queryDelete = <T extends PickQueryMetaResult>(\n query: T,\n): DeleteResult<T> => {\n const q = (query as unknown as Query).q;\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(query as unknown as Query, 'delete');\n\n q.type = 'delete';\n return query as never;\n};\n\nexport class Delete {\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 * `delete` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // delete a record in one table\n * .with('a', db.table.find(1).select('id').delete())\n * // delete a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').whereIn('aId', q.from('a').pluck('id')).delete(),\n * )\n * .from('b');\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete<T extends PickQueryMetaResult>(\n this: T,\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete((this as unknown as Query).clone()) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { Expression, IsQuery } from 'orchid-core';\nimport { extendQuery } from '../query/queryUtils';\n\ntype ForQueryBuilder<Q> = Q & {\n noWait<T extends Q>(this: T): T;\n skipLocked<T extends Q>(this: T): T;\n};\n\nconst forMethods = {\n noWait() {\n const q = (this as unknown as Query).clone();\n const data = q.q as SelectQueryData | undefined;\n if (data?.for) data.for.mode = 'NO WAIT';\n return q as never;\n },\n skipLocked() {\n const q = (this as unknown as Query).clone();\n const data = q.q as SelectQueryData | undefined;\n if (data?.for) data.for.mode = 'SKIP LOCKED';\n return q as never;\n },\n};\n\n// Extends the query with `for` methods, the query is cloned, and sets `for` data.\nconst forQueryBuilder = <T>(\n arg: T,\n type: Exclude<SelectQueryData['for'], undefined>['type'],\n tableNames?: string[] | Expression,\n): ForQueryBuilder<T> => {\n const q = extendQuery(arg as Query, forMethods);\n\n (q.q as SelectQueryData).for = {\n type,\n tableNames,\n };\n\n return q as never;\n};\n\nexport class For {\n forUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'UPDATE', tableNames);\n }\n\n forNoKeyUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'NO KEY UPDATE', tableNames);\n }\n\n forShare<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'SHARE', tableNames);\n }\n\n forKeyShare<T extends IsQuery>(\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 {\n GetArg,\n GetResult,\n GetResultOptional,\n _queryGet,\n _queryGetOptional,\n QueryGetSelf,\n} from './get.utils';\n\nexport class QueryGet {\n /**\n * `.get` returns a single value, adds `LIMIT 1` to the query, and accepts a column name or a raw SQL expression.\n *\n * `get` throws a `NotFoundError` when not found, and `getOptional` returns `undefined`.\n *\n * ```ts\n * import { NumberColumn } from 'orchid-orm';\n * import { sql } from './baseTable';\n *\n * const firstName: string = await db.table.get('name');\n *\n * const rawResult: number = await db.table.get(sql((t) => t.integer())`1 + 1`);\n *\n * const firstNameOptional: string | undefined = await db.table.getOptional(\n * 'name',\n * );\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n get<T extends QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return _queryGet((this as unknown as Query).clone(), arg) as never;\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 QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return _queryGetOptional((this as unknown as Query).clone(), arg) as never;\n }\n}\n","import { PickQueryQ, Query } from '../query/query';\nimport { FnUnknownToUnknown, SQLQueryArgs } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\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> = (q: T) => {\n result: { value: { outputType: boolean } };\n};\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 * 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: HavingArgFn<T>[]): T {\n const q = this.clone();\n return pushQueryValue(\n q,\n 'having',\n args.map((arg) => ((arg as FnUnknownToUnknown)(q) as PickQueryQ).q.expr),\n );\n }\n\n /**\n * Provide SQL expression for the `HAVING` SQL statement:\n *\n * ```ts\n * db.table.havingSql`count(*) >= ${10}`;\n * ```\n *\n * @param args - SQL expression\n */\n havingSql<T extends Query>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValue(this.clone(), 'having', args);\n }\n}\n","import { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { PickQueryShape, QueryColumns } from 'orchid-core';\nimport { QueryAfterHook, QueryBeforeHook } from '../sql';\nimport { PickQueryQ, Query } from '../query/query';\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 QueryColumns,\n> = QueryAfterHook<\n {\n [K in keyof Select[number]]: K extends keyof Shape\n ? Shape[K]['outputType']\n : never;\n }[]\n>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelect<T extends PickQueryShape> = (keyof T['shape'] &\n string)[];\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>(q: T, key: HookAction, cb: QueryBeforeHook): T =>\n pushQueryValue(q as PickQueryQ, `before${key}`, cb) as never;\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends PickQueryShape, 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 as never, `after${key}${commit ? 'Commit' : ''}`, cb),\n `after${key}Select`,\n select,\n );\n\nexport const _queryHookBeforeQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return pushQueryValue(q as never, 'before', cb);\n};\n\nexport const _queryHookAfterQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryAfterHook,\n): T => {\n return pushQueryValue(q as never, 'after', cb);\n};\n\nexport const _queryHookBeforeCreate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Create', cb);\n};\n\nexport const _queryHookAfterCreate = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb);\n};\n\nexport const _queryHookAfterCreateCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb, true);\n};\n\nexport const _queryHookBeforeUpdate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Update', cb);\n};\n\nexport const _queryHookAfterUpdate = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb);\n};\n\nexport const _queryHookAfterUpdateCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb, true);\n};\n\nexport const _queryHookBeforeSave = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(before(q, 'Create', cb), 'Update', cb);\n};\n\nexport const _queryHookAfterSave = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(after(q, 'Create', select, cb), 'Update', select, cb);\n};\n\nexport const _queryAfterSaveCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(\n after(q, 'Create', select, cb, true),\n 'Update',\n select,\n cb,\n true,\n );\n};\n\nexport const _queryHookBeforeDelete = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Delete', cb);\n};\n\nexport const _queryHookAfterDelete = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb);\n};\n\nexport const _queryHookAfterDeleteCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb, true);\n};\n\nexport abstract class QueryHooks {\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeQuery((this as Query).clone(), cb) as T;\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>(this: T, cb: QueryAfterHook): T {\n return _queryHookAfterQuery((this as Query).clone(), cb) as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeCreate((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreate(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreateCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeUpdate((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdate(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdateCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeSave((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterSave(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryAfterSaveCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeDelete((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDelete(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDeleteCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\n }\n}\n","import {\n GetQueryResult,\n PickQueryMetaResultRelationsWithDataReturnType,\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryMetaShapeRelationsWithData,\n PickQueryMetaWithData,\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQueryWithData,\n Query,\n SelectableFromShape,\n WithDataItem,\n} from '../../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport {\n EmptyTuple,\n Expression,\n PickQueryMeta,\n PickQueryMetaResultReturnType,\n PickQueryMetaShape,\n PickQueryTable,\n PickQueryTableMetaResult,\n PickQueryTableMetaResultShape,\n QueryColumns,\n QueryColumnToNullable,\n QueryMetaBase,\n QueryThen,\n SelectableBase,\n} from 'orchid-core';\nimport { _join, _joinLateral } from './_join';\nimport { AliasOrTable } from '../../common/utils';\nimport {\n ColumnsShapeToNullableObject,\n ColumnsShapeToObject,\n} from '../../columns';\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 PickQueryWithData,\n W extends keyof T['withData'],\n> = T['withData'][W] extends WithDataItem\n ?\n | keyof T['withData'][W]['shape']\n | `${T['withData'][W]['table']}.${keyof T['withData'][W]['shape'] &\n string}`\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 PickQueryRelationsWithData> =\n | PickQueryTableMetaResult\n | keyof T['relations']\n | keyof T['withData']\n | ((q: T['relations']) => PickQueryTableMetaResult);\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> =\n | [on?: JoinCallback<T, Arg>]\n | (Arg extends PickQueryTableMetaResult\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 PickQueryTableMetaResult> =\n | keyof Q['result']\n | `${AliasOrTable<Q>}.${keyof Q['result'] & string}`;\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<\n T extends PickQueryMeta,\n Q extends PickQueryTableMetaResult,\n> =\n | [\n conditions:\n | {\n [K in JoinSelectable<Q>]:\n | keyof T['meta']['selectable']\n | Expression;\n }\n | Expression\n | true,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n rightColumn: keyof T['meta']['selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n op: string,\n rightColumn: keyof T['meta']['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<\n T extends PickQueryMetaWithData,\n W extends keyof T['withData'],\n> =\n | [\n conditions:\n | {\n [K in WithSelectable<T, W>]:\n | keyof T['meta']['selectable']\n | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n rightColumn: keyof T['meta']['selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n op: string,\n rightColumn: keyof T['meta']['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 PickQueryMetaResultReturnType,\n R extends PickQueryTableMetaResult,\n RequireJoined,\n RequireMain,\n> = RequireMain extends true\n ? JoinAddSelectable<\n T,\n JoinResultSelectable<R['result'], AliasOrTable<R>, RequireJoined>\n >\n : JoinOptionalMain<\n T,\n JoinResultSelectable<R['result'], AliasOrTable<R>, RequireJoined>\n >;\n\n/**\n * Calls {@link JoinResult} with either callback result, if join has a callback,\n * or with a query derived from the first join argument.\n */\ntype JoinResultFromArgs<\n T extends PickQueryMetaResultRelationsWithDataReturnType,\n Arg,\n Args,\n RequireJoined,\n RequireMain,\n> = JoinResult<\n T,\n Args extends GenericJoinCallbackTuple\n ? ReturnType<Args[0]>\n : Arg extends PickQueryTableMetaResultShape\n ? Arg['meta']['hasSelect'] extends true\n ? // If joined query has select, computed values won't be available, use `result` as is\n Arg\n : // If no select, allow using computed values by setting result to shape\n { table: Arg['table']; meta: Arg['meta']; result: Arg['shape'] }\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['query']\n : Arg extends GenericJoinCallback\n ? ReturnType<Arg>\n : Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? {\n table: T['withData'][Arg]['table'];\n meta: QueryMetaBase;\n result: T['withData'][Arg]['shape'];\n }\n : never\n : never,\n RequireJoined,\n RequireMain\n>;\n\ntype GenericJoinCallback = (q: never) => PickQueryTableMetaResult;\ntype GenericJoinCallbackTuple = [GenericJoinCallback];\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 PickQueryMeta,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n RequireJoined,\n> = JoinAddSelectable<\n T,\n JoinResultSelectable<\n Result,\n Meta['as'] extends string ? Meta['as'] : Table,\n RequireJoined\n >\n>;\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 // Interestingly, accepting T and inlining T['result'] adds a LOT (~823k) instantiations\n Result extends QueryColumns,\n As extends string,\n RequireJoined,\n> = (RequireJoined extends true\n ? {\n [K in keyof Result & string as `${As}.${K}`]: {\n as: K;\n column: Result[K];\n };\n }\n : {\n [K in keyof Result & string as `${As}.${K}`]: {\n as: K;\n column: QueryColumnToNullable<Result[K]>;\n };\n }) & {\n [K in As as `${As}.*`]: {\n as: K;\n column: RequireJoined extends true\n ? ColumnsShapeToObject<Result>\n : ColumnsShapeToNullableObject<Result>;\n };\n};\n\n// Replace the 'selectable' of the query with the given selectable.\ntype JoinAddSelectable<T extends PickQueryMeta, Selectable> = {\n // is optimal\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? T['meta']['selectable'] & Selectable\n : T['meta'][K];\n }\n : 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 PickQueryMetaResultReturnType,\n Selectable extends SelectableBase,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? {\n [K in keyof T['meta']['selectable']]: {\n as: T['meta']['selectable'][K]['as'];\n column: QueryColumnToNullable<\n T['meta']['selectable'][K]['column']\n >;\n };\n } & Selectable // & is optimal\n : T['meta'][K];\n }\n : K extends 'result'\n ? // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: QueryColumnToNullable<T['result'][K]>;\n }\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: QueryColumnToNullable<T['result'][K]>;\n }\n >\n >\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 */\ninterface JoinWithArgToQuery<With extends WithDataItem> extends Query {\n table: With['table'];\n meta: QueryMetaBase & {\n selectable: {\n [K in keyof With['shape'] & string as `${With['table']}.${K}`]: {\n as: K;\n column: With['shape'][K];\n };\n };\n };\n result: With['shape'];\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 PickQueryRelationsWithData,\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 PickQueryTableMetaResult\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['query']\n : Arg extends JoinArgToQueryCallback\n ? ReturnType<Arg>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JoinArgToQueryCallback = (...args: any[]) => PickQueryTableMetaResult;\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<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> = (\n q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>,\n) => PickQueryTableMetaResult;\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 PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n> = (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n table: Table;\n meta: Meta;\n result: Result;\n};\n\n/**\n * Type of {@link Join.join} query method.\n */\nexport type JoinQueryMethod = <\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n>(\n this: T,\n arg: Arg,\n ...args: Args\n) => JoinResultFromArgs<T, Arg, Args, true, true>;\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, filter and 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 * .where({ commentsCount: { gt: 10 } })\n * .order({ commentsCount: 'DESC' });\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 * When joining the same table with the same condition more than once, duplicated joins will be ignored:\n *\n * ```ts\n * // joining a relation\n * db.post.join('comments').join('comments');\n *\n * // joining a table with a condition\n * db.post\n * .join('comments', 'comments.postId', 'post.id')\n * .join('comments', 'comments.postId', 'post.id');\n * ```\n *\n * Both queries will produce SQL with only 1 join\n *\n * ```sql\n * SELECT * FROM post JOIN comments ON comments.postId = post.id\n * ```\n *\n * However, this is only possible if the join has no dynamic values:\n *\n * ```ts\n * db.post\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }))\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }));\n * ```\n *\n * Both joins above have the same `{ gt: 5 }`, but still, the `5` is a dynamic value and in this case joins will be duplicated,\n * resulting in a database error.\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 relevant `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 * // `sql` can be imported from your `BaseTable` file\n * 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 * sql`lower(\"message\".\"text\")`,\n * sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * '!=',\n * 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: 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 * 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 * ## implicit join lateral\n *\n * `JOIN`'s source expression that comes before `ON` cannot access other tables, but in some cases this may be needed.\n *\n * For example, let's consider joining last 10 messages of a user:\n *\n * ```ts\n * await db.user.join('messages', (q) => q.order({ createdAt: 'DESC' }).limit(10));\n * ```\n *\n * When the `join`'s callback returns a more complex query than the one that simply applies certain conditions,\n * it will implicitly generate a `JOIN LATERAL` SQL query, as the following:\n *\n * ```sql\n * SELECT *\n * FROM \"user\"\n * JOIN LATERAL (\n * SELECT *\n * FROM \"message\" AS \"messages\"\n * WHERE \"message\".\"userId\" = \"user\".\"id\"\n * ORDER BY \"message\".\"createdAt\" DESC\n * LIMIT 10\n * ) \"messages\" ON true\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, true, true> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n true,\n 'JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, false, true> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n false,\n 'LEFT JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, true, false> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n true,\n 'RIGHT JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, false, false> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n false,\n 'FULL JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 * 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 * Note that the regular `join` will also generate `JOIN LATERAL` SQL expression when the query returned from callback is complex enough (see the bottom of {@link join} description).\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n ): JoinLateralResult<T, Table, Meta, Result, true> {\n return _joinLateral<T, Arg, Table, Meta, Result, true>(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n 'JOIN',\n arg,\n cb,\n );\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n ): JoinLateralResult<T, Table, Meta, Result, false> {\n return _joinLateral<T, Arg, Table, Meta, Result, false>(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n 'LEFT JOIN',\n arg,\n cb,\n );\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<S extends SelectableBase> =\n | [leftColumn: keyof S, rightColumn: keyof S]\n | [leftColumn: keyof S, op: string, rightColumn: keyof S];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: PickQueryMeta,\n joinFrom: PickQueryMeta,\n args: OnArgs<SelectableBase>,\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 PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...on: OnArgs<SelectableBase>\n): T => {\n return pushQueryValue(\n q as unknown as PickQueryQ,\n 'and',\n makeOnItem(joinFrom, joinTo, on),\n ) as unknown as T;\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn = <T extends PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...on: OnArgs<SelectableBase>\n) => {\n return pushQueryValue(q as unknown as PickQueryQ, 'or', [\n makeOnItem(joinFrom, joinTo, on),\n ]);\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 PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...args: OnArgs<SelectableBase>\n): T => {\n const cloned = (q as unknown as Query).clone() as unknown;\n setQueryObjectValue(\n cloned as PickQueryQ,\n 'joinedShapes',\n ((joinFrom as unknown as PickQueryQ).q.as ||\n (joinFrom as PickQueryTable).table) as string,\n (joinFrom as unknown as PickQueryQ).q.shape,\n );\n return pushQueryOn(cloned as PickQueryMeta, joinFrom, joinTo, ...args) as T;\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<S extends SelectableBase> = [\n leftColumn: keyof S,\n leftPath: string,\n rightColumn: keyof S,\n rightPath: string,\n];\n\n/**\n * Mutative {@link OnMethods.on}\n */\nexport const _queryJoinOn = <T extends PickQueryMeta>(\n q: T,\n args: OnArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQueryMeta,\n q,\n ...args,\n );\n};\n\n/**\n * Mutative {@link OnMethods.orOn}\n */\nexport const _queryJoinOrOn = <T extends PickQueryMeta>(\n q: T,\n args: OnArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryOrOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQueryMeta,\n q,\n ...args,\n ) as unknown as T;\n};\n\n/**\n * Mutative {@link OnMethods.onJsonPathEquals}\n */\nexport const _queryJoinOnJsonPathEquals = <T extends PickQueryMeta>(\n q: T,\n args: OnJsonPathEqualsArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryValue(q as unknown as PickQueryQ, 'and', {\n ON: args,\n }) as unknown as T;\n};\n\n/**\n * Argument of join callback.\n * It is a query object of table that you're joining, with ability to select main table's columns.\n * Adds {@link OnMethods.on} method and similar to the query.\n */\nexport type JoinQueryBuilder<\n T extends PickQueryMetaShape = PickQueryMetaShape,\n J extends PickQueryTableMetaResult = PickQueryTableMetaResult,\n> = {\n [K in keyof J]: K extends 'meta'\n ? {\n [K in keyof J['meta']]: K extends 'selectable'\n ? SelectableFromShape<J['result'], AliasOrTable<J>> &\n Omit<T['meta']['selectable'], keyof T['shape']>\n : J['meta'][K];\n }\n : J[K];\n} & OnMethods;\n\nexport class OnMethods {\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 PickQueryMeta>(\n this: T,\n ...args: OnArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOn((this as any).clone(), 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 PickQueryMeta>(\n this: T,\n ...args: OnArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOrOn((this as any).clone(), 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 PickQueryMeta>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOnJsonPathEquals((this as any).clone(), args);\n }\n}\n","import { Query, SetQueryReturnsColumnOptional } from '../query/query';\nimport { QueryColumn } from 'orchid-core';\nimport { queryJson } from './json.utils';\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>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, QueryColumn<string>> {\n return queryJson((this as unknown as Query).clone(), coalesce) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { quote } from '../quote';\nimport { SingleSql } from 'orchid-core';\n\nexport interface QueryLogObject {\n colors: boolean;\n beforeQuery(sql: SingleSql): unknown;\n afterQuery(sql: SingleSql, logData: unknown): void;\n onError(error: Error, sql: SingleSql, logData: unknown): void;\n}\n\nexport interface QueryLogger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface 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>(this: T, log = true): T {\n const q = (this as Query).clone();\n q.q.log = logParamToLogObject(q.q.logger, log);\n return q as T;\n }\n}\n","import {\n Query,\n GetQueryResult,\n PickQueryMetaResultReturnTypeWithDataWindows,\n} from '../query/query';\nimport { SelectQueryData, UnionSet } from '../sql';\nimport {\n getValueKey,\n MergeObjects,\n PickQueryMetaResult,\n QueryReturnType,\n QueryThen,\n RecordBoolean,\n RecordUnknown,\n} from 'orchid-core';\n\nexport type MergeQuery<\n T extends PickQueryMetaResultReturnTypeWithDataWindows,\n Q extends PickQueryMetaResultReturnTypeWithDataWindows,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta'] | keyof Q['meta']]: K extends 'selectable'\n ? MergeObjects<T['meta']['selectable'], Q['meta']['selectable']>\n : K extends keyof Q['meta']\n ? Q['meta'][K]\n : T['meta'][K];\n }\n : K extends 'result'\n ? MergeQueryResult<T, Q>\n : K extends 'returnType'\n ? QueryReturnType extends Q['returnType']\n ? T['returnType']\n : Q['returnType']\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n QueryReturnType extends Q['returnType'] ? T : Q,\n MergeQueryResult<T, Q>\n >\n >\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\ntype MergeQueryResult<\n T extends PickQueryMetaResult,\n Q extends PickQueryMetaResult,\n> = 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\nconst mergableObjects: RecordBoolean = {\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 const query = this.clone();\n const a = query.q as never as RecordUnknown;\n const b = q.q as never as RecordUnknown;\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 RecordUnknown), ...value }\n : value;\n } else if (key === 'union') {\n a[key] = a[key]\n ? {\n b: (a[key] as UnionSet).b,\n u: [...(a[key] as UnionSet).u, ...(value as UnionSet).u],\n }\n : value;\n } else {\n a[key] = value;\n }\n break;\n }\n }\n\n (a as never as SelectQueryData)[getValueKey] = (\n b as never as SelectQueryData\n )[getValueKey];\n\n if (b.returnType) a.returnType = b.returnType;\n\n return query as never;\n }\n}\n","import { Expression, PickQueryResult } from 'orchid-core';\nimport { Query } from '../query/query';\nimport { SelectQueryData, UnionItem, UnionKind } from '../sql';\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 UnionArgs<T extends PickQueryResult> = (\n | {\n result: {\n [K in keyof T['result']]: {\n queryType: T['result'][K]['queryType'];\n };\n };\n }\n | ((q: T) => Expression)\n)[];\n\nexport const _queryUnion = <T extends Query>(\n base: T,\n args: UnionArgs<T>,\n k: UnionKind,\n): T => {\n const q = base.baseQuery.clone();\n\n const u = args.map(\n (a) =>\n ({\n a: typeof a === 'function' ? a(q as never) : a,\n k,\n } as UnionItem),\n );\n\n const union = ((q.q as SelectQueryData).union = (\n base.q as SelectQueryData\n ).union);\n\n if (union) {\n union.u.push(...u);\n } else {\n (q.q as SelectQueryData).union = {\n b: base,\n u,\n };\n }\n\n return q as never;\n};\n\nexport class Union {\n /**\n * Creates a union query, takes one or more queries or SQL expressions.\n *\n * ```ts\n * // The first query of the union\n * db.one\n * .select('id', 'name')\n * // add two more queries to the union\n * .union(\n * db.two.select('id', 'name'),\n * (q = q.sql`SELECT id, name FROM \"thirdTable\"`),\n * )\n * // sub-sequent `union` is equivalent to passing multiple queries into a single `union`\n * .union(db.three.select('id', 'name'));\n * ```\n *\n * `order`, `limit`, `offset` are special, it matters if you place them **before** or **after** the `union`, it also have a meaning to place them before and after.\n *\n * ```ts\n * // order, limit, offset are applied ONLY to 'one'\n * db.one\n * .order('x')\n * .limit(1)\n * .offset(1)\n * // 'two' also has order, limit, and offset\n * .unionAll(db.two.order('y').limit(2).offset(2))\n * // sets order, limit, offset for all records\n * .order('z')\n * .limit(3)\n * .offset(3);\n * ```\n *\n * Equivalent SQL:\n *\n * ```sql\n * -- both union parts have their own order, limit, offset\n * ( SELECT * FROM one ORDER x ASC LIMIT 1 OFFSET 1 )\n * UNION ALL\n * ( SELECT * FROM two ORDER y ASC LIMIT 2 OFFSET 2 )\n * -- order, limit, offset of the whole query\n * ORDER BY z ASC LIMIT 3 OFFSET 3\n * ```\n *\n * All the listed methods have the same signature, they are only different by SQL keyword:\n *\n * - `union` - union of all queries, performs deduplication\n * - `unionAll` - `union` that allows duplicated rows\n * - `intersect` - get only rows that are present in all queries\n * - `intersectAll` - `intersect` that allows duplicated rows\n * - `except` - get only rows that are in the first query but not in the second\n * - `exceptAll` - `except` that allows duplicated rows\n *\n * @param args - array of queries or SQL expressions\n */\n union<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'UNION',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n unionAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'UNION ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses a `INTERSECT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n intersect<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'INTERSECT',\n ) as never;\n }\n\n /**\n * Same as {@link intersect}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n intersectAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'INTERSECT ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses an `EXCEPT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n except<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'EXCEPT',\n ) as never;\n }\n\n /**\n * Same as {@link except}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n exceptAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'EXCEPT ALL',\n ) as never;\n }\n}\n","import { WithOptions } from '../sql';\nimport {\n PickQueryMetaWithDataColumnTypes,\n PickQueryWithDataColumnTypes,\n Query,\n} from '../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../query/queryUtils';\nimport {\n Expression,\n ColumnsShapeBase,\n EmptyObject,\n PickQueryResult,\n QueryColumns,\n} from 'orchid-core';\nimport { SqlMethod } from './sql';\nimport { getShapeFromSelect } from './select';\nimport { _queryUnion } from './union';\n\n// `with` method options\n// - `columns`: true to get all columns from the query, or array of column names\n// - `materialized`, `notMaterialized`: adds corresponding SQL keyword\nexport interface WithArgsOptions {\n columns?: string[] | boolean;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface WithRecursiveOptions extends WithArgsOptions {\n union?:\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n}\n\nexport interface WithQueryBuilder<T extends PickQueryWithDataColumnTypes>\n extends Query {\n sql: SqlMethod<T['columnTypes']>['sql'];\n relations: EmptyObject;\n withData: T['withData'];\n}\n\n// Adds a `withData` entry to a query\nexport type WithResult<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n> = {\n [K in keyof T]: K extends 'meta'\n ? { [K in keyof T['meta']]: K extends 'kind' ? 'select' : T['meta'][K] }\n : K extends 'withData'\n ? {\n [K in keyof T['withData'] | Name]: K extends Name\n ? {\n table: Name;\n shape: Q['result'];\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nexport type WithSqlResult<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'withData'\n ? {\n [K in Name | keyof T['withData']]: K extends Name\n ? {\n table: Name;\n shape: Shape;\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nexport class WithMethods {\n /**\n * Add Common Table Expression (CTE) to the query.\n *\n * ```ts\n * import { columnTypes } from 'orchid-orm';\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 * 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: sql`1`.type((t) => t.integer()) }),\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 with<T extends PickQueryMetaWithDataColumnTypes, Name extends string, Q>(\n this: T,\n name: Name,\n query: Q | ((q: WithQueryBuilder<T>) => Q),\n ): WithResult<T, Name, Q extends Query ? Q : never>;\n with<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n >(\n this: T,\n name: Name,\n options: WithArgsOptions,\n query: Q | ((q: WithQueryBuilder<T>) => Q),\n ): WithResult<T, Name, Q>;\n with(\n name: string,\n second:\n | WithArgsOptions\n | Query\n | ((q: WithQueryBuilder<PickQueryWithDataColumnTypes>) => Query),\n third?:\n | Query\n | ((q: WithQueryBuilder<PickQueryWithDataColumnTypes>) => Query),\n ) {\n const q = (this as unknown as Query).clone();\n\n // eslint-disable-next-line prefer-const\n let [options, queryArg] = third\n ? [second as WithArgsOptions, third]\n : [undefined, second];\n\n let query: Query;\n if (typeof queryArg === 'function') {\n const arg = q.queryBuilder.clone();\n arg.q.withShapes = q.q.withShapes;\n query = queryArg(arg);\n } else {\n query = queryArg as Query;\n }\n\n if (options?.columns === true) {\n options = {\n ...options,\n columns: Object.keys(query.shape),\n };\n }\n\n pushQueryValue(q, 'with', { n: name, o: options, q: query });\n\n const shape = getShapeFromSelect(query, true);\n\n return setQueryObjectValue(q, 'withShapes', name, shape);\n }\n\n withRecursive<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n Result = WithResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n base: Q | ((qb: WithQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => Query,\n ): Result;\n withRecursive<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n Result = WithResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n options: WithRecursiveOptions,\n base: Q | ((qb: WithQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => Query,\n ): Result;\n withRecursive(name: string, ...args: unknown[]) {\n const q = (this as unknown as Query).clone();\n\n // eslint-disable-next-line prefer-const\n let [options, baseFn, recursiveFn] = (\n args.length === 2 ? [{}, args[0], args[1]] : args\n ) as [\n options: WithRecursiveOptions,\n base: Query | ((q: unknown) => Query),\n recursive: (q: unknown) => Query,\n ];\n\n const arg = q.queryBuilder.clone();\n arg.q.withShapes = q.q.withShapes;\n let query = typeof baseFn === 'function' ? baseFn(arg) : baseFn;\n const shape = ((arg.q.withShapes ??= {})[name] = getShapeFromSelect(\n query,\n true,\n ) as ColumnsShapeBase);\n const recursive = recursiveFn(arg);\n\n query = _queryUnion(query, [recursive], options.union ?? 'UNION ALL');\n\n (options as WithOptions).recursive = true;\n\n if (options.columns === true) {\n options = {\n ...options,\n columns: Object.keys(shape),\n };\n }\n\n pushQueryValue(q, 'with', { n: name, o: options, q: query });\n\n return setQueryObjectValue(q, 'withShapes', name, shape);\n }\n\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends ColumnsShapeBase,\n >(\n this: T,\n name: Name,\n options: WithOptions,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): WithSqlResult<T, Name, Shape>;\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends ColumnsShapeBase,\n >(\n this: T,\n name: Name,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): WithSqlResult<T, Name, Shape>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n withSql(this: PickQueryWithDataColumnTypes, name: string, ...args: any[]) {\n const q = (this as unknown as Query).clone();\n\n const [options, shape, sql] =\n args.length === 2 ? [undefined, args[0], args[1]] : args;\n\n pushQueryValue(q, 'with', {\n n: name,\n o: options,\n s: sql(q),\n });\n\n return setQueryObjectValue(\n q,\n 'withShapes',\n name,\n shape(this.columnTypes),\n ) as never;\n }\n}\n","import {\n PickQueryMetaRelations,\n PickQueryMetaShapeRelationsWithData,\n PickQueryRelations,\n Query,\n QueryOrExpression,\n QueryOrExpressionBooleanOrNullResult,\n} from '../../query/query';\nimport { ColumnOperators } from '../../sql';\nimport { pushQueryArray, pushQueryValue } from '../../query/queryUtils';\nimport { JoinArgs, JoinFirstArg } from '../join/join';\nimport {\n ColumnsShapeBase,\n Expression,\n MaybeArray,\n PickQueryMeta,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { QueryBase } from '../../query/queryBase';\nimport { sqlQueryArgsToExpression } from '../../sql/rawSql';\nimport { RelationsBase } from '../../relations';\nimport { processJoinArgs } from '../join/processJoinArgs';\nimport { ExpressionMethods } from '../expressions';\nimport { _queryNone } from '../none';\nimport {\n getClonedQueryData,\n resolveSubQueryCallback,\n} from '../../common/utils';\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 PickQueryMetaRelations> =\n | {\n [K in\n | keyof T['meta']['selectable']\n | 'NOT'\n | 'OR'\n | 'IN']?: K extends 'NOT'\n ? WhereArg<T> | WhereArgs<T>\n : K extends 'OR'\n ? (WhereArg<T> | WhereArgs<T>)[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['meta']['selectable'])[];\n values: unknown[][] | QueryBase | Expression;\n }>\n :\n | T['meta']['selectable'][K]['column']['queryType']\n | null\n | ColumnOperators<T['meta']['selectable'], K>\n | QueryOrExpression<\n T['meta']['selectable'][K]['column']['queryType'] | null\n >\n | ((\n q: T,\n ) => QueryOrExpression<\n T['meta']['selectable'][K]['column']['queryType'] | null\n >);\n }\n | QueryOrExpressionBooleanOrNullResult\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryOrExpressionBooleanOrNullResult | WhereQueryBuilder<T>);\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 PickQueryRelations> =\n RelationsBase extends T['relations']\n ? {\n [K in keyof T]: K extends\n | keyof QueryBase\n | keyof Where\n | keyof ExpressionMethods\n | 'sql'\n | 'get'\n | 'ref'\n ? T[K]\n : never;\n }\n : {\n [K in keyof T]: K extends keyof T['relations']\n ? T['relations'][K]\n : K extends\n | keyof QueryBase\n | keyof Where\n | keyof ExpressionMethods\n | 'sql'\n | 'get'\n | 'ref'\n ? T[K]\n : never;\n };\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends PickQueryMetaRelations> = WhereArg<T>[];\n\nexport type WhereNotArgs<T extends PickQueryMetaRelations> = [WhereArg<T>];\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends PickQueryMetaRelations> =\n | keyof T['meta']['selectable']\n | [keyof T['meta']['selectable'], ...(keyof T['meta']['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 PickQueryMetaRelations,\n Column,\n> = Column extends keyof T['meta']['selectable']\n ?\n | T['meta']['selectable'][Column]['column']['queryType'][]\n | Query\n | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['meta']['selectable']\n ? T['meta']['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 PickQueryMeta> = {\n [K in keyof T['meta']['selectable']]?:\n | T['meta']['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> = T & QueryMetaHasWhere;\n\nexport interface QueryMetaHasWhere {\n meta: {\n hasWhere: true;\n };\n}\n\nconst resolveCallbacksInArgs = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n) => {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === 'function') {\n const qb = Object.create(q);\n qb.q = getClonedQueryData((q as unknown as Query).q);\n qb.q.and = qb.q.or = qb.q.scopes = undefined;\n qb.q.subQuery = 1;\n\n args[i] = resolveSubQueryCallback(qb, arg as never) as never;\n }\n }\n};\n\n/**\n * Mutative {@link Where.where}\n */\nexport const _queryWhere = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'and',\n args,\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereSql}\n */\nexport const _queryWhereSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValue(\n q as unknown as Query,\n 'and',\n sqlQueryArgsToExpression(args),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereNot}\n */\nexport const _queryWhereNot = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereNotArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValue(q as unknown as Query, 'and', {\n NOT: args,\n }) as never;\n};\n\n/**\n * Mutative {@link Where.whereNotSql}\n */\nexport const _queryWhereNotSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValue(q as unknown as Query, 'and', {\n NOT: sqlQueryArgsToExpression(args),\n }) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.orWhere}\n */\nexport const _queryOr = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'or',\n args.map((item) => [item]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.orWhereNot}\n */\nexport const _queryOrNot = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'or',\n args.map((item) => {\n return [{ NOT: item }];\n }),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereIn}\n */\nexport const _queryWhereIn = <T>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | unknown[][] | Query | Expression | undefined,\n not?: boolean,\n): WhereResult<T> => {\n let item;\n if (values) {\n if ('length' in values && !values.length) {\n return _queryNone(q) as WhereResult<T>;\n }\n\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n } else {\n item = { [arg as string]: { in: values } };\n }\n } else {\n item = {} as { [K: string]: { in: unknown[] } };\n for (const key in arg as { [K: string]: unknown[] }) {\n const values = (arg as { [K: string]: unknown[] })[key];\n if ('length' in values && !values.length) {\n return _queryNone(q) as WhereResult<T>;\n }\n\n item[key] = { in: values };\n }\n }\n\n if (not) item = { NOT: item };\n\n if (and) {\n pushQueryValue(q as unknown as Query, 'and', item);\n } else {\n pushQueryValue(q as unknown as Query, 'or', [item]);\n }\n\n return q as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereExists`.\n */\nconst existsArgs = (\n self: Query,\n q: JoinFirstArg<Query>,\n args: JoinArgs<Query, Query>,\n) => {\n let joinSubQuery;\n if (typeof q === 'object') {\n joinSubQuery = getIsJoinSubQuery(q as Query);\n if (joinSubQuery) {\n q = (q as Query).clone();\n (q as Query).shape = getShapeFromSelect(\n q as Query,\n true,\n ) as ColumnsShapeBase;\n }\n } else {\n joinSubQuery = false;\n }\n\n const joinArgs = processJoinArgs(self, q, args as never, joinSubQuery);\n\n return [\n {\n EXISTS: joinArgs,\n },\n ] as never;\n};\n\n/**\n * Mutative {@link Where.whereExists}\n */\nexport const _queryWhereExists = <\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n>(\n q: T,\n arg: Arg,\n args: JoinArgs<T, Arg>,\n): WhereResult<T> => {\n return _queryWhere(\n q,\n existsArgs(q as unknown as Query, arg as never, args as never),\n ) as never;\n};\n\nexport 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 * // import `sql` from your `BaseTable`\n * column: sql`sql expression`,\n * // or use `(q) => q.sql` for the same\n * column2: (q) => q.sql`sql expression`,\n *\n * // reference other columns in such a way:\n * firstName: (q) => q.ref('lastName'),\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(sql`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 * 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 * 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: 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(), 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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryWhere(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * Use a custom SQL expression in `WHERE` statement:\n *\n * ```ts\n * db.table.whereSql`a = b`;\n * ```\n *\n * @param args - SQL expression\n */\n whereSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereSql(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * `whereNot` takes the same argument as `where`,\n * multiple conditions are combined with `AND`,\n * the whole group of conditions is negated with `NOT`.\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * // WHERE NOT color = 'red'\n * db.table.whereNot({ one: 1, two: 2 });\n * // WHERE NOT (one = 1 AND two = 2)\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends PickQueryMetaRelations>(\n this: T,\n ...args: WhereNotArgs<T>\n ): WhereResult<T> {\n return _queryWhereNot(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * `whereNotSql` is a version of `whereNot` accepting SQL expression:\n *\n * ```ts\n * db.table.whereNotSql`sql expression`\n * ```\n *\n * @param args - SQL expression\n */\n whereNotSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereNotSql((this as unknown as Query).clone(), args) as never;\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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryOr((this as unknown as Query).clone(), args as never) as never;\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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryOrNot(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\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'], sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * When empty set of values is given, `whereIn` will resolve into a {@link QueryMethods.none} query that has a special behavior.\n *\n * ```ts\n * // following queries resolves into `none`:\n * db.table.where('id', [])\n * db.table.where(['id', 'name'], [])\n * db.table.where({ id: [] })\n * ```\n */\n whereIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n true,\n args[0],\n args[1],\n ) as never;\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 orWhereIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n false,\n args[0],\n args[1],\n ) as never;\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 whereNotIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n true,\n args[0],\n args[1],\n true,\n ) as never;\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 orWhereNotIn<\n T extends PickQueryMetaRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n false,\n args[0],\n args[1],\n true,\n ) as never;\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 whereExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n return _queryWhereExists(\n (this as unknown as Query).clone() as unknown as T,\n arg,\n args,\n );\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 orWhereExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryOr(q, existsArgs(q, arg as never, args as never)) as never;\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 PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryWhereNot(\n q,\n existsArgs(q, arg as never, args as never),\n ) as never;\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 orWhereNotExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryOrNot(q, existsArgs(q, arg as never, args as never)) as never;\n }\n}\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Query,\n QueryOrExpression,\n QueryReturnsAll,\n SetQueryKind,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n pushQueryValue,\n saveSearchAlias,\n throwIfNoWhere,\n} from '../query/queryUtils';\nimport { RelationConfigBase } from '../relations';\nimport { _queryWhereIn, WhereResult } from './where/where';\nimport { ToSQLQuery } from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape, Db } from '../query/db';\nimport {\n isExpression,\n Expression,\n callWithThis,\n RecordUnknown,\n PickQueryShape,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { QueryResult } from '../adapter';\nimport { RawSQL, sqlQueryArgsToExpression } from '../sql/rawSql';\nimport { resolveSubQueryCallback } from '../common/utils';\nimport { OrchidOrmInternalError } from '../errors';\n\nexport interface UpdateSelf\n extends PickQueryMetaResultRelationsWithDataReturnTypeShape {\n inputType: RecordUnknown;\n}\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 UpdateSelf> = {\n [K in\n | keyof T['inputType']\n | keyof T['relations']]?: K extends keyof T['inputType']\n ? UpdateColumn<T, K>\n : UpdateRelationData<T, T['relations'][K]['relationConfig']>;\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 UpdateSelf, Key extends keyof T['inputType']> =\n | T['inputType'][Key]\n | QueryOrExpression<T['inputType'][Key]>\n | ((q: T) => QueryOrExpression<T['inputType'][Key]>);\n\n// Add relation operations to the update argument.\ntype UpdateRelationData<\n T extends UpdateSelf,\n Rel extends RelationConfigBase,\n> = QueryReturnsAll<T['returnType']> extends true\n ? Rel['dataForUpdate']\n : Rel['one'] extends true\n ? Rel['dataForUpdate'] | Rel['dataForUpdateOne']\n : Rel['dataForUpdate'] & Rel['dataForUpdateOne'];\n\n// Type of argument for `update`.\n// not available when there are no conditions on the query.\nexport type UpdateArg<T extends UpdateSelf> = T['meta']['hasWhere'] extends true\n ? UpdateData<T>\n : never;\n\n// Type of argument for `updateSql`.\n// not available when there are no conditions on the query.\ntype UpdateRawArgs<T extends UpdateSelf> = T['meta']['hasWhere'] extends true\n ? SQLQueryArgs\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 UpdateSelf> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'update'>\n : SetQueryReturnsRowCount<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 PickQueryShape> =\n | keyof T['shape']\n | { [K in 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 interface UpdateCtx {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n collect?: UpdateCtxCollect;\n}\n\nexport interface UpdateCtxCollect {\n keys: string[];\n data: RecordUnknown;\n}\n\n// apply `increment` or a `decrement`,\n// mutates the `queryData` of a query.\nexport const _queryChangeCounter = <T extends UpdateSelf>(\n self: T,\n op: string,\n data: ChangeCountArg<T>,\n) => {\n const q = (self as unknown as Query).q;\n q.type = 'update';\n\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returnType = 'rowCount';\n }\n\n let map: { [K: 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 as unknown as Query, 'updateData', map);\n return self as never;\n};\n\n// sets query type, `returnType`, casts type from Query to UpdateResult\nconst update = <T extends UpdateSelf>(self: T): UpdateResult<T> => {\n const q = (self as unknown as Query).q;\n q.type = 'update';\n\n if (!q.select) {\n q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(self as unknown as Query, 'update');\n\n return self as never;\n};\n\nexport const _queryUpdate = <T extends UpdateSelf>(\n query: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n const { q } = query as unknown as Query;\n\n const set: RecordUnknown = { ...arg };\n pushQueryValue(query as unknown as Query, '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(query, 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 (query as unknown as Query).baseQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\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(\n query as unknown as Query,\n 'q',\n 'withShapes',\n );\n pushQueryValue(query as unknown as Query, 'with', {\n n: as,\n q: value,\n });\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.collect) {\n const t = (query as unknown as Query).baseQuery.clone();\n const { keys } = ctx.collect;\n\n (\n _queryWhereIn as unknown as (\n q: Query,\n keys: string[],\n values: unknown[][],\n ) => Query\n )(\n t,\n keys,\n queryResult.rows.map((item) => keys.map((key) => item[key])),\n );\n\n _queryUpdate(\n t as WhereResult<Query>,\n ctx.collect.data as UpdateData<WhereResult<Query>>,\n );\n\n for (const row of queryResult.rows) {\n Object.assign(row, ctx.collect.data);\n }\n }\n };\n }\n\n return update(query);\n};\n\nexport const _queryUpdateRaw = <T extends UpdateSelf>(\n q: T,\n sql: Expression,\n): UpdateResult<T> => {\n pushQueryValue(q as unknown as Query, 'updateData', sql);\n\n (q as unknown as Query).q.type = 'update';\n\n return update(q);\n};\n\nexport const _queryUpdateOrThrow = <T extends UpdateSelf>(\n q: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n (q as unknown as Query).q.throwOnNotFound = true;\n return _queryUpdate(q, arg);\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: (q) => q.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 * `update` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // update record in one table\n * .with('a', db.table.find(1).select('id').update(data))\n * // update record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable\n * .find(1)\n * .select('id')\n * .update({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\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 UpdateSelf>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n return _queryUpdate(\n (this as unknown as Query).clone(),\n arg as never,\n ) as never;\n }\n\n /**\n * `updateSql` 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).updateSql`name = ${value}`;\n *\n * // or update with `sql` function:\n * await db.table.find(1).updateSql(sql`name = ${value}`);\n * ```\n * @param args - raw SQL via a template string or by using a `sql` method\n */\n updateSql<T extends UpdateSelf>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n return _queryUpdateRaw(\n (this as unknown as Query).clone(),\n sqlQueryArgsToExpression(args),\n ) as never;\n }\n\n /**\n * To make sure that at least one row was updated use `updateOrThrow`:\n *\n * ```ts\n * import { NotFoundError } from 'orchid-orm';\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 UpdateSelf>(\n this: T,\n arg: UpdateArg<T>,\n ): UpdateResult<T> {\n return _queryUpdateOrThrow(\n (this as unknown as Query).clone(),\n arg as never,\n ) as never;\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 UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(\n (this as unknown as Query).clone(),\n '+',\n data as never,\n );\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 UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(\n (this as unknown as Query).clone(),\n '-',\n data as never,\n );\n }\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { AggregateMethods } from './aggregate';\nimport {\n addValue,\n emptyObject,\n Expression,\n MaybeArray,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport {\n OrderTsQueryConfig,\n QueryData,\n QuerySourceItem,\n SearchWeight,\n ToSQLCtx,\n} from '../sql';\nimport {\n pushQueryValue,\n saveSearchAlias,\n setQueryObjectValue,\n} from '../query/queryUtils';\nimport { getSearchLang, getSearchText } from '../sql/fromAndAs';\nimport { OrchidOrmInternalError } from '../errors';\nimport { columnToSql } from '../sql/common';\nimport { Operators } from '../columns/operators';\n\n// `headline` first argument is a name of the search.\ntype HeadlineSearchArg<T extends PickQueryMeta> = 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).\ninterface HeadlineParams<T extends PickQueryMeta> {\n text?: SelectableOrExpressionOfType<T, QueryColumn<string>>;\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 PickQueryMeta>(\n this: T,\n search: HeadlineSearchArg<T>,\n options?: HeadlineParams<T>,\n ): SetQueryReturnsColumnOrThrow<T, QueryColumn<string>>;\n }\n}\n\n// type of `search` argument\nexport type SearchArg<T extends PickQueryMeta, 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['meta']['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['meta']['selectable']>\n | { [K in keyof T['meta']['selectable']]?: SearchWeight };\n }\n | {\n // search in a generated vector column\n vector: {\n [K in keyof T['meta']['selectable']]: T['meta']['selectable'][K]['column']['dataType'] extends 'tsvector'\n ? K\n : never;\n }[keyof T['meta']['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, As extends string> = T & {\n meta: { tsQuery: string extends As ? never : As };\n};\n\nclass Headline extends Expression<QueryColumn<string>> {\n result = emptyObject as { value: QueryColumn<string> };\n\n constructor(\n public q: QueryData,\n public source: QuerySourceItem,\n public params?: HeadlineParams<Query>,\n ) {\n super();\n q.expr = this;\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\nObject.assign(Headline, Operators.text);\n\nAggregateMethods.prototype.headline = function (\n this: PickQueryMeta,\n search,\n params,\n) {\n const q = this as unknown as Query;\n const source = q.q.sources?.[search];\n if (!source)\n throw new OrchidOrmInternalError(q, `Search \\`${search}\\` is not defined`);\n\n return new Headline(\n q.q,\n source,\n params as HeadlineParams<Query> | undefined,\n ) as never;\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 PickQueryMeta, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n const q = (this as unknown as Query).clone();\n\n if (!arg.as) {\n const as = saveSearchAlias(q, '@q', 'joinedShapes') as As;\n\n arg = {\n ...arg,\n as,\n };\n }\n\n setQueryObjectValue(q, 'sources', arg.as as string, arg);\n if (arg.order) {\n pushQueryValue(q, 'order', arg.as);\n }\n\n return pushQueryValue(q, 'and', { SEARCH: arg }) as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsOneKind,\n SetQueryReturnsVoidKind,\n} from '../query/query';\nimport { _queryUpdate, UpdateData, UpdateSelf } from './update';\nimport { CreateBelongsToData, CreateData, CreateSelf } from './create';\nimport { MoreThanOneRowError } from '../errors';\nimport {\n FnUnknownToUnknown,\n isObjectEmpty,\n PickQueryMetaResult,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryMetaHasWhere } from './where/where';\n\n// `orCreate` arg type.\n// Unlike `upsert`, doesn't pass a data to `create` callback.\nexport type OrCreateArg<Data> = Data | (() => Data);\n\ntype UpsertCreate<DataKey extends PropertyKey, CD> = {\n [K in keyof CD as K extends DataKey ? never : K]: CD[K];\n} & {\n [K in DataKey]?: K extends keyof CD ? CD[K] : never;\n};\n\n// unless upsert query has a select, it returns void\nexport type UpsertResult<T extends PickQueryMetaResult> =\n T['meta']['hasSelect'] extends true\n ? SetQueryReturnsOneKind<T, 'upsert'>\n : SetQueryReturnsVoidKind<T, 'upsert'>;\n\n// Require type of query object to query only one record\n// because upserting multiple isn't possible\nexport type UpsertThis = UpdateSelf &\n CreateSelf &\n QueryMetaHasWhere & {\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 | FnUnknownToUnknown,\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) data = { ...mergeData, ...(data as RecordUnknown) };\n\n const inner = q.create(data as CreateData<Query, never>);\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<\n T extends UpsertThis,\n Update extends UpdateData<T>,\n BT extends CreateBelongsToData<T>,\n >(\n this: T,\n data:\n | {\n update: Update;\n create: CreateData<T, BT> | ((update: Update) => CreateData<T, BT>);\n }\n | {\n data: Update;\n create:\n | UpsertCreate<keyof Update, CreateData<T, BT>>\n | ((\n update: Update,\n ) => UpsertCreate<keyof Update, CreateData<T, BT>>);\n },\n ): UpsertResult<T> {\n const q = (this as unknown as Query).clone();\n\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 _queryUpdate(q, updateData as never);\n }\n\n return orCreate(q as never, 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, BT extends CreateBelongsToData<T>>(\n this: T,\n data: OrCreateArg<CreateData<T, BT>>,\n ): UpsertResult<T> {\n return orCreate((this as unknown as Query).clone() as never, data);\n }\n}\n","import { DynamicSQLArg, QueryColumn, StaticSQLArgs } from 'orchid-core';\nimport { DynamicRawSQL, raw, RawSQL } from '../sql/rawSql';\nimport { PickQueryColumnTypes } from '../query/query';\n\nexport class SqlMethod<ColumnTypes> {\n /**\n * When there is a need to use a piece of raw SQL, use the `sql` exported from the `BaseTable` file, it is also attached to query objects for convenience.\n *\n * When selecting a custom SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const result: { num: number }[] = await db.table.select({\n * num: sql<number>`random() * 100`,\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 * import { sql } from './baseTable';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: sql`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 * Many query methods have a version suffixed with `Sql`, you can pass an SQL template literal directly to these methods.\n * These methods are: `whereSql`, `whereNotSql`, `orderSql`, `havingSql`, `fromSql`, `findBySql`.\n *\n * ```ts\n * await db.table.whereSql`\"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.whereSql`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](/guide/sql-expressions#column) or [ref](/guide/sql-expressions#ref) to reference a column:\n *\n * ```ts\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.ref('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 { sql } from './baseTable';\n *\n * // no interpolation is okay\n * await db.table.where(sql({ 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(sql({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `sql({ raw: '...' })` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` or `ref` are preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\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 * sql<boolean>({\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 * import { sql } from './baseTable';\n *\n * // simplest form:\n * sql`key = ${value}`;\n *\n * // with resulting type:\n * sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * sql`($one + $two) / $one`.type((t) => t.numeric()).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: PickQueryColumnTypes,\n ...args: StaticSQLArgs\n ): RawSQL<QueryColumn<T>, ColumnTypes>;\n sql<T = unknown>(\n this: PickQueryColumnTypes,\n ...args: [DynamicSQLArg]\n ): DynamicRawSQL<QueryColumn<T>, ColumnTypes>;\n sql(this: PickQueryColumnTypes, ...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, QueryInternal, WithDataBase } from './query';\nimport { QueryData } from '../sql';\nimport {\n EmptyObject,\n QueryBaseCommon,\n QueryMetaBase,\n QueryColumns,\n RecordKeyTrue,\n QueryThen,\n QueryReturnType,\n} from 'orchid-core';\nimport { RelationsBase } from '../relations';\nimport { getClonedQueryData } from '../common/utils';\n\nexport type CloneSelfKeys = 'clone' | 'baseQuery' | 'q';\n\nexport abstract class QueryBase<Scopes extends RecordKeyTrue = EmptyObject>\n implements QueryBaseCommon<Scopes>\n{\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>(this: T): T {\n const cloned = Object.create((this as unknown as Query).baseQuery);\n cloned.q = getClonedQueryData((this as unknown as Query).q);\n return cloned;\n }\n __isQuery!: true;\n result!: QueryColumns;\n q = {} as QueryData;\n table?: string;\n shape!: QueryColumns;\n relations!: RelationsBase;\n withData!: WithDataBase;\n baseQuery!: Query;\n internal!: QueryInternal;\n meta!: QueryMetaBase<Scopes>;\n returnType!: QueryReturnType;\n}\n\nexport interface QueryBaseThen<T> extends QueryBase {\n then: QueryThen<T>;\n}\n","import { Query } from '../query/query';\nimport { QueryColumn, QueryThen } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\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 * It is meant to transform the whole result of a query, for transforming individual records consider using {@link QueryMap.map}.\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, Result>(\n this: T,\n fn: (\n input: T['then'] extends QueryThen<infer Data> ? Data : never,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: QueryColumn<Result> }\n : K extends 'then'\n ? QueryThen<Result>\n : T[K];\n } {\n return pushQueryValue(this.clone(), 'transform', fn) as never;\n }\n}\n","import { Query, QueryReturnsAll } from '../query/query';\nimport { QueryColumn, QueryThen, RecordUnknown } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\n\nexport class QueryMap {\n /**\n * Use `map` to transform individual records of a query result.\n *\n * It accepts a single record and should return a single transformed record.\n *\n * For transforming the whole result of a query, consider using [transform](#transform) instead.\n *\n * The [hooks](/guide/hooks) that are going to run after the query will receive the query result **before** transformation.\n *\n * ```ts\n * // add a `titleLength` to every post\n * const posts = await db.post.limit(10).map((post) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * posts[0].titleLength; // number\n *\n * // using the exact same `map` function to transform a single post\n * const singlePost = await db.post.find(id).map((post) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * singlePost.titleLength; // number\n *\n * // can be used in sub-queries\n * const postsWithComments = await db.post.select('title', {\n * comments: (q) =>\n * q.comments.map((comment) => ({\n * ...comment,\n * truncatedContent: comment.content.slice(0, 100),\n * })),\n * });\n *\n * postsWithComments[0].comments[0].truncatedContent; // string\n * ```\n *\n * @param fn - function to transform an individual record\n */\n map<T extends Query, Result extends RecordUnknown>(\n this: T,\n fn: (\n input: QueryReturnsAll<T['returnType']> extends true\n ? T['then'] extends QueryThen<(infer Data)[]>\n ? Data\n : never\n : T['then'] extends QueryThen<infer Data>\n ? Data\n : never,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'result'\n ? { [K in keyof Result]: QueryColumn<Result[K]> }\n : K extends 'then'\n ? QueryThen<\n QueryReturnsAll<T['returnType']> extends true ? Result[] : Result\n >\n : T[K];\n } {\n return pushQueryValue(this.clone(), 'transform', { map: fn }) as never;\n }\n}\n","import { QueryBase } from '../query/queryBase';\nimport { PickQueryMeta, QueryColumns, QueryMetaBase } from 'orchid-core';\nimport { QueryScopes } from '../sql';\nimport { setQueryObjectValue } from '../query/queryUtils';\nimport { Where, WhereResult } from './where/where';\nimport { Query, SelectableFromShape } from '../query/query';\n\ninterface ScopeArgumentQueryMeta<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends QueryMetaBase {\n selectable: SelectableFromShape<Shape, Table>;\n}\n\nexport interface ScopeArgumentQuery<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends Where,\n QueryBase {\n table: Table;\n shape: Shape;\n meta: ScopeArgumentQueryMeta<Table, Shape>;\n}\n\n/**\n * This feature allows defining a set of query modifiers to use it later.\n * Only [where conditions](/guide/where.html) can be set in a scope.\n * If you define a scope with name `default`, it will be applied for all table queries by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * hidden: t.boolean(),\n * active: t.boolean(),\n * }));\n *\n * scopes = this.setScopes({\n * default: (q) => q.where({ hidden: false }),\n * active: (q) => q.where({ active: true }),\n * });\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * some: SomeTable,\n * },\n * );\n *\n * // the default scope is applied for all queries:\n * const nonHiddenRecords = await db.some;\n * ```\n */\nexport class ScopeMethods {\n /**\n * See {@link ScopeMethods}\n *\n * Use the `scope` method to apply a pre-defined scope.\n *\n * ```ts\n * // use the `active` scope that is defined in the table:\n * await db.some.scope('active');\n * ```\n *\n * @param scope - name of the scope to apply\n */\n scope<T extends PickQueryMeta>(\n this: T,\n scope: keyof T['meta']['scopes'],\n ): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n\n if (!q.q.scopes?.[scope as string]) {\n const s = (q.internal.scopes as QueryScopes)[scope as string];\n\n if (!s) throw new Error(`Scope ${scope as string} is not defined`);\n\n setQueryObjectValue(q, 'scopes', scope as string, s);\n }\n\n return q as never;\n }\n\n /**\n * See {@link ScopeMethods}\n *\n * Remove conditions that were added by the scope from the query.\n *\n * ```ts\n * // SomeTable has a default scope, ignore it for this query:\n * await db.some.unscope('default');\n * ```\n *\n * @param scope - name of the scope to remove from the query\n */\n unscope<T extends PickQueryMeta>(\n this: T,\n scope: keyof T['meta']['scopes'],\n ): T {\n const q = (this as unknown as Query).clone();\n\n if (q.q.scopes) {\n delete q.q.scopes[scope as string];\n for (const _ in q.q.scopes) {\n return q as never;\n }\n delete q.q.scopes;\n }\n\n return q as never;\n }\n}\n","import {\n PickQueryResult,\n QueryColumns,\n QueryColumnsInit,\n QueryMetaBase,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryScopes } from '../sql';\nimport { Query } from '../query/query';\nimport { RawSQL } from '../sql/rawSql';\nimport {\n _queryDelete,\n _queryUpdate,\n DeleteArgs,\n DeleteResult,\n UpdateArg,\n} from './index';\n\nexport type SoftDeleteOption<Shape extends QueryColumns> = true | keyof Shape;\n\nexport function enableSoftDelete(\n q: Query,\n table: string | undefined,\n shape: QueryColumnsInit,\n softDelete: true | PropertyKey,\n scopes: QueryScopes,\n) {\n const column = softDelete === true ? 'deletedAt' : softDelete;\n\n if (!shape[column as string]) {\n throw new Error(\n `Table ${table} is missing ${\n column as string\n } column which is required for soft delete`,\n );\n }\n\n const scope = {\n and: [{ [column]: null }],\n };\n\n (scopes as RecordUnknown).deleted = scope;\n (q.q.scopes ??= {}).nonDeleted = scope;\n\n const _del = _softDelete(column);\n // @ts-expect-error it's ok\n q.baseQuery.delete = function (this: Query) {\n return _del.call(this.clone());\n };\n}\n\nconst nowSql = new RawSQL('now()');\n\nconst _softDelete = (column: PropertyKey) => {\n const set = { [column]: nowSql };\n return function <T extends Query>(this: T) {\n return _queryUpdate(this, set as UpdateArg<T>);\n };\n};\n\nexport interface QueryWithSoftDelete extends PickQueryResult {\n meta: QueryMetaBase<{ nonDeleted: true }>;\n}\n\n/**\n * `softDelete` configures the table to set `deletedAt` to current time instead of deleting records.\n * All queries on such table will filter out deleted records by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * deletedAt: t.timestamp().nullable(),\n * }));\n *\n * // true is for using `deletedAt` column\n * readonly softDelete = true;\n * // or provide a different column name\n * readonly softDelete = 'myDeletedAt';\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * someTable: SomeTable,\n * },\n * );\n *\n * // deleted records are ignored by default\n * const onlyNonDeleted = await db.someTable;\n * ```\n */\nexport class SoftDeleteMethods {\n /**\n * `includeDeleted` disables the default `deletedAt` filter:\n *\n * ```ts\n * const allRecords = await db.someTable.includeDeleted();\n * ```\n */\n includeDeleted<T extends QueryWithSoftDelete>(this: T): T {\n return (this as unknown as Query).unscope('nonDeleted' as never) as never;\n }\n\n /**\n * `hardDelete` deletes records bypassing the `softDelete` behavior:\n *\n * ```ts\n * await db.someTable.find(1).hardDelete();\n * ```\n */\n hardDelete<T extends QueryWithSoftDelete>(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete(\n (this as unknown as Query).clone().unscope('nonDeleted' as never),\n ) as never;\n }\n}\n","import {\n ColumnTypeBase,\n emptyObject,\n Expression,\n ExpressionData,\n isExpression,\n PickOutputType,\n PickQueryMeta,\n PickQueryShape,\n QueryColumn,\n QueryThen,\n ValExpression,\n} from 'orchid-core';\nimport { getSqlText, JoinedShapes, QueryData, ToSQLCtx } from '../sql';\nimport { columnToSql, simpleExistingColumnToSQL } from '../sql/common';\nimport {\n PickQueryColumnTypes,\n PickQueryMetaResultRelationsWindowsColumnTypes,\n Query,\n QueryMetaHasSelect,\n QueryOrExpressionBooleanOrNullResult,\n} from '../query/query';\nimport { SelectableOrExpressions } from '../common/utils';\nimport { AggregateOptions, makeFnExpression } from '../common/fn';\nimport { BooleanQueryColumn } from './aggregate';\nimport { Operators, OperatorsBoolean } from '../columns/operators';\n\n// Expression created by `Query.column('name')`, it will prefix the column with a table name from query's context.\nexport class ColumnRefExpression<T extends QueryColumn> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(value: T, public name: string) {\n super();\n this.result = { value };\n this.q = { expr: this };\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return simpleExistingColumnToSQL(\n ctx,\n this.name,\n this.result.value,\n quotedAs,\n );\n }\n}\n\nexport class RefExpression<T extends QueryColumn> extends Expression<T> {\n result: { value: T };\n\n constructor(value: T, public q: QueryData, public ref: string) {\n super();\n this.result = { value };\n q.expr = this;\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return columnToSql(ctx, this.q, this.q.shape, this.ref, quotedAs);\n }\n}\n\nexport interface OrExpression\n extends Expression<BooleanQueryColumn>,\n OperatorsBoolean {}\n\ntype OrExpressionArg = QueryOrExpressionBooleanOrNullResult | undefined;\n\nexport class OrExpression extends Expression<BooleanQueryColumn> {\n declare result: { value: BooleanQueryColumn };\n q: ExpressionData;\n\n constructor(public args: [OrExpressionArg, ...OrExpressionArg[]]) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: { values: unknown[] }, quotedAs?: string): string {\n const res: string[] = [];\n for (const arg of this.args) {\n if (arg) {\n if (isExpression(arg)) {\n const sql = arg.toSQL(ctx, quotedAs);\n if (sql) res.push(sql);\n } else {\n res.push(`(${getSqlText((arg as unknown as Query).toSQL(ctx))})`);\n }\n }\n }\n\n return `(${res.join(' OR ')})`;\n }\n}\n\nObject.assign(OrExpression.prototype, Operators.boolean);\n\ninterface QueryReturnsFnAdd<T extends PickQueryColumnTypes>\n extends QueryMetaHasSelect {\n type<C extends QueryColumn>(\n fn: (types: T['columnTypes']) => C,\n ): {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n } & C['operators'];\n}\n\ntype SetQueryReturnsFn<\n T extends PickQueryColumnTypes,\n C extends PickOutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n} & QueryReturnsFnAdd<T>;\n\nexport class ExpressionMethods {\n /**\n * `column` references a table column, this can be used in raw SQL or when building a column expression.\n * Only for referencing a column in the query's table. For referencing joined table's columns, see [ref](#ref).\n *\n * ```ts\n * await db.table.select({\n * // select `(\"table\".\"id\" = 1 OR \"table\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * q.sql<boolean>`${q.column('id')} = ${1} OR ${q.column('name')} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) => q.column('id').equals(1).or(q.column('name').equals('name')),\n * });\n * ```\n *\n * @param name - column name\n */\n column<T extends PickQueryShape, K extends keyof T['shape']>(\n this: T,\n name: K,\n ): ColumnRefExpression<T['shape'][K]> & T['shape'][K]['operators'] {\n const column = (this.shape as { [K: PropertyKey]: ColumnTypeBase })[name];\n return new ColumnRefExpression(\n column as T['shape'][K],\n name as string,\n ) as never;\n }\n\n /**\n * `ref` is similar to [column](#column), but it also allows to reference a column of joined table,\n * and other dynamically defined columns.\n *\n * ```ts\n * await db.table.join('otherTable').select({\n * // select `(\"otherTable\".\"id\" = 1 OR \"otherTable\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * q.sql<boolean>`${q.ref('otherTable.id')} = ${1} OR ${q.ref(\n * 'otherTable.name',\n * )} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) =>\n * q\n * .ref('otherTable.id')\n * .equals(1)\n * .or(q.ref('otherTable.name').equals('name')),\n * });\n * ```\n *\n * @param arg - any available column name, such as of a joined table\n */\n ref<\n T extends PickQueryMeta,\n K extends keyof T['meta']['selectable'] & string,\n >(\n this: T,\n arg: K,\n ): RefExpression<T['meta']['selectable'][K]['column']> &\n T['meta']['selectable'][K]['column']['operators'] {\n const q = (this as unknown as Query).clone();\n\n const { shape } = q.q;\n let column: QueryColumn;\n\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const col = arg.slice(index + 1);\n if (table === (q.q.as || q.table)) {\n column = shape[col];\n } else {\n column = (q.q.joinedShapes as JoinedShapes)[table][col];\n }\n } else {\n column = shape[arg];\n }\n\n return new RefExpression(column, q.q, arg) as never;\n }\n\n val(value: unknown): ValExpression {\n return new ValExpression(value);\n }\n\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 (see [Aggregate](/guide/aggregate.html)) via third parameter.\n *\n * Use `type` method to specify a column type so that its operators such as `lt` and `gt` become available:\n *\n * ```ts\n * const q = await User.select({\n * // Produces `sqrt(\"numericColumn\") > 5`\n * sqrtIsGreaterThan5: (q) =>\n * q\n * .fn('sqrt', ['numericColumn'])\n * .type((t) => t.float())\n * .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 */\n fn<\n T extends PickQueryMetaResultRelationsWindowsColumnTypes,\n Type = unknown,\n C extends QueryColumn = QueryColumn<Type>,\n >(\n this: T,\n fn: string,\n args: SelectableOrExpressions<T>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsFn<T, C> {\n return makeFnExpression(this, emptyObject as C, fn, args, options) as never;\n }\n\n or(...args: [OrExpressionArg, ...OrExpressionArg[]]): OrExpression {\n return new OrExpression(args);\n }\n}\n","import {\n GetQueryResult,\n PickQueryMetaResultReturnTypeWithDataWindowsTable,\n PickQueryQ,\n PickQueryShapeResultSinglePrimaryKey,\n Query,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluck,\n SetQueryReturnsRows,\n SetQueryReturnsVoid,\n SetQueryReturnsVoidKind,\n SetQueryTableAlias,\n WithDataBase,\n} from '../query/query';\nimport {\n AliasOrTable,\n SelectableOrExpression,\n SelectableOrExpressions,\n} from '../common/utils';\nimport {\n OrderTsQueryConfig,\n SelectItem,\n SelectQueryData,\n SortDir,\n toSQL,\n ToSQLOptions,\n ToSQLQuery,\n TruncateQueryData,\n} from '../sql';\nimport { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { Then } from './then';\nimport { AggregateMethods } from './aggregate';\nimport { addParserForSelectItem, Select } from './select';\nimport { FromMethods, FromQuerySelf } from './from';\nimport { Join, OnMethods } from './join/join';\nimport { WithMethods } from './with';\nimport { Union } from './union';\nimport { JsonMethods } from './json';\nimport { Create } from './create';\nimport { Update } from './update';\nimport { Delete } from './delete';\nimport { Transaction } from './transaction';\nimport { For } from './for';\nimport {\n _queryWhere,\n _queryWhereSql,\n QueryMetaHasWhere,\n Where,\n WhereArgs,\n WhereResult,\n} 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 { SqlMethod } from './sql';\nimport {\n applyMixins,\n EmptyObject,\n Expression,\n PickQueryMeta,\n PickQueryMetaResult,\n PickQueryMetaResultReturnType,\n PickQueryMetaShape,\n PickQueryResult,\n PickQueryResultUniqueColumns,\n PickQueryTableMetaResult,\n QueryColumns,\n QueryMetaBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n Sql,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { AsMethods } from './as';\nimport { QueryBase } from '../query/queryBase';\nimport { OrchidOrmInternalError } from '../errors';\nimport { TransformMethods } from './transform';\nimport { QueryMap } from './map';\nimport { sqlQueryArgsToExpression } from '../sql/rawSql';\nimport { ScopeMethods } from './scope';\nimport { SoftDeleteMethods } from './softDelete';\nimport { queryWrap } from './queryMethods.utils';\nimport { ExpressionMethods } from './expressions';\nimport { _queryNone } from './none';\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 interface WindowArg<T extends OrderArgSelf> {\n [K: string]: WindowArgDeclaration<T> | Expression;\n}\n\n// SQL window options to specify partitionBy and order of the window\nexport interface WindowArgDeclaration<T extends OrderArgSelf = OrderArgSelf> {\n partitionBy?: SelectableOrExpression<T> | SelectableOrExpressions<T>;\n order?: OrderArg<T>;\n}\n\n// add new windows to a query\ntype WindowResult<T, W extends RecordUnknown> = T & {\n windows: { [K in keyof W]: true };\n};\n\nexport type OrderArgSelf = PickQueryMetaResult;\n\nexport type OrderArg<T extends OrderArgSelf> =\n | OrderArgKey<T>\n | OrderArgTsQuery<T>\n | {\n [K in OrderArgKey<T> | OrderArgTsQuery<T>]?: K extends OrderArgTsQuery<T>\n ? OrderTsQueryConfig\n : SortDir;\n }\n | Expression;\n\nexport type OrderArgs<T extends OrderArgSelf> = OrderArg<T>[];\n\ntype OrderArgTsQuery<T extends OrderArgSelf> =\n | string\n | undefined extends T['meta']['tsQuery']\n ? never\n : Exclude<T['meta']['tsQuery'], undefined>;\n\ntype OrderArgKey<T extends OrderArgSelf> =\n | keyof T['meta']['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\nexport type GroupArgs<T extends PickQueryResult> = (\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 | Expression\n)[];\n\ninterface QueryHelper<\n T extends PickQueryMetaShape,\n Args extends unknown[],\n Result,\n> {\n <\n Q extends {\n returnType: QueryReturnType;\n meta: QueryMetaBase & {\n selectable: Omit<\n T['meta']['selectable'],\n `${AliasOrTable<T>}.${Extract<keyof T['shape'], string>}`\n >;\n };\n result: QueryColumns;\n windows: EmptyObject;\n withData: WithDataBase;\n },\n >(\n q: Q,\n ...args: Args\n ): Result extends Query ? MergeQuery<Q, Result> : Result;\n\n result: Result;\n}\n\n// Get result of query helper, for https://github.com/romeerez/orchid-orm/issues/215\nexport type QueryHelperResult<\n T extends QueryHelper<Query, unknown[], unknown>,\n> = T['result'];\n\ntype NarrowTypeResult<T extends PickQueryMetaResultReturnType, Narrow> = {\n [K in keyof T['result']]: K extends keyof Narrow\n ? {\n [P in keyof T['result'][K]]: P extends 'outputType'\n ? Narrow[K] extends T['result'][K]['outputType']\n ? Narrow[K]\n : `narrowType() error: passed type does not exist in '${K &\n string}'s type union`\n : T['result'][K][P];\n }\n : T['result'][K];\n};\n\nexport interface QueryMethods<ColumnTypes>\n extends AsMethods,\n AggregateMethods,\n Select,\n FromMethods,\n Join,\n WithMethods,\n Union,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n SqlMethod<ColumnTypes>,\n TransformMethods,\n QueryMap,\n ScopeMethods,\n SoftDeleteMethods,\n ExpressionMethods {}\n\nexport type WrapQueryArg = FromQuerySelf;\n\nexport const _queryAll = <T extends Query>(q: T): SetQueryReturnsAll<T> => {\n q.q.returnType = 'all';\n q.q.all = true;\n return q as never;\n};\n\nexport const _queryTake = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsOne<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'oneOrThrow';\n return q as never;\n};\n\nexport const _queryTakeOptional = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsOneOptional<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'one';\n return q as never;\n};\n\nexport const _queryExec = <T extends Query>(q: T) => {\n q.q.returnType = 'void';\n return q as never;\n};\n\nexport const _queryFindBy = <T extends QueryBase>(\n q: T,\n args: WhereArgs<T>,\n): SetQueryReturnsOne<WhereResult<T>> => {\n return _queryTake(_queryWhere(q, args));\n};\n\nexport const _queryFindByOptional = <T extends QueryBase>(\n q: T,\n args: WhereArgs<T>,\n): SetQueryReturnsOneOptional<WhereResult<T>> => {\n return _queryTakeOptional(_queryWhere(q, args));\n};\n\nexport const _queryRows = <T extends Query>(q: T): SetQueryReturnsRows<T> => {\n q.q.returnType = 'rows';\n return q as never;\n};\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 PickQueryResult>(this: T): SetQueryReturnsAll<T> {\n return _queryAll((this as unknown as Query).clone()) as never;\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 PickQueryResult>(this: T): SetQueryReturnsOne<T> {\n return _queryTake((this as unknown as Query).clone()) as never;\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 PickQueryResult>(\n this: T,\n ): SetQueryReturnsOneOptional<T> {\n return _queryTakeOptional((this as unknown as Query).clone()) as never;\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 PickQueryResult>(this: T): SetQueryReturnsRows<T> {\n return _queryRows((this as unknown as Query).clone()) as never;\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 PickQueryMeta, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n const q = (this as unknown as Query).clone();\n q.q.returnType = 'pluck';\n (q.q as SelectQueryData).select = [select as SelectItem];\n addParserForSelectItem(q as never, q.q.as || q.table, 'pluck', select);\n return q as never;\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>(this: T): SetQueryReturnsVoid<T> {\n return _queryExec((this as unknown as Query).clone()) as never;\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: ToSQLQuery, 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 SQL expressions to place it to `DISTINCT ON (...)`:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // Distinct on the name and raw SQL\n * db.table.distinct('name', sql`raw sql`).select('id', 'name');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n distinct<T extends PickQueryMeta>(\n this: T,\n ...columns: SelectableOrExpressions<T>\n ): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'distinct',\n columns as string[],\n ) as never;\n }\n\n /**\n * Finds a single record by the primary key (id), throws [NotFoundError](/guide/error-handling.html) if not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType = await db.table.find(1);\n * ```\n *\n * @param value - primary key value to find by\n */\n find<T extends PickQueryShapeResultSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n const q = (this as unknown as Query).clone();\n\n if (value === null || value === undefined) {\n throw new OrchidOrmInternalError(\n q,\n `${value} is not allowed in the find method`,\n );\n }\n\n return _queryTake(\n _queryWhere(q, [\n {\n [q.internal.singlePrimaryKey]: value,\n } as never,\n ]),\n ) as never;\n }\n\n /**\n * Finds a single record with a given SQL, throws {@link NotFoundError} if not found:\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySql<T extends PickQueryResult>(\n this: T,\n ...args: SQLQueryArgs\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n const q = (this as unknown as Query).clone();\n return _queryTake(_queryWhereSql(q, args)) as never;\n }\n\n /**\n * Finds a single record by the primary key (id), returns `undefined` when not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.find(123);\n * ```\n *\n * @param value - primary key value to find by, or a raw SQL\n */\n findOptional<T extends PickQueryShapeResultSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryTakeOptional((this as unknown as Query).find(value)) as never;\n }\n\n /**\n * Finds a single record with a given SQL.\n * Returns `undefined` when not found.\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySqlOptional<T extends PickQueryResult>(\n this: T,\n ...args: SQLQueryArgs\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryTakeOptional(\n (this as unknown as Query).findBySql(...args),\n ) as never;\n }\n\n /**\n * Finds a single unique record, throws [NotFoundError](/guide/error-handling.html) if not found.\n * It accepts values of primary keys or unique indexes defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).take()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findBy({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys and unique indexes in the table\n */\n findBy<T extends PickQueryResultUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n return _queryFindBy((this as unknown as Query).clone(), [\n uniqueColumnValues,\n ] as never) as never;\n }\n\n /**\n * Finds a single unique record, returns `undefined` if not found.\n * It accepts values of primary keys or unique indexes defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).takeOptional()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findByOptional({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys and unique indexes in the table\n */\n findByOptional<T extends PickQueryResultUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryFindByOptional((this as unknown as Query).clone(), [\n uniqueColumnValues,\n ] as never) as never;\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>(this: T, schema: string): T {\n const q = (this as unknown as Query).clone();\n q.q.schema = schema;\n return q as T;\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 = db.product\n * .select('category')\n * .selectSum('price', { as: 'sumPrice' })\n * .group('category');\n * ```\n *\n * Also, it's possible to group by a selected value:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const results = db.product\n * .select({\n * month: sql`extract(month from \"createdAt\")`.type((t) =>\n * // month is returned as string, parse it to int\n * t.string().parse(parseInt),\n * ),\n * })\n * .selectSum('price', { as: 'sumPrice' })\n * // group by month extracted from \"createdAt\"\n * .group('month');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n group<T extends PickQueryResult>(this: T, ...columns: GroupArgs<T>): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'group',\n columns,\n ) as never;\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 OrderArgSelf, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return pushQueryValue(\n (this as unknown as Query).clone(),\n 'window',\n arg,\n ) as never;\n }\n\n wrap<\n T extends PickQueryTableMetaResult,\n Q extends WrapQueryArg,\n As extends string = 't',\n >(this: T, query: Q, as?: As): SetQueryTableAlias<Q, As> {\n return queryWrap(this, (query as unknown as Query).clone(), as) as never;\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 or an object.\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 *\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) or an object with column names and sort directions.\n */\n order<T extends OrderArgSelf>(this: T, ...args: OrderArgs<T>): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'order',\n args,\n ) as never;\n }\n\n /**\n * Order by SQL expression\n *\n * Order by raw SQL expression.\n *\n * ```ts\n * db.table.orderSql`raw sql`;\n * ```\n *\n * @param args - SQL expression\n */\n orderSql<T>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValue(\n (this as unknown as Query).clone(),\n 'order',\n sqlQueryArgsToExpression(args),\n ) as never;\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>(this: T, arg: number | undefined): T {\n const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).limit = arg;\n return q as T;\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 const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).offset = arg;\n return q as T;\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 PickQueryMeta>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): SetQueryReturnsVoidKind<T, 'truncate'> {\n const query = (this as unknown as Query).clone();\n const q = query.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 _queryExec(query) as never;\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 * When it's being used in sub-selects, it will return empty arrays, `undefined`'s, or `0` for count,\n * or it will throw if the sub-query require a result:\n *\n * ```ts\n * await db.user.select({\n * // returns empty array\n * pets: (q) => q.pets.none(),\n * // returns `undefined`\n * firstPet: (q) => q.pets.none().takeOptional(),\n * // throws NotFound error\n * requriedFirstPet: (q) => q.pets.none().take(),\n * // returns `undefined`\n * firstPetName: (q) => q.pets.none().getOptional('name'),\n * // throws NotFound error\n * requiredFirstPetName: (q) => q.pets.none().get('name'),\n * // returns empty array\n * petsNames: (q) => q.pets.none().pluck('name'),\n * // returns 0\n * petsCount: (q) => q.pets.none().count(),\n * });\n * ```\n *\n * When the `none` query is being used for joins that require match, the host query will return an empty result:\n *\n * ```ts\n * // all the following queries will resolve into empty arrays\n *\n * await db.user.select({\n * pets: (q) => q.pets.join().none(),\n * });\n *\n * await db.user.join((q) => q.pets.none());\n *\n * await db.user.join('pets', (q) => q.none());\n * ```\n *\n * When it's being used in `leftJoin` or `fullJoin`, it implicitly adds `ON false` into the join's SQL.\n *\n * ```ts\n * // this query can return user records\n * await db.user.leftJoin('pets', (q) => q.none());\n *\n * // this query won't return user records, because of the added where condition\n * await db.user.leftJoin('pets', (q) => q.none()).where({ 'pets.name': 'Kitty' });\n * ```\n */\n none<T>(this: T): T {\n return _queryNone(this);\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<\n T extends PickQueryMetaResultReturnTypeWithDataWindowsTable<\n string | undefined\n >,\n Arg extends PickQueryMetaResultReturnTypeWithDataWindowsTable<T['table']>,\n Result,\n >(\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 never;\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 * To get the result type of query helper, use `QueryHelperResult` type:\n *\n * ```ts\n * import { QueryHelperResult } from 'orchid-orm';\n *\n * const selectHelper = db.table.makeHelper((q) => q.select('id', 'name'));\n *\n * // This type is identical to `db.table.select('id', 'name')`\n * type SelectQuery = QueryHelperResult<typeof selectHelper>;\n *\n * // Await to get result, the type is `{ id: number, name: string }[]`\n * type Result = Awaited<QueryHelperResult<typeof selectHelper>>;\n * ```\n *\n * @param fn - helper function\n */\n makeHelper<T extends PickQueryMetaShape, Args extends unknown[], Result>(\n this: T,\n fn: (q: T, ...args: Args) => Result,\n ): QueryHelper<T, Args, Result> {\n return ((query: T, ...args: Args) => {\n const q = (query as unknown as Query).clone();\n q.q.as = undefined;\n return fn(q as never, ...args);\n }) as never;\n }\n\n /**\n * Narrows a part of the query output type.\n * Use with caution, type-safety isn't guaranteed with it.\n * This is similar so using `as` keyword from TypeScript, except that it applies only to a part of the result.\n *\n * The syntax `()<{ ... }>()` is enforced by internal limitations.\n *\n * ```ts\n * const rows = db.table\n * // filter out records where the `nullableColumn` is null\n * .where({ nullableColumn: { not: null } });\n * // narrows only a specified column, the rest of result is unchanged\n * .narrowType()<{ nullableColumn: string }>()\n *\n * // the column had type `string | null`, now it is `string`\n * rows[0].nullableColumn\n *\n * // imagine that table has a enum column kind with variants 'first' | 'second'\n * // and a boolean `approved`\n * db.table\n * .where({ kind: 'first', approved: true })\n * // after applying such `where`, it's safe to narrow the type to receive the literal values\n * .narrowType()<{ kind: 'first', approved: true }>();\n * ```\n */\n narrowType<T extends PickQueryMetaResultReturnType>(\n this: T,\n ): <Narrow>() => {\n [K in keyof T]: K extends 'result'\n ? NarrowTypeResult<T, Narrow>\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, NarrowTypeResult<T, Narrow>>>\n : T[K];\n } {\n return () => this as never;\n }\n}\n\napplyMixins(QueryMethods, [\n QueryBase,\n AsMethods,\n AggregateMethods,\n Select,\n FromMethods,\n Join,\n OnMethods,\n WithMethods,\n Union,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n SqlMethod,\n TransformMethods,\n QueryMap,\n ScopeMethods,\n SoftDeleteMethods,\n ExpressionMethods,\n]);\n","import {\n ColumnNameOfTable,\n EmptyObject,\n Expression,\n ForeignKeyTable,\n MaybeArray,\n QueryColumn,\n QueryColumns,\n RawSQLBase,\n} from 'orchid-core';\nimport { SearchWeight } from './sql';\nimport { sqlFn, SqlFn } from './sql/rawSql';\nimport OptionsArg = TableData.Index.OptionsArg;\n\nexport interface TableData {\n primaryKey?: TableData.PrimaryKey;\n indexes?: TableData.Index[];\n constraints?: TableData.Constraint[];\n}\n\nexport namespace TableData {\n // Used in migrations to also drop related entities if is set to CASCADE\n export type DropMode = 'CASCADE' | 'RESTRICT';\n\n export interface PrimaryKey {\n columns: string[];\n name?: string;\n }\n\n export interface ColumnIndex {\n options: Index.ColumnArg & Index.Options;\n name?: string;\n }\n\n export interface Index {\n columns: Index.ColumnOrExpressionOptions[];\n options: Index.Options;\n name?: string;\n }\n\n export interface Constraint {\n name?: string;\n check?: Check;\n identity?: Identity;\n references?: References;\n dropMode?: TableData.DropMode;\n }\n\n export type Check = RawSQLBase;\n\n export interface ColumnReferences {\n fnOrTable: TableData.References.FnOrTable;\n foreignColumns: string[];\n options?: References.Options;\n }\n\n export interface References extends ColumnReferences {\n columns: string[];\n }\n\n export interface Identity extends SequenceBaseOptions {\n always?: boolean;\n }\n\n interface SequenceBaseOptions {\n increment?: number;\n start?: number;\n min?: number;\n max?: number;\n cache?: number;\n cycle?: boolean;\n }\n\n export interface SequenceOptions extends SequenceBaseOptions {\n dataType?: 'smallint' | 'integer' | 'bigint';\n ownedBy?: string;\n }\n\n export namespace Index {\n // config for a single column or an expression in the index\n export interface ColumnOptions {\n collate?: string;\n opclass?: string;\n order?: string;\n // weight for a column in a search index\n weight?: SearchWeight;\n }\n\n export interface UniqueOptionsArg {\n nullsNotDistinct?: boolean;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: 'CASCADE' | 'RESTRICT';\n }\n\n export interface OptionsArg extends UniqueOptionsArg {\n unique?: boolean;\n }\n\n export interface TsVectorArg extends OptionsArg, TsVectorOptions {}\n\n // all possible index options, excluding column/expression options\n export type Options = TsVectorArg;\n\n export interface UniqueColumnArg extends ColumnOptions, UniqueOptionsArg {\n expression?: string;\n }\n\n // argument of column's index method, may have an expression\n export interface ColumnArg extends UniqueColumnArg {\n unique?: boolean;\n }\n\n interface TsVectorOptions {\n // set the language for the tsVector, 'english' is a default\n language?: string;\n // set the column with language for the tsVector\n languageColumn?: string;\n // create a tsVector index\n tsVector?: boolean;\n }\n\n export interface TsVectorColumnArg extends ColumnArg, TsVectorOptions {}\n\n // for a table index that has an expression in the list\n export interface ExpressionOptions extends ColumnOptions {\n expression: string;\n }\n\n // for a table index that has a column in the list\n export interface ColumnOptionsForColumn<Column extends PropertyKey>\n extends ColumnOptions {\n column: Column;\n }\n\n // for a table index, it can have either a column or an expression in its list\n export type ColumnOrExpressionOptions<Column extends PropertyKey = string> =\n ColumnOptionsForColumn<Column> | ExpressionOptions;\n }\n\n export namespace References {\n export type FnOrTable = (() => ForeignKeyTable) | string;\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 */\n export type Match = '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 */\n export type Action =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\n // Used in migrations to make foreign key SQL\n export interface Options {\n name?: string;\n match?: Match;\n onUpdate?: Action;\n onDelete?: Action;\n dropMode?: TableData.DropMode;\n }\n }\n}\n\nexport type TableDataInput = {\n primaryKey?: TableData.PrimaryKey;\n index?: TableData.Index;\n constraint?: TableData.Constraint;\n};\n\nexport interface TableDataItem {\n columns: unknown;\n name: unknown;\n}\n\nexport interface UniqueTableDataItem<\n Shape extends QueryColumns = QueryColumns,\n> {\n columns: (keyof Shape)[];\n name: string;\n}\n\nexport interface TableDataMethods<Key extends PropertyKey> {\n primaryKey<Columns extends [Key, ...Key[]], Name extends string>(\n columns: Columns,\n name?: Name,\n ): {\n columns: Columns;\n name: string extends Name ? never : Name;\n };\n\n unique<\n Columns extends [\n Key | TableData.Index.ColumnOrExpressionOptions<Key>,\n ...(Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ],\n Name extends string,\n >(\n columns: Columns,\n ...args:\n | [options?: TableData.Index.UniqueOptionsArg]\n | [name?: Name, options?: TableData.Index.UniqueOptionsArg]\n ): {\n columns: Columns extends (\n | Key\n | TableData.Index.ColumnOptionsForColumn<Key>\n )[]\n ? {\n [I in keyof Columns]: 'column' extends keyof Columns[I]\n ? Columns[I]['column']\n : Columns[I];\n }\n : never;\n name: string extends Name ? never : Name;\n };\n\n index(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ...args:\n | [options?: TableData.Index.OptionsArg]\n | [name?: string, options?: TableData.Index.OptionsArg]\n ): TableDataItem;\n\n searchIndex(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ...args:\n | [options?: TableData.Index.TsVectorArg]\n | [name?: string, options?: TableData.Index.TsVectorArg]\n ): TableDataItem;\n\n foreignKey<\n ForeignTable extends (() => ForeignKeyTable) | string,\n ForeignColumns extends ForeignTable extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<ForeignTable>>,\n ...ColumnNameOfTable<ReturnType<ForeignTable>>[],\n ]\n : [string, ...string[]],\n >(\n columns: [string, ...string[]],\n fnOrTable: ForeignTable,\n foreignColumns: ForeignColumns,\n options?: TableData.References.Options,\n ): TableDataItem;\n\n check(check: RawSQLBase, name?: string): TableDataItem;\n\n sql: SqlFn;\n}\n\nexport type TableDataItemsUniqueColumns<\n Shape extends QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? ItemUniqueColumns<Shape, T>\n : T extends UniqueTableDataItem<Shape>[]\n ? {\n [Item in T[number] as PropertyKey]: ItemUniqueColumns<Shape, Item>;\n }[PropertyKey]\n : never;\n\ntype ItemUniqueColumns<\n Shape extends QueryColumns,\n T extends UniqueTableDataItem<Shape>,\n> = {\n [Column in T['columns'][number]]: UniqueQueryTypeOrExpression<\n Shape[Column]['queryType']\n >;\n};\n\nexport type TableDataItemsUniqueColumnTuples<\n Shape extends QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? T['columns']\n : T extends UniqueTableDataItem<Shape>[]\n ? T[number]['columns']\n : never;\n\nexport type UniqueQueryTypeOrExpression<T> =\n | T\n | Expression<QueryColumn<T, EmptyObject>>;\n\nexport type TableDataItemsUniqueConstraints<\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem\n ? T['name']\n : T extends UniqueTableDataItem[]\n ? T[number]['name']\n : never;\n\nexport type TableDataFn<Shape, Data extends MaybeArray<TableDataItem>> = (\n t: TableDataMethods<keyof Shape>,\n) => Data;\n\nconst makeIndex = (\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n first?: string | TableData.Index.OptionsArg,\n second?: TableData.Index.OptionsArg,\n): {\n index: {\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[];\n options: TableData.Index.Options;\n unique?: boolean;\n name?: string;\n };\n} => {\n if (typeof first === 'string') {\n const options: OptionsArg = second ?? {};\n return {\n index: { columns, options, name: first },\n };\n } else {\n const options: OptionsArg = first ?? {};\n return {\n index: { columns, options },\n };\n }\n};\n\nexport const tableDataMethods: TableDataMethods<string> = {\n primaryKey(columns, name) {\n return { primaryKey: { columns, name } } as never;\n },\n unique(columns, ...[first, second]) {\n const input = makeIndex(columns, first, second);\n input.index.options.unique = true;\n return input as never;\n },\n index: makeIndex as never,\n searchIndex(columns, ...[first, second]) {\n const input = makeIndex(columns, first, second);\n input.index.options.using ??= 'gin';\n input.index.options.tsVector = true;\n return input as never;\n },\n foreignKey(columns, fnOrTable, foreignColumns, options) {\n return {\n constraint: {\n name: options?.name,\n references: { columns, fnOrTable, foreignColumns, options },\n },\n } as never;\n },\n check(check, name) {\n return { constraint: { check, name } } as never;\n },\n sql: sqlFn,\n};\n\nexport const parseTableData = (\n dataFn?: TableDataFn<unknown, any>,\n): TableData => {\n const tableData: TableData = {};\n if (dataFn) {\n const input = dataFn(tableDataMethods);\n if (Array.isArray(input)) {\n for (const item of input) {\n parseTableDataInput(tableData, item);\n }\n } else {\n parseTableDataInput(tableData, input);\n }\n }\n return tableData;\n};\n\nexport const parseTableDataInput = (\n tableData: TableData,\n item: TableDataInput,\n) => {\n if (item.primaryKey) {\n tableData.primaryKey = item.primaryKey;\n } else if (item.index) {\n const index = item.index as TableData.Index;\n for (let i = index.columns.length - 1; i >= 0; i--) {\n if (typeof index.columns[i] === 'string') {\n index.columns[i] = {\n column: index.columns[i] as unknown as string,\n };\n }\n }\n (tableData.indexes ??= []).push(item.index);\n } else if (item.constraint) {\n (tableData.constraints ??= []).push(item.constraint);\n if (item.constraint.references?.options?.dropMode) {\n item.constraint.dropMode = item.constraint.references.options.dropMode;\n }\n }\n};\n","import {\n DbDomainArg,\n DbExtension,\n Query,\n QueryInternal,\n SelectableFromShape,\n} from './query';\nimport {\n handleResult,\n logParamToLogObject,\n QueryLogOptions,\n QueryMethods,\n} from '../queryMethods';\nimport { QueryData, QueryScopes, SelectQueryData, ToSQLOptions } from '../sql';\nimport {\n Adapter,\n AdapterOptions,\n QueryArraysResult,\n QueryResult,\n} from '../adapter';\nimport {\n DefaultColumnTypes,\n getColumnTypes,\n makeColumnTypes,\n} from '../columns';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n applyMixins,\n ColumnSchemaConfig,\n ColumnShapeOutput,\n ColumnsParsers,\n ColumnTypeBase,\n CoreQueryScopes,\n DbBase,\n DefaultSelectColumns,\n EmptyObject,\n emptyObject,\n isRawSQL,\n MaybeArray,\n pushOrNewArray,\n QueryCatch,\n QueryColumns,\n QueryColumnsInit,\n QueryResultRow,\n QueryThen,\n RecordString,\n RecordUnknown,\n snakeCaseKey,\n Sql,\n SQLQueryArgs,\n TemplateLiteralArgs,\n toSnakeCase,\n TransactionState,\n} from 'orchid-core';\nimport { inspect } from 'node:util';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { templateLiteralToSQL } from '../sql/rawSql';\nimport { RelationsBase } from '../relations';\nimport { ScopeArgumentQuery } from '../queryMethods/scope';\nimport { QueryBase } from './queryBase';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../columns/defaultSchemaConfig';\nimport { enableSoftDelete, SoftDeleteOption } from '../queryMethods/softDelete';\nimport {\n parseTableData,\n TableData,\n TableDataFn,\n TableDataItem,\n TableDataItemsUniqueColumnTuples,\n TableDataItemsUniqueColumns,\n TableDataItemsUniqueConstraints,\n UniqueQueryTypeOrExpression,\n} from '../tableData';\n\nexport type ShapeColumnPrimaryKeys<Shape extends QueryColumnsInit> = {\n [K in {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? K\n : never;\n }[keyof Shape]]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n};\n\nexport type ShapeUniqueColumns<Shape extends QueryColumnsInit> = {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? {\n [C in K]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n }\n : never;\n}[keyof Shape];\n\nexport type UniqueConstraints<Shape extends QueryColumnsInit> =\n | {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? string extends Shape[K]['data']['primaryKey']\n ? never\n : Shape[K]['data']['primaryKey']\n : Shape[K]['data']['unique'] extends string\n ? string extends Shape[K]['data']['unique']\n ? never\n : Shape[K]['data']['unique']\n : never;\n }[keyof Shape];\n\nexport type NoPrimaryKeyOption = 'error' | 'warning' | 'ignore';\n\n// Options that are also available in `orchidORM` of the ORM\nexport interface DbSharedOptions extends QueryLogOptions {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n extensions?: (string | RecordString)[];\n domains?: {\n [K: string]: DbDomainArg<DefaultColumnTypes<DefaultSchemaConfig>>;\n };\n}\n\nexport type DbOptions<SchemaConfig extends ColumnSchemaConfig, ColumnTypes> = (\n | { adapter: Adapter }\n | Omit<AdapterOptions, 'log'>\n) &\n DbSharedOptions & {\n schemaConfig?: SchemaConfig;\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?:\n | ColumnTypes\n | ((t: DefaultColumnTypes<SchemaConfig>) => ColumnTypes);\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\n// Options of `createDb`.\nexport interface DbTableOptions<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends QueryLogOptions {\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 /**\n * See {@link ScopeMethods}\n */\n scopes?: DbTableOptionScopes<Table, Shape>;\n /**\n * See {@link SoftDeleteMethods}\n */\n softDelete?: SoftDeleteOption<Shape>;\n // table comment, for migrations generator\n comment?: string;\n}\n\n/**\n * See {@link ScopeMethods}\n */\nexport type DbTableOptionScopes<\n Table extends string | undefined,\n Shape extends QueryColumns,\n Keys extends string = string,\n> = { [K in Keys]: (q: ScopeArgumentQuery<Table, Shape>) => QueryBase };\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 QueryColumnsInit> = {\n [K in DefaultSelectColumns<Shape>[number]]: Shape[K]['outputType'];\n}[];\n\nexport interface Db<\n Table extends string | undefined = undefined,\n Shape extends QueryColumnsInit = QueryColumnsInit,\n PrimaryKeys = never,\n // union of records { column name: query input type }\n UniqueColumns = never,\n // union of tuples of column names\n UniqueColumnTuples = never,\n // union of primary keys and unique index names\n UniqueConstraints = never,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n ShapeWithComputed extends QueryColumnsInit = Shape,\n Scopes extends CoreQueryScopes | undefined = EmptyObject,\n> extends DbBase<Adapter, Table, Shape, ColumnTypes, ShapeWithComputed>,\n QueryMethods<ColumnTypes>,\n QueryBase {\n result: Pick<Shape, DefaultSelectColumns<Shape>[number]>; // Pick is optimal\n queryBuilder: Db;\n returnType: Query['returnType'];\n then: QueryThen<QueryDefaultReturnData<Shape>>;\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 as unknown extends Shape[K]['data']['default']\n ? never\n : K]: true;\n };\n scopes: { [K in keyof Scopes]: true };\n selectable: SelectableFromShape<ShapeWithComputed, Table>;\n };\n internal: QueryInternal<\n {\n [K in keyof PrimaryKeys]: (\n keyof PrimaryKeys extends K ? never : keyof PrimaryKeys\n ) extends never\n ? PrimaryKeys[K]\n : never;\n }[keyof PrimaryKeys],\n PrimaryKeys | UniqueColumns,\n | {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? K\n : never;\n }[keyof Shape]\n | keyof PrimaryKeys,\n UniqueColumnTuples,\n UniqueConstraints\n >;\n catch: QueryCatch;\n}\n\nexport const anyShape = {} as QueryColumnsInit;\n\nexport class Db<\n Table extends string | undefined = undefined,\n Shape extends QueryColumnsInit = QueryColumnsInit,\n PrimaryKeys = never,\n UniqueColumns = never,\n UniqueColumnTuples = never,\n UniqueConstraints = never,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n ShapeWithComputed extends QueryColumnsInit = 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<Table, ShapeWithComputed>,\n tableData: TableData = emptyObject,\n ) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const { softDelete } = options;\n const scopes = (\n options.scopes || softDelete ? {} : emptyObject\n ) as QueryScopes;\n\n this.internal = {\n transactionStorage,\n scopes,\n snakeCase: options.snakeCase,\n noPrimaryKey: options.noPrimaryKey === 'ignore',\n comment: options.comment,\n tableData,\n } as QueryInternal;\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] as unknown as ColumnTypeBase;\n column.data.key = key;\n\n if (column.parseFn) {\n hasParsers = true;\n parsers[key] = column.parseFn;\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 const { modifyQuery: mq } = column.data;\n if (mq) {\n modifyQuery = pushOrNewArray(modifyQuery, (q: Query) => mq(q, column));\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] as unknown as ColumnTypeBase;\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 QueryColumnsInit,\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 schema: options?.schema,\n } as QueryData;\n\n let shapeHasPrimaryKey: boolean | undefined;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n shapeHasPrimaryKey = true;\n\n if (this.internal.singlePrimaryKey) {\n this.internal.singlePrimaryKey = undefined as never;\n break;\n }\n\n this.internal.singlePrimaryKey = key as never;\n }\n }\n\n if (\n !shapeHasPrimaryKey &&\n !tableData.primaryKey &&\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 if (modifyQuery) {\n for (const cb of modifyQuery) {\n cb(this);\n }\n }\n\n this.error = class extends QueryError {\n constructor(message?: string) {\n super(self, message);\n }\n };\n\n if (options.scopes) {\n for (const key in options.scopes) {\n const q = options.scopes[key](this).q as SelectQueryData;\n\n (scopes as RecordUnknown)[key] = {\n and: q.and,\n or: q.or,\n };\n }\n\n if (scopes.default) {\n this.q.scopes = { default: scopes.default };\n }\n }\n\n if (softDelete) {\n enableSoftDelete(this, table, shape, softDelete, scopes);\n }\n }\n\n [inspect.custom]() {\n return `Query<${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;\n\n// Function to build a new table instance.\nexport type DbTableConstructor<ColumnTypes> = <\n Table extends string,\n Shape extends QueryColumnsInit,\n Data extends MaybeArray<TableDataItem>,\n Options extends DbTableOptions<Table, Shape>,\n>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n tableData?: TableDataFn<Shape, Data>,\n options?: Options,\n) => Db<\n Table,\n Shape,\n keyof ShapeColumnPrimaryKeys<Shape> extends never\n ? never\n : ShapeColumnPrimaryKeys<Shape>,\n ShapeUniqueColumns<Shape> | TableDataItemsUniqueColumns<Shape, Data>,\n TableDataItemsUniqueColumnTuples<Shape, Data>,\n UniqueConstraints<Shape> | TableDataItemsUniqueConstraints<Data>,\n EmptyObject,\n ColumnTypes,\n Shape,\n MapTableScopesOption<Options['scopes'], Options['softDelete']>\n>;\n\nexport type MapTableScopesOption<\n Scopes extends CoreQueryScopes | undefined,\n SoftDelete extends true | PropertyKey | undefined,\n> = {\n [K in\n | keyof Scopes\n | (SoftDelete extends true | PropertyKey ? 'nonDeleted' : never)]: unknown;\n};\n\nexport interface DbResult<ColumnTypes>\n extends Db<\n string,\n never,\n never,\n never,\n never,\n never,\n EmptyObject,\n ColumnTypes\n >,\n DbTableConstructor<ColumnTypes> {\n adapter: Adapter;\n close: Adapter['close'];\n}\n{\n}\n\n/**\n * If you'd like to use the query builder of OrchidORM as a standalone tool, install `pqb` package and use `createDb` to initialize it.\n *\n * As `Orchid ORM` focuses on ORM usage, docs examples mostly demonstrates how to work with ORM-defined tables,\n * but everything that's not related to table relations should also work with `pqb` query builder on its own.\n *\n * It is accepting the same options as `orchidORM` + options of `createBaseTable`:\n *\n * ```ts\n * import { createDb } from 'orchid-orm';\n *\n * import { zodSchemaConfig } from 'orchid-orm-schema-to-zod';\n * // or\n * import { SchemaConfig } from 'orchid-orm-valibot';\n *\n * const db = createDb({\n * // db connection options\n * databaseURL: process.env.DATABASE_URL,\n * log: true,\n *\n * // columns in db are in snake case:\n * snakeCase: true,\n *\n * // override default SQL for timestamp, see `nowSQL` above\n * nowSQL: `now() AT TIME ZONE 'UTC'`,\n *\n * // optional, but recommended: makes zod schemas for your tables\n * schemaConfig: zodSchemaConfig,\n * // or\n * schemaConfig: valibotSchemaConfig,\n *\n * // override column types:\n * columnTypes: (t) => ({\n * // by default timestamp is returned as a string, override to a number\n * timestamp: () => t.timestamp().asNumber(),\n * }),\n * });\n * ```\n *\n * After `db` is defined, construct queryable tables in such way:\n *\n * ```ts\n * export const User = db('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(3, 100),\n * password: t.text(8, 200),\n * age: t.integer().nullable(),\n * ...t.timestamps(),\n * }));\n * ```\n *\n * Now the `User` can be used for making type-safe queries:\n *\n * ```ts\n * const users = await User.select('id', 'name') // only known columns are allowed\n * .where({ age: { gte: 20 } }) // gte is available only on the numeric field, and the only number is allowed\n * .order({ createdAt: 'DESC' }) // type safe as well\n * .limit(10);\n *\n * // users array has a proper type of Array<{ id: number, name: string }>\n * ```\n *\n * The optional third argument is for table options:\n *\n * ```ts\n * const Table = db('table', (t) => ({ ...columns }), {\n * // provide this value if the table belongs to a specific database schema:\n * schema: 'customTableSchema',\n * // override `log` option of `createDb`:\n * log: true, // boolean or object described `createdDb` section\n * logger: { ... }, // override logger\n * noPrimaryKey: 'ignore', // override noPrimaryKey\n * snakeCase: true, // override snakeCase\n * })\n * ```\n */\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n logger,\n snakeCase,\n nowSQL,\n schemaConfig = defaultSchemaConfig as unknown as SchemaConfig,\n columnTypes: ctOrFn = makeColumnTypes(schemaConfig) as unknown as ColumnTypes,\n ...options\n}: DbOptions<SchemaConfig, 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 ? (\n ctOrFn as unknown as (\n t: DefaultColumnTypes<SchemaConfig>,\n ) => ColumnTypes\n )(makeColumnTypes(schemaConfig))\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 = _initQueryBuilder(\n adapter,\n ct,\n transactionStorage,\n commonOptions,\n options,\n );\n\n const tableConstructor: DbTableConstructor<ColumnTypes> = (\n table,\n shape,\n dataFn,\n options,\n ) =>\n new Db(\n adapter,\n qb as never,\n table,\n typeof shape === 'function'\n ? getColumnTypes(ct, shape, nowSQL, options?.language)\n : shape,\n ct,\n transactionStorage,\n { ...commonOptions, ...options },\n parseTableData(dataFn),\n ) as never;\n\n const db = Object.assign(tableConstructor, qb, {\n adapter,\n 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 RecordUnknown)[name] =\n Db.prototype[name as keyof typeof Db.prototype];\n }\n\n return db as never;\n};\n\nexport const _initQueryBuilder = (\n adapter: Adapter,\n columnTypes: unknown,\n transactionStorage: AsyncLocalStorage<TransactionState>,\n commonOptions: DbTableOptions<undefined, QueryColumns>,\n options: DbSharedOptions,\n): Db => {\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n transactionStorage,\n commonOptions,\n );\n\n if (options.extensions) {\n const arr: DbExtension[] = [];\n for (const x of options.extensions) {\n if (typeof x === 'string') {\n arr.push({ name: x });\n } else {\n for (const key in x) {\n arr.push({ name: key, version: x[key] });\n }\n }\n }\n qb.internal.extensions = arr;\n }\n\n qb.internal.domains = options.domains;\n\n return (qb.queryBuilder = qb as never);\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`.\ninterface 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`.\ninterface 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 {\n ColumnTypeBase,\n Expression,\n PickQueryTableMetaShape,\n QueryColumns,\n} from 'orchid-core';\n\n// Type of argument for computed columns, each value is a function returning an Expression.\nexport interface ComputedColumnsBase<T extends PickQueryTableMetaShape> {\n [K: string]: (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 PickQueryTableMetaShape,\n Computed extends ComputedColumnsBase<T>,\n Shape extends QueryColumns = {\n [K in keyof Computed]: ReturnType<Computed[K]>['result']['value'];\n },\n> = {\n [K in keyof T]: K extends 'shape'\n ? T['shape'] & Shape\n : K extends 'meta'\n ? T['meta'] & {\n selectable: SelectableFromShape<Shape, T['table']>;\n }\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 PickQueryTableMetaShape,\n Computed extends ComputedColumnsBase<T>,\n>(q: T, computed: Computed): QueryWithComputed<T, Computed> {\n const { shape } = q as unknown as Query;\n for (const key in computed) {\n const expr = computed[key](q);\n (shape as QueryColumns)[key] = expr.result.value as never;\n (expr.result.value as ColumnTypeBase).data.computed = expr;\n }\n\n return q as never;\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { ColumnInfoQueryData } from '../sql';\nimport { PickQueryMetaShape, QueryColumn, 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 GetColumnInfo} object or a Record with keys for column names and ColumnInfo objects as values.\n **/\nexport type SetQueryReturnsColumnInfo<\n T extends PickQueryMetaShape,\n Column extends keyof T['shape'] | undefined,\n Result = Column extends keyof T['shape']\n ? GetColumnInfo\n : { [K in keyof T['shape']]: GetColumnInfo },\n> =\n // Omit is optimal\n Omit<SetQueryKind<T, 'columnInfo'>, 'result' | 'returnType' | 'then'> & {\n result: { value: QueryColumn<Result> };\n returnType: 'value';\n then: QueryThen<Result>;\n };\n\n// column info pulled from a database\nexport type GetColumnInfo = {\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): GetColumnInfo => {\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\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 * import { getColumnInfo } from 'orchid-orm';\n *\n * // columnInfo has type Record<string, ColumnInfo>, where string is name of columns\n * const columnInfo = await getColumnInfo(db.table);\n *\n * // singleColumnInfo has the type ColumnInfo\n * const singleColumnInfo = await getColumnInfo(db.table, 'name');\n * ```\n *\n * @param column - optional: select info for only a single column if provided, or for all table columns if not\n */\nexport function getColumnInfo<\n T extends PickQueryMetaShape,\n Column extends keyof T['shape'] | undefined = undefined,\n>(query: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n const q = (query as unknown as Query).clone();\n q.q.type = 'columnInfo';\n q.q.returnType = 'all';\n\n if (column) {\n (q.q as ColumnInfoQueryData).column = column as string;\n }\n\n q.q.handleResult = (_, _t, result) => {\n if (column) {\n return rowToColumnInfo(result.rows[0]);\n } else {\n const info: { [K: string]: GetColumnInfo } = {};\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 q as unknown as SetQueryReturnsColumnInfo<T, Column>;\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { CopyOptions } from '../sql';\nimport { PickQueryMeta, PickQueryMetaShape, PickQueryShape } from 'orchid-core';\n\n// argument of the `copy` function can accept various options\ntype CopyArg<T extends PickQueryShape> = CopyOptions<keyof T['shape']>;\n\n// Result type for the `copy` method, simply setting a query kind.\ntype CopyResult<T extends PickQueryMeta> = SetQueryKind<T, 'copy'>;\n\n/**\n * `copyTableData` is a function 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 * import { copyTableData } from 'orchid-orm';\n *\n * await copyTableData(db.table, {\n * columns: ['id', 'title', 'description'],\n * from: 'path-to-file',\n * });\n * ```\n *\n * @param arg - object with copy options\n */\nexport function copyTableData<T extends PickQueryMetaShape>(\n query: T,\n arg: CopyArg<T>,\n): CopyResult<T> {\n const q = (query as unknown as Query).clone();\n Object.assign(q.q, {\n type: 'copy',\n copy: arg,\n });\n return q as never;\n}\n"],"names":["Expression","RawSQLBase","i","emptyObject","ExpressionTypeMethod","isTemplateLiteralArgs","args","ColumnTypeBase","setColumnData","pushColumnData","__spreadValues","__spreadProps","quoteObjectKey","toArray","singleQuote","addCode","hasOptions","singleQuoteArray","objectHasValues","columnDefaultArgumentToCode","columnErrorMessagesToCode","getValueKey","quoteValue","addValue","isExpression","joinTruthy","numberDataToCode","stringDataToCode","getDefaultLanguage","dateDataToCode","col","pushOrNewArrayToObject","query","table","value","returnArg","noop","require","shape","arrayDataToCode","commitSql","rollbackSql","emptyArray","result","fn","resolve","reject","trx","callWithThis","applyTransforms","setParserToQuery","q","key","isRawSQL","_a","sql","pushOrNewArray","quotedColumns","quotedAs","setDefaultNowFn","setDefaultLanguage","setCurrentColumnName","makeTimestampsHelpers","types","__objRest","setAdapterConnectRetry","performQuery","values","handleResult","isObjectEmpty","ValExpression","applyMixins","toSnakeCase","options","inspect","_b","snakeCaseKey","AsyncLocalStorage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/sql/rawSql.ts","../src/columns/columnType.ts","../src/columns/columnType.utils.ts","../src/columns/code.ts","../src/sql/utils.ts","../src/columns/operators.ts","../src/columns/number.ts","../src/columns/string.ts","../src/columns/dateTime.ts","../src/columns/boolean.ts","../src/columns/json.ts","../src/query/query.ts","../src/sql/common.ts","../src/sql/distinct.ts","../src/errors.ts","../src/query/queryUtils.ts","../src/sql/where.ts","../src/sql/join.ts","../src/queryMethods/join/processJoinArgs.ts","../src/queryMethods/none.ts","../src/queryMethods/join/_join.ts","../src/columns/enum.ts","../src/columns/array.ts","../src/columns/defaultSchemaConfig.ts","../src/queryMethods/transaction.ts","../src/queryMethods/then.ts","../src/queryMethods/select.ts","../src/common/selectItemExpression.ts","../src/queryMethods/get.utils.ts","../src/queryMethods/as.ts","../src/queryMethods/from.ts","../src/queryMethods/queryMethods.utils.ts","../src/queryMethods/json.utils.ts","../src/sql/select.ts","../src/sql/orderBy.ts","../src/sql/window.ts","../src/sql/having.ts","../src/sql/with.ts","../src/sql/types.ts","../src/sql/fromAndAs.ts","../src/sql/constants.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/columns/customType.ts","../src/columns/columnTypes.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/queryMethods/clear.ts","../src/queryMethods/create.ts","../src/queryMethods/delete.ts","../src/queryMethods/for.ts","../src/queryMethods/get.ts","../src/queryMethods/having.ts","../src/queryMethods/hooks.ts","../src/queryMethods/join/join.ts","../src/queryMethods/json.ts","../src/queryMethods/log.ts","../src/queryMethods/merge.ts","../src/queryMethods/union.ts","../src/queryMethods/with.ts","../src/queryMethods/where/where.ts","../src/queryMethods/update.ts","../src/queryMethods/search.ts","../src/queryMethods/upsertOrCreate.ts","../src/queryMethods/sql.ts","../src/query/queryBase.ts","../src/queryMethods/transform.ts","../src/queryMethods/map.ts","../src/queryMethods/scope.ts","../src/queryMethods/softDelete.ts","../src/queryMethods/expressions.ts","../src/queryMethods/queryMethods.ts","../src/tableData.ts","../src/query/db.ts","../src/testTransaction.ts","../src/modules/computed.ts","../src/modules/getColumnInfo.ts","../src/modules/copyTableData.ts"],"sourcesContent":["import {\n ColumnSchemaConfig,\n DynamicSQLArg,\n emptyObject,\n Expression,\n ExpressionChain,\n ExpressionTypeMethod,\n isTemplateLiteralArgs,\n QueryColumn,\n RawSQLBase,\n RawSQLValues,\n RecordUnknown,\n SQLArgs,\n SQLQueryArgs,\n StaticSQLArgs,\n TemplateLiteralArgs,\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 QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\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 this.result = { value: type as T };\n if (type) {\n Object.assign(this, type.operators);\n }\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 QueryColumn>\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 QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n declare columnTypes: ColumnTypes;\n result: { value: T } = emptyObject as { value: T };\n q: { chain?: ExpressionChain } = {};\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 = never>(...args: StaticSQLArgs): RawSQL<QueryColumn<T>>;\nexport function raw<T = never>(\n ...args: [DynamicSQLArg]\n): DynamicRawSQL<QueryColumn<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\nexport function sqlQueryArgsToExpression(\n args: SQLQueryArgs,\n): RawSQL<QueryColumn> {\n return Array.isArray(args[0])\n ? new RawSQL(args as TemplateLiteralArgs)\n : (args[0] as never);\n}\n\nexport type SqlFn = <\n T,\n Args extends\n | [sql: TemplateStringsArray, ...values: unknown[]]\n | [sql: string]\n | [values: RecordUnknown, sql?: string],\n>(\n this: T,\n ...args: Args\n) => Args extends [RecordUnknown]\n ? (...sql: TemplateLiteralArgs) => RawSQLBase<QueryColumn, T>\n : RawSQLBase<QueryColumn, T>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sqlFn: SqlFn = (...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 RecordUnknown);\n};\n","import { Query } from '../query/query';\nimport {\n ColumnDataBase,\n ColumnNameOfTable,\n ColumnTypeBase,\n ColumnTypeSchemaArg,\n emptyObject,\n ForeignKeyTable,\n PickColumnBaseData,\n PrimaryKeyColumn,\n pushColumnData,\n QueryBaseCommon,\n RawSQLBase,\n setColumnData,\n StaticSQLArgs,\n UniqueColumn,\n} from 'orchid-core';\nimport { raw } from '../sql/rawSql';\nimport { TableData } from '../tableData';\n\n// type of data for ColumnType\nexport interface ColumnData extends ColumnDataBase {\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: TableData.ColumnIndex[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: TableData.ColumnReferences[];\n identity?: TableData.Identity;\n // raw SQL for a generated column\n generated?: RawSQLBase;\n}\n\nexport interface ColumnFromDbParams {\n isNullable?: boolean;\n default?: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n compression?: string;\n collate?: string;\n}\n\nexport interface PickColumnData {\n data: ColumnData;\n}\n\nexport abstract class ColumnType<\n Schema extends ColumnTypeSchemaArg = ColumnTypeSchemaArg,\n Type = unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InputSchema = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Ops = any,\n InputType = Type,\n OutputType = Type,\n OutputSchema = InputSchema,\n QueryType = InputType,\n QuerySchema = InputSchema,\n> extends ColumnTypeBase<\n Schema,\n Type,\n InputSchema,\n Ops,\n InputType,\n OutputType,\n OutputSchema,\n QueryType,\n QuerySchema,\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 * // database-level name can be passed:\n * id: t.uuid().primaryKey('primary_key_name'),\n * }));\n * }\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n *\n * @param name - to specify a constraint name\n */\n primaryKey<T extends PickColumnBaseData, Name extends string>(\n this: T,\n name?: Name,\n ): PrimaryKeyColumn<T, Name> {\n return setColumnData(this, 'primaryKey', name ?? (true as never)) as never;\n }\n\n /**\n * Defines a reference between different tables to enforce data integrity.\n *\n * In [snakeCase](/guide/orm-and-query-builder.html#snakecase-option) 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 migration it's different from OrchidORM table code where a callback with a table is expected:\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 *\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(), // string is varchar(255)\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,\n Table extends ForeignKeyTable,\n Column extends ColumnNameOfTable<Table>,\n >(\n this: T,\n fn: () => Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey<T, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey(\n fnOrTable: TableData.References.FnOrTable,\n column: string,\n options: TableData.References.Options = emptyObject,\n ) {\n return pushColumnData(this, 'foreignKeys', {\n fnOrTable,\n foreignColumns: [column],\n options,\n });\n }\n\n toSQL(): string {\n return this.dataType;\n }\n\n /**\n * Add an index to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // add an index to the name column with default settings:\n * name: t.text().index(),\n * // options are described below:\n * name: t.text().index({ ...options }),\n * // with a database-level name:\n * name: t.text().index('custom_index_name'),\n * // with name and options:\n * name: t.text().index('custom_index_name', { ...options }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * type IndexOptions = {\n * // NULLS NOT DISTINCT: availabe in Postgres 15+, makes sense only for unique index\n * nullsNotDistinct?: true;\n * // index algorithm to use such as GIST, GIN\n * using?: string;\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // include columns to an index to optimize specific queries\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the index. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the index\n * where?: string;\n * // mode is for dropping the index\n * mode?: 'CASCADE' | 'RESTRICT';\n * };\n * ```\n *\n * @param args\n */\n index<T extends PickColumnData>(\n this: T,\n ...args:\n | [options?: TableData.Index.ColumnArg]\n | [name: string, options?: TableData.Index.ColumnArg]\n ): T {\n return pushColumnData(this, 'indexes', {\n options: (typeof args[0] === 'string' ? args[1] : args[0]) ?? emptyObject,\n name: typeof args[0] === 'string' ? args[0] : undefined,\n });\n }\n\n /**\n * `searchIndex` is designed for [full text search](/guide/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` database type.\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.text(),\n * body: t.text(),\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', \"title\" || ' ' || \"body\"))\n * ```\n *\n * You can set different search weights (`A` to `D`) on different columns inside the index:\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.text(),\n * body: t.text(),\n * ...t.searchIndex([\n * { column: 'title', weight: 'A' },\n * { column: 'body', weight: 'B' },\n * ]),\n * }));\n * });\n * ```\n *\n * When the table has localized columns,\n * you can define different indexes for different languages by setting the `language` parameter:\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 * titleEn: t.text(),\n * bodyEn: t.text(),\n * titleFr: t.text(),\n * bodyFr: t.text(),\n * ...t.searchIndex(['titleEn', 'bodyEn'], { language: 'english' }),\n * ...t.searchIndex(['titleFr', 'bodyFr'], { language: 'french' }),\n * }));\n * });\n * ```\n *\n * Alternatively, different table records may correspond to a single language,\n * then you can define a search index that relies on a language column by using `languageColumn` parameter:\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 * lang: t.type('regconfig'),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body'], { languageColumn: 'lang' }),\n * }));\n * });\n * ```\n *\n * It can be more efficient to use a [generated](/guide/migration-column-methods.html#generated-column) column instead of indexing text column in the way described above,\n * and to set a `searchIndex` on it:\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.text(),\n * body: t.text(),\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 { data: ColumnType['data']; dataType: string }>(\n this: T,\n ...args:\n | [options?: TableData.Index.TsVectorColumnArg]\n | [name: string, options?: TableData.Index.TsVectorColumnArg]\n ): T {\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof args[0] === 'string' ? args[1] : args[0]),\n ...(this.dataType === 'tsvector'\n ? { using: 'GIN' }\n : { tsVector: true }),\n },\n name: typeof args[0] === 'string' ? args[0] : undefined,\n });\n }\n\n unique<T extends PickColumnData, Name extends string>(\n this: T,\n ...args:\n | [options?: TableData.Index.UniqueColumnArg]\n | [name: Name, options?: TableData.Index.UniqueColumnArg]\n ): UniqueColumn<T, Name> {\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof args[0] === 'string' ? args[1] : args[0]),\n unique: true,\n },\n name: typeof args[0] === 'string' ? args[0] : undefined,\n }) as never;\n }\n\n comment<T extends PickColumnData>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n compression<T extends PickColumnData>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends PickColumnData>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends PickColumnData>(this: T, cb: (q: Query) => void): T {\n return setColumnData(\n this,\n 'modifyQuery',\n cb as (q: QueryBaseCommon) => void,\n );\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 PickColumnData>(this: T, ...args: StaticSQLArgs): T {\n return setColumnData(this, 'generated', raw(...args));\n }\n}\n","import { RawSQL } from '../sql/rawSql';\nimport { ColumnFromDbParams } from './columnType';\nimport { ColumnTypeBase, RecordString, TemplateLiteralArgs } from 'orchid-core';\n\nconst knownDefaults: RecordString = {\n current_timestamp: 'now()',\n 'transaction_timestamp()': 'now()',\n};\n\nexport const simplifyColumnDefault = (value?: string) => {\n if (typeof value === 'string') {\n return new RawSQL([\n [knownDefaults[value.toLowerCase()] || value],\n ] as unknown as TemplateLiteralArgs);\n }\n return;\n};\n\nexport const instantiateColumn = (\n typeFn: () => ColumnTypeBase,\n params: ColumnFromDbParams,\n): ColumnTypeBase => {\n const column = typeFn();\n\n const { dateTimePrecision } = params;\n\n Object.assign(column.data, {\n ...params,\n dateTimePrecision:\n // 0 is default for date, 6 is default for timestamp\n dateTimePrecision && dateTimePrecision !== 6\n ? dateTimePrecision\n : undefined,\n collate: params.collate,\n default: simplifyColumnDefault(params.default),\n });\n\n return column as unknown as ColumnTypeBase;\n};\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n addCode,\n Code,\n columnDefaultArgumentToCode,\n columnErrorMessagesToCode,\n ColumnsShapeBase,\n ColumnTypeBase,\n objectHasValues,\n quoteObjectKey,\n singleQuote,\n singleQuoteArray,\n toArray,\n RawSQLBase,\n ColumnDataCheckBase,\n Codes,\n emptyObject,\n} from 'orchid-core';\nimport { TableData } from '../tableData';\n\nexport const 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 t: string,\n): Codes => {\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 return code;\n};\n\nexport const pushTableDataCode = (code: Codes, ast: TableData): Codes => {\n const lines: Codes[] = [];\n\n if (ast.primaryKey) {\n lines.push([primaryKeyInnerToCode(ast.primaryKey, 't') + ',']);\n }\n\n if (ast.indexes) {\n for (const index of ast.indexes) {\n lines.push(indexToCode(index, 't'));\n }\n }\n\n if (ast.constraints) {\n for (const constraint of ast.constraints) {\n lines.push(constraintToCode(constraint, 't', true));\n }\n }\n\n if (lines.length > 1) {\n code.push('(t) => [', ...lines, '],');\n } else if (lines[0].length === 1 && typeof lines[0][0] === 'string') {\n code.push('(t) => ' + lines[0][0]);\n } else {\n code.push('(t) => ', lines[0]);\n }\n\n return code;\n};\n\nexport const primaryKeyInnerToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.name;\n\n return `${t}.primaryKey([${primaryKey.columns.map(singleQuote).join(', ')}]${\n name ? `, ${singleQuote(name)}` : ''\n })`;\n};\n\nexport const indexToCode = (\n index: TableData.Index,\n t: string,\n prefix?: string,\n): Codes => {\n const code = indexInnerToCode(index, t);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(',')) addCode(code, ',');\n return code;\n};\n\nexport const indexInnerToCode = (index: TableData.Index, t: string): Codes => {\n const code: Codes = [];\n\n code.push(\n `${t}.${\n index.options.tsVector\n ? 'searchIndex'\n : index.options.unique\n ? 'unique'\n : 'index'\n }(`,\n );\n\n const columnOptions = ['collate', 'opclass', 'order', 'weight'] as const;\n\n const indexOptionsKeys: (undefined | keyof TableData.Index.Options)[] = [\n index.options.tsVector ? 'unique' : undefined,\n 'using',\n 'nullsNotDistinct',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'language',\n 'languageColumn',\n 'dropMode',\n ];\n\n const hasOptions = indexOptionsKeys.some((key) => key && index.options[key]);\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\n if (columnsMultiline) {\n const objects: Codes = [];\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') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Codes = [\n `${'column' in column ? 'column' : 'expression'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, hasOptions || index.name ? '],' : ']']);\n\n if (index.name) {\n addCode(code, ` ${singleQuote(index.name)},`);\n }\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n\n if (index.name) {\n addCode(code, `, ${singleQuote(index.name)}`);\n }\n }\n\n if (hasOptions) {\n if (columnsMultiline) {\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key of indexOptionsKeys) {\n if (!key) continue;\n\n const value = index.options[key];\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 m?: boolean,\n prefix?: string,\n): Codes => {\n const code = constraintInnerToCode(item, t, m);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(','))\n code[code.length - 1] += ',';\n return code;\n};\n\nexport const constraintInnerToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n): Codes => {\n if (item.references) {\n return [\n `${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name, m),\n '),',\n ];\n }\n\n return [\n `${t}.check(${(item.check as TableData.Check).toCode(t)}${\n item.name ? `, ${singleQuote(item.name)}` : ''\n })`,\n ];\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 m?: boolean,\n): Codes => {\n const args: Codes = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n if (m && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\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: TableData.ColumnReferences[],\n migration: boolean | undefined,\n): Codes => {\n const code: Codes = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey, migration)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n {\n fnOrTable,\n foreignColumns,\n options = emptyObject,\n }: TableData.ColumnReferences,\n migration: boolean | undefined,\n): Codes => {\n const code: Code = [];\n\n if (migration && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n code.push(\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString(),\n );\n\n addCode(code, `, ${singleQuote(foreignColumns[0])}`);\n\n const hasOptions =\n options.name || options.match || options.onUpdate || options.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (options.name) arr.push(`name: ${singleQuote(options.name)},`);\n if (options.match) arr.push(`match: ${singleQuote(options.match)},`);\n if (options.onUpdate)\n arr.push(`onUpdate: ${singleQuote(options.onUpdate)},`);\n if (options.onDelete)\n arr.push(`onDelete: ${singleQuote(options.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): Codes => {\n const code: Codes = [];\n for (const { options, name } of indexes) {\n addCode(code, `.${options.unique ? 'unique' : 'index'}(`);\n\n const arr: string[] = [];\n\n if (options.collate) arr.push(`collate: ${singleQuote(options.collate)},`);\n if (options.opclass) arr.push(`opclass: ${singleQuote(options.opclass)},`);\n if (options.order) arr.push(`order: ${singleQuote(options.order)},`);\n if (name) arr.push(`name: ${singleQuote(name)},`);\n if (options.using) arr.push(`using: ${singleQuote(options.using)},`);\n if (options.include)\n arr.push(\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n );\n if (options.nullsNotDistinct) arr.push(`nullsNotDistinct: true,`);\n if (options.with) arr.push(`with: ${singleQuote(options.with)},`);\n if (options.tablespace)\n arr.push(`tablespace: ${singleQuote(options.tablespace)},`);\n if (options.where) arr.push(`where: ${singleQuote(options.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 = (\n t: string,\n { sql, name }: ColumnDataCheckBase,\n): string => {\n return `.check(${sql.toCode(t)}${name ? `, { name: '${name}' }` : ''})`;\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Codes = [];\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.increment && identity.increment !== 1)\n props.push(`increment: ${identity.increment},`);\n if (identity.start && identity.start !== 1)\n props.push(`start: ${identity.start},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache && identity.cache !== 1)\n props.push(`cache: ${identity.cache},`);\n if (identity.cycle) props.push(`cycle: true,`);\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 migration: boolean | undefined,\n data = type.data,\n skip?: { 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.primaryKey) {\n addCode(\n code,\n `.primaryKey(${\n data.primaryKey === (true as never) ? '' : singleQuote(data.primaryKey)\n })`,\n );\n }\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(data.foreignKeys, migration)) {\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 (\n data.default !== undefined &&\n (!migration || typeof data.default !== 'function')\n ) {\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 code.length === 1 && typeof code[0] === 'string' ? code[0] : code;\n};\n","import { Sql } from 'orchid-core';\n\nexport const getSqlText = (sql: Sql) => {\n if ('text' in sql) return sql.text;\n throw new Error(`Batch SQL is not supported in this query`);\n};\n","import {\n PickQueryBaseQuery,\n PickQueryColumnTypes,\n PickQueryQ,\n PickQueryResultColumnTypes,\n Query,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { ToSQLCtx } from '../sql';\nimport { getSqlText } from '../sql/utils';\nimport {\n addValue,\n ColumnTypeBase,\n Expression,\n getValueKey,\n isExpression,\n MaybeArray,\n PickOutputTypeAndOperators,\n PickQueryResult,\n QueryColumn,\n RecordUnknown,\n} from 'orchid-core';\nimport { BooleanQueryColumn } from '../queryMethods';\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 interface Operator<\n Value,\n Column extends PickOutputTypeAndOperators = PickOutputTypeAndOperators,\n> {\n <T extends PickQueryResult>(this: T, arg: Value):\n | Omit<\n SetQueryReturnsColumnOrThrow<T, Column>,\n keyof T['result']['value']['operators']\n > &\n Column['operators'];\n // argument type of the function\n _opType: Value;\n}\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 **not** dropped from the query.\nexport function setQueryOperators(\n query: PickQueryBaseQuery,\n operators: RecordUnknown,\n) {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.operators !== operators) {\n q.operators = operators;\n Object.assign(query, operators);\n }\n\n return query;\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\nconst make = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any, ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: Query, value: any) {\n (this.q.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 as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\n};\n\nconst makeVarArg = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any[], ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: Query, ...args: any[]) {\n (this.q.chain ??= []).push(_op, args);\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 as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\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 `(${getSqlText((arg as Query).toSQL({ values: ctx.values }))})`;\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\n// common operators that exist for any types\ninterface Base<Value> {\n equals: Operator<Value | Query | Expression, BooleanQueryColumn>;\n not: Operator<Value | Query | Expression, BooleanQueryColumn>;\n in: Operator<Value[] | Query | Expression, BooleanQueryColumn>;\n notIn: Operator<Value[] | Query | Expression, BooleanQueryColumn>;\n}\n\nconst base: Base<unknown> = {\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};\n\ninterface OperatorsBooleanSelf extends OperatorsBoolean {\n result: { value: BooleanQueryColumn };\n}\n\n// Boolean type operators\nexport interface OperatorsBoolean extends Base<boolean> {\n and: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n or: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\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 OperatorsBoolean;\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\ninterface Ord<Value> extends Base<Value> {\n lt: Operator<Value | Query | Expression, BooleanQueryColumn>;\n lte: Operator<Value | Query | Expression, BooleanQueryColumn>;\n gt: Operator<Value | Query | Expression, BooleanQueryColumn>;\n gte: Operator<Value | Query | Expression, BooleanQueryColumn>;\n between: Operator<\n [Value | Query | Expression, Value | Query | Expression],\n BooleanQueryColumn\n >;\n}\n\nexport type OperatorsNumber = 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(\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 OperatorsNumber;\n\n// Text type operators\nexport interface OperatorsText extends Base<string> {\n contains: Operator<string | Query | Expression, BooleanQueryColumn>;\n containsSensitive: Operator<string | Query | Expression, BooleanQueryColumn>;\n startsWith: Operator<string | Query | Expression, BooleanQueryColumn>;\n startsWithSensitive: Operator<\n string | Query | Expression,\n BooleanQueryColumn\n >;\n endsWith: Operator<string | Query | Expression, BooleanQueryColumn>;\n endsWithSensitive: Operator<string | Query | Expression, BooleanQueryColumn>;\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 OperatorsText;\n\ninterface JsonPathQueryOptions {\n vars?: RecordUnknown;\n silent?: boolean;\n}\n\ninterface JsonPathQueryTypeOptions<\n T extends PickQueryColumnTypes,\n C extends QueryColumn,\n> extends JsonPathQueryOptions {\n type?: (types: T['columnTypes']) => C;\n}\n\ninterface JsonPathQuery {\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * Calls the [jsonb_path_query_first](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * Type can be provided via `{ type: (t) => t.columnType() }` options, by default the type is `unknown`.\n *\n * Optionally takes `vars` and `silent` parameters, see [Postgres docs](https://www.postgresql.org/docs/current/functions-json.html) for details.\n *\n * ```ts\n * // query a single value from a JSON data,\n * // because of the provided type, string JSON value will be parsed to a Date object.\n * const value = await db.table\n * .get('data')\n * .jsonPathQueryFirst('$.path.to.date', { type: (t) => t.date().asDate() });\n *\n * // using it in a select\n * const records = await db.table.select({\n * date: (q) =>\n * q.get('data').jsonPathQueryFirst('$[*] ? (@ = key)', {\n * type: (t) => t.integer(),\n * // defining `vars` and `silent`\n * vars: { key: 'key' },\n * silent: true,\n * }),\n * });\n *\n * // using it in `where`\n * const filtered = await db.table.where((q) =>\n * // filtering records by the `name` property from the `data` JSON column\n * q.get('data').jsonPathQueryFirst('$.name').equals('name'),\n * );\n *\n * // using it in update\n * await db.table.find(id).update({\n * // using data property to set the `name` column\n * name: (q) =>\n * q.get('data').jsonPathQueryFirst('$.name', { type: (t) => t.string() }),\n * });\n * ```\n *\n * @param path - JSON path\n * @param options - can have type, vars, silent\n */\n <\n T extends PickQueryResultColumnTypes,\n C extends QueryColumn = QueryColumn<unknown, OperatorsAny>,\n >(\n this: T,\n path: string,\n options?: JsonPathQueryTypeOptions<T, C>,\n ): Omit<\n SetQueryReturnsColumnOrThrow<T, C>,\n keyof T['result']['value']['operators']\n > &\n C['operators'];\n\n // disallow it from `where`\n _opType: never;\n}\n\n// JSON type operators\nexport interface OperatorsJson extends Base<unknown> {\n jsonPathQueryFirst: JsonPathQuery;\n jsonSupersetOf: Operator<unknown | Query | Expression, BooleanQueryColumn>;\n jsonSubsetOf: Operator<unknown | Query | Expression, BooleanQueryColumn>;\n jsonSet: {\n /**\n * Returns a JSON value/object/array where a given value is set at the given path.\n * The path is a key or an array of keys to access the value.\n *\n * Calls the [jsonb_set](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], 'new value'),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonReplace: {\n /**\n * The same as {@link jsonSet}, but sets the last argument of `jsonb_set` to false,\n * so this function only has effect when the value already existed in the JSON.\n *\n * ```ts\n * await db.table.find(id).update({\n * // data.path.to.value will be updated only if it already was defined\n * data: (q) => q.get('data').jsonReplace(['path', 'to', 'value'], 'new value'),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonInsert: {\n /**\n * Inserts a value into a given position of JSON array and returns the whole array.\n * The path is a key or an array of keys to access the value.\n *\n * If a value exists at the given path, the value is not replaced.\n *\n * Provide `{ after: true }` option to insert a value after a given position.\n *\n * Calls the [jsonb_insert](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // update the record with data { tags: ['two'] } to have data { tags: ['one', 'two'] }\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 0], 'one'),\n * });\n *\n * // add 'three' after 'two'\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 1], 'three', { after: true }),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to insert\n * @param options - can have `after: true`\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n options?: { after?: boolean },\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonRemove: {\n /**\n * Remove a value from a JSON object or array at a given path.\n * The path is a key or an array of keys to access the value.\n *\n * Uses the [#-](https://www.postgresql.org/docs/current/functions-json.html) Postgres operator.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // the record has data { tags: ['one', 'two'] }\n * // removing the first tag, the data will be { tags: ['two'] }\n * const result = await db.table.find(id).update({\n * data: (q) => q.get('data').jsonRemove(['tags', 0]),\n * });\n * ```\n *\n * @param path - key or array of keys\n */\n <T extends PickQueryResult>(this: T, path: MaybeArray<string | number>): T;\n // disallow it from `where`\n _opType: never;\n };\n}\n\nconst encodeJsonPath = (ctx: ToSQLCtx, path: MaybeArray<string | number>) =>\n addValue(ctx.values, `{${Array.isArray(path) ? path.join(', ') : path}}`);\n\nconst jsonPathQueryOp = (\n key: string,\n [path, options]: [path: string, options?: JsonPathQueryOptions],\n ctx: ToSQLCtx,\n) =>\n `jsonb_path_query_first(${key}, ${addValue(ctx.values, path)}${\n options?.vars\n ? `, ${addValue(ctx.values, JSON.stringify(options.vars))}${\n options.silent ? ', true' : ''\n }`\n : options?.silent\n ? ', NULL, true'\n : ''\n })`;\n\nconst json = {\n ...base,\n jsonPathQueryFirst: Object.assign(\n function (\n this: Query,\n path: string,\n options?: JsonPathQueryTypeOptions<PickQueryColumnTypes, ColumnTypeBase>,\n ) {\n (this.q.chain ??= []).push(jsonPathQueryOp, [path, options]);\n\n if (this.q.parsers?.[getValueKey]) {\n this.q.parsers[getValueKey] = undefined;\n }\n\n if (options?.type) {\n const parse = options.type(this.columnTypes).parseFn;\n if (parse) (this.q.parsers ??= {})[getValueKey] = parse;\n }\n\n return this;\n },\n { _op: jsonPathQueryOp },\n ) as never,\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 jsonSet: makeVarArg(\n (key, [path, value], ctx) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )})`,\n ),\n jsonReplace: makeVarArg(\n (key, [path, value], ctx) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )}, false)`,\n ),\n jsonInsert: makeVarArg(\n (key, [path, value, options], ctx) =>\n `jsonb_insert(${key}, ${encodeJsonPath(ctx, path)}, ${addValue(\n ctx.values,\n JSON.stringify(value),\n )}${options?.after ? ', true' : ''})`,\n ),\n jsonRemove: makeVarArg(\n (key, [path], ctx) => `(${key} #- ${encodeJsonPath(ctx, path)})`,\n ),\n} as OperatorsJson;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsAny = Base<any>;\nexport type OperatorsDate = Ord<Date | string>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsArray = Base<any>;\n\nexport type OperatorsTime = Ord<string>;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators: {\n any: OperatorsAny;\n boolean: OperatorsBoolean;\n number: OperatorsNumber;\n date: OperatorsDate;\n time: OperatorsTime;\n text: OperatorsText;\n json: OperatorsJson;\n array: OperatorsArray;\n} = {\n any: base,\n boolean,\n number: numeric,\n date: numeric,\n time: numeric,\n text,\n json,\n array: base,\n} as never;\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n Code,\n Expression,\n joinTruthy,\n BaseNumberData,\n numberDataToCode,\n setColumnData,\n addCode,\n ColumnWithDefault,\n ColumnSchemaConfig,\n PickColumnBaseData,\n Codes,\n} from 'orchid-core';\nimport { columnCode, identityToCode } from './code';\nimport { Operators, OperatorsNumber } from './operators';\nimport { TableData } from '../tableData';\n\nexport interface NumberColumnData extends BaseNumberData {\n identity: TableData.Identity;\n}\n\nexport interface SerialColumnData extends NumberColumnData {\n default: Expression;\n}\n\nexport abstract class NumberBaseColumn<\n Schema extends ColumnSchemaConfig,\n SchemaType extends Schema['type'],\n> extends ColumnType<Schema, number, SchemaType, OperatorsNumber> {\n declare data: NumberColumnData;\n operators = Operators.number;\n}\n\nexport abstract class IntegerBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['int']>> {\n declare data: NumberColumnData;\n constructor(schema: Schema) {\n super(schema, schema.int() as never);\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsNumber\n> {\n operators = Operators.number;\n declare data: ColumnData;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n}\n\nexport interface DecimalColumnData extends ColumnData {\n numericPrecision?: number;\n numericScale?: number;\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsNumber\n> {\n declare data: DecimalColumnData;\n operators = Operators.number;\n dataType = 'numeric' as const;\n\n constructor(\n schema: Schema,\n numericPrecision?: number,\n numericScale?: number,\n ) {\n super(schema, schema.stringSchema() as never);\n this.data.numericPrecision = numericPrecision;\n this.data.numericScale = numericScale;\n this.data.alias = 'decimal';\n }\n\n toCode(t: string, m?: boolean): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n t,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n m,\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 = (\n column: ColumnType,\n t: string,\n alias: string,\n m: boolean | undefined,\n): Code => {\n let code: Codes;\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, alias);\n } else {\n code = [`${alias}()`];\n }\n\n addCode(code, numberDataToCode(column.data, m, skipNumberMethods));\n\n return columnCode(column, t, code, m);\n};\n\nexport type IdentityColumn<T extends PickColumnBaseData> = ColumnWithDefault<\n T,\n Expression\n>;\n\n// signed two-byte integer\nexport class SmallIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'smallint';\n }\n\n parseItem = parseInt;\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'smallint', m);\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<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'integer';\n }\n\n parseItem = parseInt;\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'integer', m);\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<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toCode(t: string, m?: boolean): Code {\n return intToCode(this, t, 'bigint', m);\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// single precision floating-point number (4 bytes)\nexport class RealColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['number']>> {\n dataType = 'float4' as const;\n parseItem = parseFloat;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n this.data.alias = 'real';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `real()${numberDataToCode(this.data, m)}`, m);\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'float8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'doublePrecision';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `doublePrecision()`, m);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'smallSerial';\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `smallSerial()${numberDataToCode(this.data, m, skipNumberMethods)}`,\n m,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n parseItem = parseInt;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'serial';\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `serial()${numberDataToCode(this.data, m, skipNumberMethods)}`,\n m,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `bigSerial()`, m);\n }\n}\n","import { ColumnData, ColumnType, PickColumnData } from './columnType';\nimport { NumberBaseColumn } from './number';\nimport {\n Code,\n joinTruthy,\n StringTypeData,\n stringDataToCode,\n PrimaryKeyColumn,\n TemplateLiteralArgs,\n getDefaultLanguage,\n RawSQLBase,\n StaticSQLArgs,\n ColumnSchemaConfig,\n PickColumnBaseData,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { RawSQL } from '../sql/rawSql';\nimport { SearchWeightRecord } from '../sql';\nimport { Operators, OperatorsText } from './operators';\n\nexport type TextColumnData = StringTypeData;\n\nexport abstract class TextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n declare data: TextColumnData;\n operators = Operators.text;\n\n constructor(\n schema: Schema,\n schemaType: ReturnType<\n Schema['stringSchema']\n > = schema.stringSchema() as never,\n ) {\n super(schema, schemaType);\n }\n}\n\nexport abstract class LimitedTextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n declare data: TextColumnData & { maxChars?: number };\n\n constructor(schema: Schema, limit: number) {\n super(schema, schema.stringMax(limit) as never);\n this.data.maxChars = limit;\n }\n\n toSQL() {\n return joinTruthy(this.dataType, `(${this.data.maxChars})`);\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'varchar' as const;\n toCode(t: string, m?: boolean): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n t,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data, m)}`,\n m,\n );\n }\n}\n\nexport class StringColumn<\n Schema extends ColumnSchemaConfig,\n> extends VarCharColumn<Schema> {\n constructor(schema: Schema, limit = 255) {\n super(schema, limit);\n }\n\n toCode(t: string, m?: boolean): Code {\n let max: number | undefined = this.data.maxChars;\n if (max === 255) max = undefined;\n return columnCode(\n this,\n t,\n `string(${max ?? ''})${stringDataToCode(this.data, m)}`,\n m,\n );\n }\n}\n\nconst textColumnToCode = (\n column: TextBaseColumn<ColumnSchemaConfig> & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n t: string,\n m?: boolean,\n) => {\n const data = { ...column.data };\n let args = '';\n const hasMax = data.maxArg !== undefined && data.max === data.maxArg;\n if ((data.minArg !== undefined && data.min === data.minArg) || hasMax) {\n if (data.minArg !== 0 || (hasMax && data.max !== Infinity)) {\n args += data.minArg;\n }\n delete data.min;\n if (hasMax) {\n if (data.maxArg !== Infinity) {\n args += `, ${data.maxArg}`;\n }\n delete data.max;\n }\n }\n return columnCode(\n column,\n t,\n `${column.dataType}(${args})${stringDataToCode(data, m)}`,\n m,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return textColumnToCode(this, t, m);\n }\n}\n\n// To store binary strings\nexport class ByteaColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n Buffer,\n ReturnType<Schema['buffer']>,\n OperatorsText\n> {\n dataType = 'bytea' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.buffer() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `bytea()`, m);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'point' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `point()`, m);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'line' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `line()`, m);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'lseg' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `lseg()`, m);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'box' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `box()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'path' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `path()`, m);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'polygon' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `polygon()`, m);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'circle' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `circle()`, m);\n }\n}\n\nexport class MoneyColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['stringSchema']>> {\n dataType = 'money' as const;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `money()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'cidr' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `cidr()`, m);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'inet' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `inet()`, m);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'macaddr' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `macaddr()`, m);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'macaddr8' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `macaddr8()`, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['bit']>,\n OperatorsText\n> {\n dataType = 'bit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length: number };\n\n constructor(schema: Schema, length: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { length } = this.data;\n return columnCode(this, t, `bit(${length})`, m);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<Schema, string, ReturnType<Schema['bit']>, OperatorsText> {\n dataType = 'varbit' as const;\n operators = Operators.text;\n declare data: ColumnData & { length?: number };\n\n constructor(schema: Schema, length?: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n this.data.alias = 'bitVarying';\n }\n\n toCode(t: string, m?: boolean): Code {\n const { length } = this.data;\n return columnCode(this, t, `bitVarying(${length ?? ''})`, m);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | SearchWeightRecord;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'tsvector' as const;\n operators = Operators.text;\n\n constructor(schema: Schema, public defaultLanguage = getDefaultLanguage()) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `tsvector()`, m);\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 PickColumnData>(\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 const language =\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn<ColumnSchemaConfig>)\n .defaultLanguage;\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('${language}', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '(') +\n `setweight(to_tsvector('${language}', coalesce(\"${key}\", '')), '${target[key]}')`;\n }\n if (sql) sql += ')';\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<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'tsquery' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `tsquery()`, m);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSQL(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['uuid']>,\n OperatorsText\n> {\n dataType = 'uuid' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.uuid() as never);\n }\n\n /**\n * see {@link ColumnType.primaryKey}\n */\n primaryKey<T extends PickColumnBaseData, Name extends string>(\n this: T,\n name?: Name,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n PrimaryKeyColumn<T, Name> & { data: { default: RawSQLBase } } {\n const column = super.primaryKey(name);\n if (!column.data.default) column.data.default = uuidDefault;\n return column as never;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { data } = this;\n return columnCode(\n this,\n t,\n `uuid()`,\n m,\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'xml' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `xml()`, m);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema> {\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return textColumnToCode(this, t, m);\n }\n}\n","import { ColumnData, ColumnType } from './columnType';\nimport {\n Code,\n ColumnSchemaConfig,\n DateColumnData,\n dateDataToCode,\n joinTruthy,\n TimeInterval,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators, OperatorsDate, OperatorsTime } from './operators';\n\nexport type DateColumnInput = string | number | Date;\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (input: DateColumnInput) => {\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// common class for Date and DateTime columns\nexport abstract class DateBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringNumberDate']>,\n OperatorsDate,\n DateColumnInput,\n string,\n ReturnType<Schema['stringSchema']>\n> {\n declare data: DateColumnData;\n operators = Operators.date;\n encodeFn = dateTimeEncode;\n asNumber: Schema['dateAsNumber'];\n asDate: Schema['dateAsDate'];\n\n constructor(schema: Schema) {\n super(\n schema,\n schema.stringNumberDate() as never,\n schema.stringSchema() as never,\n schema.stringNumberDate() as never,\n );\n this.asNumber = schema.dateAsNumber;\n this.asDate = schema.dateAsDate;\n }\n}\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n dataType = 'date' as const;\n toCode(t: string, m?: boolean): Code {\n return columnCode(\n this,\n t,\n `date()${dateDataToCode(this.data, m)}`,\n m,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema);\n this.data.dateTimePrecision = dateTimePrecision;\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\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 = (\n self:\n | TimestampColumn<ColumnSchemaConfig>\n | TimestampTZColumn<ColumnSchemaConfig>,\n t: string,\n m: boolean | undefined,\n) => {\n const { dateTimePrecision: p } = self.data;\n\n const { defaultTimestamp } = self.data;\n if (defaultTimestamp) {\n const noTz = self instanceof TimestampColumn ? 'NoTZ' : '';\n\n const def = self.data.default;\n const modifyQuery = self.data.modifyQuery;\n self.data.default = undefined;\n self.data.modifyQuery = undefined;\n\n const code = columnCode(\n self,\n t,\n `timestamps${noTz}(${\n p && p !== 6 ? p : ''\n }).${defaultTimestamp}${dateDataToCode(self.data, m)}`,\n m,\n self.data,\n skipDateMethodsFromToCode,\n );\n\n self.data.default = def;\n self.data.modifyQuery = modifyQuery;\n\n return code;\n } else {\n return columnCode(\n self,\n t,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data, m)}`,\n m,\n self.data,\n skipDateMethodsFromToCode,\n );\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n dataType = 'timestamp' as const;\n toCode(t: string, m?: boolean): Code {\n return timestampToCode(this, t, m);\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 Schema extends ColumnSchemaConfig,\n> extends DateTimeTzBaseClass<Schema> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(t: string, m?: boolean): Code {\n return timestampToCode(this, t, m);\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<Schema extends ColumnSchemaConfig> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsTime\n> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema, schema.stringSchema() as never);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toCode(t: string, m?: boolean): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n t,\n `time(${dateTimePrecision || ''})${dateDataToCode(this.data, m)}`,\n m,\n this.data,\n skipDateMethodsFromToCode,\n );\n }\n}\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n TimeInterval,\n ReturnType<Schema['timeInterval']>,\n OperatorsDate\n> {\n declare data: ColumnData & { fields?: string; precision?: number };\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(schema: Schema, fields?: string, precision?: number) {\n super(schema, schema.timeInterval() as never);\n this.data.fields = fields;\n this.data.precision = precision;\n }\n\n toCode(t: string, m?: boolean): 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 m,\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, ColumnSchemaConfig } from 'orchid-core';\nimport { Operators, OperatorsBoolean } from './operators';\n\n// 1 byte, true or false\nexport class BooleanColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n boolean,\n ReturnType<Schema['boolean']>,\n OperatorsBoolean\n> {\n dataType = 'bool' as const;\n operators = Operators.boolean;\n\n constructor(schema: Schema) {\n super(schema, schema.boolean() as never);\n this.data.alias = 'boolean';\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, 'boolean()', m);\n }\n\n parseItem = (input: string) => input[0] === 't';\n}\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Operators, OperatorsJson, OperatorsText } from './operators';\nimport { Code, ColumnSchemaConfig, ColumnTypeSchemaArg } from 'orchid-core';\n\nconst encodeFn = (x: unknown) => (x === null ? x : JSON.stringify(x));\n\n// skip adding the default `encode` function to code\nconst toCodeSkip = { encodeFn };\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n> extends ColumnType<Schema, T, Schema['type'], OperatorsJson> {\n dataType = 'jsonb' as const;\n operators = Operators.json;\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `json()`, m, this.data, toCodeSkip);\n }\n}\n\n// Encode data of both types with JSON.stringify\nJSONColumn.prototype.encodeFn = encodeFn;\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'json' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `jsonText()`, m, this.data, toCodeSkip);\n }\n}\n","import { GetStringArg, QueryMetaHasWhere, QueryMethods } from '../queryMethods';\nimport { QueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport { Db } from './db';\nimport { RelationsBase } from '../relations';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n ColumnShapeOutput,\n EmptyObject,\n Expression,\n OperatorsNullable,\n PickOutputType,\n PickQueryMeta,\n PickQueryMetaResult,\n PickQueryMetaResultReturnType,\n PickQueryMetaReturnType,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryTable,\n PickType,\n QueryCatch,\n QueryColumn,\n QueryColumns,\n QueryInternalBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryBase } from './queryBase';\nimport { ColumnType } from '../columns';\nimport { TableData } from '../tableData';\n\nexport interface DbExtension {\n name: string;\n version?: string;\n}\n\nexport type DbDomainArg<ColumnTypes> = (columnTypes: ColumnTypes) => ColumnType;\n\nexport type DbDomainArgRecord = { [K: string]: DbDomainArg<any> }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface QueryInternal<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SinglePrimaryKey = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumns = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumnNames = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueColumnTuples = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UniqueConstraints = any,\n> extends QueryInternalBase {\n singlePrimaryKey: SinglePrimaryKey;\n uniqueColumns: UniqueColumns;\n uniqueColumnNames: UniqueColumnNames;\n uniqueColumnTuples: UniqueColumnTuples;\n uniqueConstraints: UniqueConstraints;\n extensions?: DbExtension[];\n domains?: DbDomainArgRecord;\n tableData: TableData;\n // access with `getPrimaryKeys` utility\n primaryKeys?: string[];\n}\n\nexport type SelectableFromShape<\n Shape extends QueryColumns,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape & string as `${Table}.${K}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport interface WithDataItem {\n table: string;\n shape: QueryColumns;\n}\n\nexport interface WithDataItems {\n [K: string]: WithDataItem;\n}\n\nexport type WithDataBase = EmptyObject;\n\nexport interface Query extends QueryBase, QueryMethods<unknown> {\n queryBuilder: Db;\n columnTypes: unknown;\n shape: QueryColumns;\n inputType: RecordUnknown;\n q: QueryData;\n then: QueryThen<unknown>;\n catch: QueryCatch;\n windows: EmptyObject;\n defaultSelectColumns: string[];\n relations: RelationsBase;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n}\n\nexport interface PickQueryWithData {\n withData: WithDataBase;\n}\n\nexport interface PickQueryWindows {\n windows: EmptyObject;\n}\n\nexport interface PickQueryRelations {\n relations: RelationsBase;\n}\n\nexport interface PickQueryQ {\n q: QueryData;\n}\n\nexport interface PickQueryInternal {\n internal: QueryInternal;\n}\n\nexport interface PickQueryBaseQuery {\n baseQuery: Query;\n}\n\nexport interface PickQueryMetaRelations\n extends PickQueryMeta,\n PickQueryRelations {}\n\nexport interface PickQueryMetaResultRelations\n extends PickQueryResult,\n PickQueryMeta,\n PickQueryRelations {}\n\nexport interface PickQueryMetaResultRelationsWindows\n extends PickQueryMetaResultRelations,\n PickQueryWindows {}\n\nexport interface PickQueryColumnTypes {\n columnTypes: unknown;\n}\n\nexport interface PickQueryMetaResultRelationsWindowsColumnTypes\n extends PickQueryMetaResultRelationsWindows,\n PickQueryColumnTypes {}\n\nexport interface PickQueryWithDataColumnTypes\n extends PickQueryWithData,\n PickQueryColumnTypes {}\n\nexport interface PickQueryResultColumnTypes\n extends PickQueryResult,\n PickQueryColumnTypes {}\n\nexport interface PickQueryMetaWithDataColumnTypes\n extends PickQueryMeta,\n PickQueryWithData,\n PickQueryColumnTypes {}\n\nexport interface PickQueryMetaTable extends PickQueryMeta, PickQueryTable {}\n\nexport interface PickQueryMetaTableShape\n extends PickQueryMetaTable,\n PickQueryShape {}\n\nexport interface PickQueryMetaWithData\n extends PickQueryMeta,\n PickQueryWithData {}\n\nexport interface PickQueryRelationsWithData\n extends PickQueryWithData,\n PickQueryRelations {}\n\nexport interface PickQueryMetaShapeRelationsWithData\n extends PickQueryMeta,\n PickQueryShape,\n PickQueryRelations,\n PickQueryWithData {}\n\nexport interface PickQueryMetaResultRelationsWithDataReturnType\n extends PickQueryMeta,\n PickQueryResult,\n PickQueryRelations,\n PickQueryWithData,\n PickQueryReturnType {}\n\nexport interface PickQueryMetaTableShapeReturnTypeWithData\n extends PickQueryMetaTableShape,\n PickQueryReturnType,\n PickQueryMetaWithData {}\n\nexport interface PickQueryMetaResultRelationsWithDataReturnTypeShape\n extends PickQueryMetaResultRelationsWithDataReturnType,\n PickQueryShape {}\n\nexport interface PickQueryMetaResultReturnTypeWithDataWindows\n extends PickQueryMetaResultReturnType,\n PickQueryWithData,\n PickQueryWindows {}\n\nexport interface PickQueryMetaResultReturnTypeWithDataWindowsTable<\n Table extends string | undefined,\n> extends PickQueryMetaResultReturnType,\n PickQueryWithData,\n PickQueryWindows {\n table: Table;\n}\n\nexport interface PickQueryQAndInternal extends PickQueryQ, PickQueryInternal {}\n\nexport interface PickQueryQAndBaseQuery\n extends PickQueryQ,\n PickQueryBaseQuery {}\n\nexport interface PickQuerySinglePrimaryKey {\n internal: {\n singlePrimaryKey: unknown;\n };\n}\n\nexport interface PickQueryShapeSinglePrimaryKey\n extends PickQueryShape,\n PickQuerySinglePrimaryKey {}\n\nexport interface PickQueryShapeResultSinglePrimaryKey\n extends PickQueryShapeSinglePrimaryKey,\n PickQueryResult {}\n\nexport type SelectableOfType<T extends PickQueryMeta, Type> = {\n [K in keyof T['meta']['selectable']]: T['meta']['selectable'][K]['column']['type'] extends Type | null\n ? K\n : never;\n}[keyof T['meta']['selectable']];\n\nexport type SelectableOrExpressionOfType<\n T extends PickQueryMeta,\n C extends PickType,\n> = SelectableOfType<T, C['type']> | Expression<QueryColumn<C['type'] | null>>;\n\nexport interface QueryWithTable extends Query {\n table: string;\n}\n\nexport const queryTypeWithLimitOne = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n} as { [K in 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 ? true : T extends 'all' ? true : false;\n\nexport type GetQueryResult<\n T extends PickQueryReturnType,\n Result extends QueryColumns,\n> = QueryReturnsAll<T['returnType']> extends true\n ? ColumnShapeOutput<Result>[]\n : T['returnType'] extends 'one'\n ? ColumnShapeOutput<Result> | undefined\n : T['returnType'] extends 'oneOrThrow'\n ? ColumnShapeOutput<Result>\n : T['returnType'] extends 'value'\n ? Result['value']['outputType'] | undefined\n : T['returnType'] extends 'valueOrThrow'\n ? Result['value']['outputType']\n : T['returnType'] extends 'rows'\n ? ColumnShapeOutput<Result>[keyof Result][][]\n : T['returnType'] extends 'pluck'\n ? Result['pluck']['outputType'][]\n : T['returnType'] extends 'rowCount'\n ? number\n : void;\n\nexport type AddQuerySelect<\n T extends PickQueryMetaResultReturnType,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? {\n [K in\n | (T['meta']['hasSelect'] extends true ? keyof T['result'] : never)\n | keyof Result]: K extends keyof Result\n ? Result[K]\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Result>>\n : T[K];\n} & QueryMetaHasSelect;\n\n// Merge { hasSelect: true } into 'meta' if it's not true yet.\nexport interface QueryMetaHasSelect {\n meta: {\n hasSelect: true;\n };\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 PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsAllKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsAllKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'all'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[]>\n : T[K];\n} & QueryMetaHasWhere;\n\nexport type SetQueryReturnsOneOptional<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']> | undefined>\n : T[K];\n};\n\nexport type SetQueryReturnsOne<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<Result>>\n : T[K];\n};\n\nexport type SetQueryReturnsRows<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'rows'\n : K extends 'then'\n ? QueryThen<ColumnShapeOutput<T['result']>[keyof T['result']][][]>\n : T[K];\n};\n\nexport type SetQueryReturnsPluck<\n T extends PickQueryMeta,\n S extends keyof T['meta']['selectable'] | Expression,\n> = SetQueryReturnsPluckColumn<\n T,\n S extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][S]['column']\n : S extends Expression\n ? S['result']['value']\n : never\n>;\n\nexport type SetQueryReturnsPluckColumn<T, C extends QueryColumn> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: C }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<C['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsPluckColumnKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsPluckColumnKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsValueOrThrow<\n T extends PickQueryMeta,\n Arg extends keyof T['meta']['selectable'],\n> = SetQueryReturnsColumnOrThrow<T, T['meta']['selectable'][Arg]['column']> &\n T['meta']['selectable'][Arg]['column']['operators'];\n\nexport type SetQueryReturnsValueOptional<\n T extends PickQueryMeta,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsColumnOptional<\n T,\n {\n [K in keyof T['meta']['selectable'][Arg]['column']]: K extends 'outputType'\n ? T['meta']['selectable'][Arg]['column'][K] | undefined\n : T['meta']['selectable'][Arg]['column'][K];\n }\n> &\n Omit<T['meta']['selectable'][Arg]['column']['operators'], 'equals' | 'not'> &\n OperatorsNullable<T['meta']['selectable'][Arg]['column']>;\n\nexport type SetQueryReturnsColumnOrThrow<T, Column extends PickOutputType> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnOptional<T, Column extends PickOutputType> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<Column['outputType'] | undefined>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnKind<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['pluck']['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsColumnKindResult<\n T extends PickQueryMetaResult,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Result['pluck']['outputType']>\n : T[K];\n} & QueryMetaHasSelect;\n\nexport type SetQueryReturnsRowCount<\n T extends PickQueryMetaResult,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'rowCount'\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsVoid<T> = {\n [K in keyof T]: K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\n\nexport type SetQueryReturnsVoidKind<\n T extends PickQueryMeta,\n Kind extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\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 PickQueryMeta, 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 SetQueryKindResult<\n T extends PickQueryMetaReturnType,\n Kind extends string,\n Result extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'kind' ? Kind : T['meta'][K];\n }\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Result>>\n : T[K];\n};\n\nexport type SetQueryTableAlias<\n T extends PickQueryMetaTableShape,\n As extends string,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta'] | 'as']: K extends 'as'\n ? As\n : K extends 'selectable'\n ? Omit<\n T['meta']['selectable'],\n `${AliasOrTable<T>}.${keyof T['shape'] & string}`\n > & {\n [K in keyof T['shape'] & string as `${As}.${K}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : T['meta'][K];\n }\n : T[K];\n};\n\nexport interface QueryOrExpression<T> {\n result: { value: QueryColumn<T> };\n}\n\nexport type QueryOrExpressionBooleanOrNullResult = QueryOrExpression<\n boolean | null\n>;\n","import { SelectableOrExpression } from '../common/utils';\nimport { PickQueryDataShapeAndJoinedShapes, QueryData } from './data';\nimport { ToSQLCtx } from './toSQL';\nimport {\n ColumnTypeBase,\n Expression,\n QueryColumn,\n QueryColumns,\n} 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?: QueryColumn,\n quotedAs?: string,\n): string {\n if (!column) return `\"${key}\"`;\n\n const { data } = column as ColumnTypeBase;\n return data.computed\n ? data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || 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: QueryColumn,\n quotedAs?: string,\n): string {\n const { data } = column as ColumnTypeBase;\n return data.computed\n ? data.computed.toSQL(ctx, quotedAs)\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || key}\"`;\n}\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: QueryData['joinedShapes'];\n joinOverrides?: QueryData['joinOverrides'];\n },\n shape: QueryColumns,\n column: string,\n quotedAs?: string,\n select?: true,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n return columnWithDotToSql(\n ctx,\n data,\n shape,\n column,\n index,\n quotedAs,\n select,\n );\n }\n\n if (!select && data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n return simpleColumnToSQL(ctx, column, shape[column], quotedAs);\n};\n\n/**\n * in a case when ordering or grouping by a column which was selected as expression:\n * ```ts\n * table.select({ x: (q) => q.sum('x') }).group('x').order('x')\n * ```\n * the column must not be prefixed with a table name.\n */\nexport const maybeSelectedColumnToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n) => {\n const index = column.indexOf('.');\n if (index !== -1) {\n return columnWithDotToSql(ctx, data, data.shape, column, index, quotedAs);\n } else {\n if (data.joinedShapes?.[column]) {\n return `\"${column}\".r`;\n }\n\n if (data.select) {\n for (const s of data.select) {\n if (typeof s === 'object' && 'selectAs' in s) {\n if (column in s.selectAs) {\n return simpleColumnToSQL(ctx, column, data.shape[column]);\n }\n }\n }\n }\n\n return simpleColumnToSQL(ctx, column, data.shape[column], quotedAs);\n }\n};\n\nconst columnWithDotToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: QueryData['joinedShapes'];\n joinOverrides?: QueryData['joinOverrides'];\n },\n shape: QueryColumns,\n column: string,\n index: number,\n quotedAs?: string,\n select?: true,\n) => {\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 ) as ColumnTypeBase | undefined;\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\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}.` : ''}\"${col.data.name}\" \"${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 ? ` \"${column}\"` : ''\n }`;\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: PickQueryDataShapeAndJoinedShapes,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n shape: QueryColumns = data.shape,\n select?: true,\n) => {\n return typeof expr === 'string'\n ? columnToSql(ctx, data, shape, expr, quotedAs, select)\n : (expr as Expression).toSQL(ctx, quotedAs);\n};\n\nexport const quoteSchemaAndTable = (\n schema: string | undefined,\n table: string,\n) => {\n return schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n};\n","import { rawOrColumnToSql } from './common';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { SelectQueryData } from './data';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 { Query } from './query/query';\nimport { PickQueryShape } 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 PickQueryShape = PickQueryShape,\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 { QueryData } from '../sql';\nimport {\n emptyObject,\n pushOrNewArrayToObject,\n RecordUnknown,\n} from 'orchid-core';\nimport { OrchidOrmInternalError } from '../errors';\nimport { PickQueryQ, PickQueryQAndBaseQuery, 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 never as RecordUnknown)[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 PickQueryQ>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObject(\n q.q as unknown as { [K: 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 { [K: string]: RecordUnknown })[object] = {\n [key]: value,\n };\n else (q.q as unknown as { [K: string]: RecordUnknown })[object][key] = 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: PickQueryQ, method: string): void => {\n if (!q.q.or && !q.q.and && !q.q.scopes && !q.q.all) {\n throw new OrchidOrmInternalError(\n q as Query,\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 PickQueryQAndBaseQuery,\n Methods extends RecordUnknown,\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\nexport const getPrimaryKeys = (q: Query) => {\n return (q.internal.primaryKeys ??= collectPrimaryKeys(q));\n};\n\nconst collectPrimaryKeys = (q: Query): string[] => {\n const primaryKeys = [];\n const { shape } = q.q;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n primaryKeys.push(key);\n }\n }\n\n if (q.internal.primaryKeys) {\n primaryKeys.push(...q.internal.primaryKeys);\n }\n\n return primaryKeys;\n};\n","import { Query } from '../query/query';\nimport {\n JoinItemArgs,\n WhereInItem,\n WhereItem,\n WhereJsonPathEqualsItem,\n WhereOnItem,\n WhereOnJoinItem,\n WhereSearchItem,\n} from './types';\nimport {\n columnToSql,\n simpleColumnToSQL,\n simpleExistingColumnToSQL,\n} from './common';\nimport { getQueryAs, joinSubQuery } from '../common/utils';\nimport { processJoinItem } from './join';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n CommonQueryData,\n JoinedShapes,\n PickQueryDataShapeAndJoinedShapes,\n QueryScopeData,\n} from './data';\nimport {\n addValue,\n ColumnTypeBase,\n Expression,\n isExpression,\n MaybeArray,\n OperatorToSQL,\n RecordUnknown,\n toArray,\n} from 'orchid-core';\nimport { getSqlText } from './utils';\nimport { selectToSql } from './select';\n\ninterface QueryDataForWhere {\n and?: CommonQueryData['and'];\n or?: CommonQueryData['or'];\n shape: CommonQueryData['shape'];\n joinedShapes?: CommonQueryData['joinedShapes'];\n scopes?: { [K: string]: QueryScopeData };\n}\n\ninterface QueryDataWithLanguage extends QueryDataForWhere {\n language?: CommonQueryData['language'];\n}\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs);\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: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, parens);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n if (query.scopes) {\n let sql = andOrToSql(ctx, table, query, quotedAs, true);\n\n const data = Object.create(query);\n for (const key in query.scopes) {\n const scope = query.scopes[key];\n data.and = scope.and;\n data.or = scope.or;\n const scopeSql = andOrToSql(ctx, table, data, quotedAs, true);\n if (scopeSql) sql = sql ? sql + ' AND ' + scopeSql : scopeSql;\n }\n\n return sql;\n }\n\n return andOrToSql(ctx, table, query, quotedAs, parens);\n};\n\nconst andOrToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n let sql;\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n sql = ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs))\n .join(' OR ');\n } else if (query.and) {\n sql = processAnds(query.and, ctx, table, query, quotedAs);\n } else {\n return;\n }\n\n return parens ? `(${sql})` : sql;\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs);\n }\n const sql = ands.join(' AND ');\n return parens && ands.length > 1 ? `(${sql})` : sql;\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataWithLanguage,\n data: WhereItem,\n quotedAs?: string,\n) => {\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n if (query.q.expr) {\n if (query.q.subQuery === 1) {\n ands.push(selectToSql(ctx, table, query.q, quotedAs));\n } else {\n const q = joinSubQuery(table, query);\n q.q.select = [query.q.expr];\n ands.push(`(${getSqlText(makeSQL(q as Query, ctx))})`);\n }\n } else {\n pushWhereToSql(\n ands,\n ctx,\n query,\n query.q,\n query.table && `\"${query.table}\"`,\n true,\n );\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as RecordUnknown)[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));\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))\n .join(' OR ')})`,\n );\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(`NOT ${processAnds(arr, ctx, table, query, quotedAs, true)}`);\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 `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(`${leftColumn} ${op} ${rightColumn}`);\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as JoinItemArgs[];\n\n const joinSet = joinItems.length > 1 ? new Set<string>() : null;\n\n for (const args of joinItems) {\n const { target, on } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n const sql = `EXISTS (SELECT 1 FROM ${target}${\n on ? ` WHERE ${on}` : ''\n })`;\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ands.push(sql);\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (typeof value === 'object' && value && !(value instanceof Date)) {\n if (isExpression(value)) {\n ands.push(\n `${columnToSql(\n ctx,\n query,\n query.shape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column: ColumnTypeBase | undefined = 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 column = query.joinedShapes?.[key]?.value;\n quotedColumn = `\"${key}\".r`;\n }\n\n if (!column || !quotedColumn) {\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n }\n\n if (value instanceof ctx.queryBuilder.constructor) {\n ands.push(\n `${quotedColumn} = (${getSqlText((value as Query).toSQL(ctx))})`,\n );\n } else {\n for (const op in value) {\n const operator = (column.operators as RecordUnknown)[op];\n if (!operator) {\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 `${(\n operator as unknown as { _op: OperatorToSQL<any, ToSQLCtx> }\n )._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n } else {\n const column = columnToSql(ctx, query, query.shape, key, quotedAs);\n if (typeof value === 'function') {\n const expr = value(table);\n ands.push(`${column} = ${expr.toSQL(ctx, quotedAs)}`);\n } else {\n ands.push(\n `${column} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\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: PickQueryDataShapeAndJoinedShapes,\n ands: 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 value = `(${getSqlText(makeSQL(arg.values, ctx))})`;\n }\n\n const columnsSql = arg.columns\n .map((column) => columnToSql(ctx, query, query.shape, column, quotedAs))\n .join(', ');\n\n ands.push(`${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`);\n};\n","import { quoteSchemaAndTable, rawOrColumnToSql, columnToSql } from './common';\nimport { JoinItem, JoinItemArgs, SimpleJoinItemNonSubQueryArgs } from './types';\nimport { PickQueryQAndBaseQuery, Query, QueryWithTable } from '../query/query';\nimport { whereToSql } from './where';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n JoinedShapes,\n PickQueryDataShapeAndJoinedShapes,\n QueryData,\n} from './data';\nimport {\n Expression,\n isExpression,\n QueryColumns,\n RecordBoolean,\n RecordUnknown,\n} from 'orchid-core';\nimport { RawSQL } from './rawSql';\nimport { getSqlText } from './utils';\n\ntype ItemOf2Or3Length =\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\ninterface SqlJoinItem {\n target: string;\n on?: string;\n}\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: PickQueryDataShapeAndJoinedShapes,\n args: JoinItemArgs,\n quotedAs: string | undefined,\n): SqlJoinItem => {\n let target: string;\n let on: string | undefined;\n\n if ('j' in args) {\n const { j, s, r } = args;\n\n const tableName = (\n typeof j.q.from === 'string' ? j.q.from : j.table\n ) as string;\n\n const quotedTable = quoteSchemaAndTable(j.q.schema, tableName);\n target = quotedTable;\n\n const as = j.q.as as string;\n const joinAs = `\"${as}\"`;\n if (as !== tableName) {\n target += ` AS ${joinAs}`;\n }\n\n if (r && s) {\n target = `LATERAL ${subJoinToSql(ctx, j, quotedTable, joinAs, true)}`;\n } else {\n on = whereToSql(ctx, j, j.q, joinAs);\n }\n } else if ('w' in args) {\n const { w } = args;\n target = `\"${w}\"`;\n\n if ('r' in args) {\n const { s, r } = args;\n if (s) {\n target = `LATERAL ${subJoinToSql(ctx, r, target, target)}`;\n } else {\n on = whereToSql(ctx, r as Query, r.q, target);\n }\n } else {\n on = processArgs(\n args.a,\n ctx,\n query,\n target,\n (query.joinedShapes as JoinedShapes)[w],\n quotedAs,\n );\n }\n } else {\n const { q, s } = args;\n let joinAs;\n\n if ('r' in args) {\n const { r } = args;\n\n const res = getArgQueryTarget(ctx, q, s, s);\n target = s ? `LATERAL ${res.target}` : res.target;\n joinAs = res.joinAs;\n\n if (!s) {\n on = whereToSql(ctx, r, r.q, joinAs);\n }\n } else {\n const res = getArgQueryTarget(ctx, q, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if ('a' in args) {\n on = processArgs(args.a, ctx, query, joinAs, q.shape, quotedAs);\n }\n }\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!s) {\n const whereSql = whereToSql(\n ctx,\n q,\n {\n ...q.q,\n joinedShapes: {\n ...query.joinedShapes,\n ...q.q.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.shape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (on) on += ` AND ${whereSql}`;\n else on = whereSql;\n }\n }\n }\n\n return { target, on };\n};\n\nconst getArgQueryTarget = (\n ctx: ToSQLCtx,\n first: QueryWithTable,\n joinSubQuery: boolean,\n cloned?: boolean,\n) => {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const addAs = qAs && qAs !== joinAs;\n\n if (joinSubQuery) {\n return {\n target: subJoinToSql(ctx, first, joinAs, qAs, cloned),\n joinAs: addAs ? qAs : joinAs,\n };\n } else {\n let target =\n quotedFrom || quoteSchemaAndTable(joinQuery.schema, first.table);\n if (addAs) {\n joinAs = qAs;\n target += ` AS ${qAs}`;\n }\n return { target, joinAs };\n }\n};\n\nconst subJoinToSql = (\n ctx: ToSQLCtx,\n jq: Query,\n innerAs: string,\n outerAs?: string,\n cloned?: boolean,\n) => {\n if (!jq.q.select && jq.internal.columnsForSelectAll) {\n if (!cloned) jq = jq.clone();\n jq.q.select = [new RawSQL(`${innerAs}.*`)];\n }\n\n return `(${getSqlText(\n jq.toSQL({\n values: ctx.values,\n }),\n )}) ${outerAs || innerAs}`;\n};\n\nconst processArgs = (\n args: SimpleJoinItemNonSubQueryArgs,\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n joinAs: string,\n joinShape: QueryColumns,\n quotedAs?: string,\n): string => {\n return args.length === 1\n ? getObjectOrRawConditions(ctx, query, args[0], quotedAs, joinAs, joinShape)\n : getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf2Or3Length,\n joinShape,\n );\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n target: string,\n quotedAs: string | undefined,\n args: ItemOf2Or3Length,\n joinShape: QueryColumns,\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: PickQueryDataShapeAndJoinedShapes,\n data: { [K: string]: string | Expression } | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: QueryColumns,\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: ToSQLQuery,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\n\n for (const item of query.join) {\n let sql;\n if (Array.isArray(item)) {\n const q = item[1];\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n\n const as = item[2];\n sql = `${item[0]} LATERAL (${getSqlText(q.toSQL(ctx))}) \"${\n query.joinOverrides?.[as] || as\n }\" ON true`;\n\n ctx.aliasValue = aliasValue;\n } else {\n const { target, on = 'true' } = processJoinItem(\n ctx,\n table,\n query,\n item.args,\n quotedAs,\n );\n\n sql = `${item.type} ${target} ON ${on}`;\n }\n\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ctx.sql.push(sql);\n }\n};\n\nconst skipQueryKeysForSubQuery: RecordBoolean = {\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: PickQueryQAndBaseQuery) => {\n const {\n q,\n baseQuery: { q: baseQ },\n } = query;\n for (const key in q) {\n if (\n !skipQueryKeysForSubQuery[key] &&\n (q as never as RecordUnknown)[key] !==\n (baseQ as never as RecordUnknown)[key]\n ) {\n return true;\n }\n }\n return false;\n};\n","import { Query, QueryWithTable } from '../../query/query';\nimport { JoinArgs, JoinFirstArg, JoinQueryBuilder } from './join';\nimport {\n JoinedShapes,\n QueryDataJoinTo,\n SelectQueryData,\n JoinItemArgs,\n SimpleJoinItemNonSubQueryArgs,\n} from '../../sql';\nimport { RelationJoinQuery } from '../../relations';\nimport { pushQueryArray } from '../../query/queryUtils';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { QueryBase } from '../../query/queryBase';\nimport { returnArg } from 'orchid-core';\n\n/**\n * Processes arguments of join {@link JoinArgs} into {@link JoinItemArgs} type for building sql.\n * Resolves join callback.\n * Detects if the join should be an implicit lateral join.\n *\n * @param joinTo - main query\n * @param first - first join argument\n * @param args - rest join arguments\n * @param joinSubQuery - callee should find out whether first argument should result in a sub-queried join\n */\nexport const processJoinArgs = (\n joinTo: Query,\n first: JoinFirstArg<never>,\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n joinSubQuery: boolean,\n): JoinItemArgs => {\n if (typeof first === 'string') {\n if (first in joinTo.relations) {\n const { query: toQuery, joinQuery } =\n joinTo.relations[first].relationConfig;\n\n const j = joinQuery(toQuery, joinTo);\n if (typeof args[0] === 'function') {\n const r = args[0](\n makeJoinQueryBuilder(j, j.q.joinedShapes, joinTo),\n ) as Query;\n return { j: j.merge(r), s: joinSubQuery || getIsJoinSubQuery(r), r };\n }\n\n return { j, s: joinSubQuery };\n } else if (typeof args[0] !== 'function') {\n return { w: first, a: args as SimpleJoinItemNonSubQueryArgs };\n } else {\n const joinToQ = joinTo.q;\n const shape = joinToQ.withShapes?.[first];\n if (!shape) {\n throw new Error('Cannot get shape of `with` statement');\n }\n\n const j = joinTo.queryBuilder.baseQuery.clone();\n j.table = first;\n j.q = {\n shape,\n adapter: joinToQ.adapter,\n handleResult: joinToQ.handleResult,\n returnType: 'all',\n logger: joinToQ.logger,\n } as SelectQueryData;\n j.baseQuery = j as Query;\n\n const joinedShapes = {\n ...joinToQ.joinedShapes,\n [(joinToQ.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = args[0](\n makeJoinQueryBuilder(\n j,\n j.q.joinedShapes\n ? {\n ...j.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n ),\n ) as Query;\n\n return { w: first, r, s: joinSubQuery || getIsJoinSubQuery(r) };\n }\n }\n\n const args0 = args.length ? args[0] : returnArg;\n if (typeof args0 === 'function') {\n const q = first as QueryWithTable & {\n joinQueryAfterCallback?: RelationJoinQuery;\n };\n\n if (q.joinQueryAfterCallback) {\n let base = q.baseQuery;\n if (q.q.as) {\n base = base.as(q.q.as);\n }\n\n const { q: query } = q.joinQueryAfterCallback(base, joinTo);\n if (query.and) {\n pushQueryArray(q, 'and', query.and);\n }\n if (query.or) {\n pushQueryArray(q, 'or', query.or);\n }\n if (query.scopes) {\n q.q.scopes = { ...q.q.scopes, ...query.scopes };\n }\n }\n\n const joinedShapes = {\n ...joinTo.q.joinedShapes,\n [(joinTo.q.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = args0(\n makeJoinQueryBuilder(\n q,\n q.q.joinedShapes\n ? {\n ...q.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n ),\n ) as Query;\n\n joinSubQuery ||= getIsJoinSubQuery(r);\n return { q: joinSubQuery ? q.merge(r) : q, r, s: joinSubQuery };\n }\n\n return {\n q: first as QueryWithTable,\n a: args as SimpleJoinItemNonSubQueryArgs,\n s: joinSubQuery,\n };\n};\n\n/**\n * Creates {@link JoinQueryBuilder} argument for join callback.\n *\n * @param joinedQuery - the query that is joining\n * @param joinedShapes\n * @param joinTo\n */\nconst makeJoinQueryBuilder = (\n joinedQuery: QueryBase,\n joinedShapes: JoinedShapes | undefined,\n joinTo: QueryDataJoinTo,\n): JoinQueryBuilder<Query, Query> => {\n const q = joinedQuery.baseQuery.clone();\n q.baseQuery = q as unknown as Query;\n q.q.as = joinedQuery.q.as;\n q.q.joinedShapes = joinedShapes;\n q.q.joinTo = joinTo;\n return q as never;\n};\n","import { Query } from '../query/query';\nimport { noop } from 'orchid-core';\nimport { NotFoundError } from '../errors';\nimport { extendQuery, pushQueryValue } from '../query/queryUtils';\nimport { RawSQL } from '../sql/rawSql';\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\nexport const _queryNone = <T>(q: T): T => {\n if (isQueryNone(q)) return q;\n\n q = extendQuery(q as Query, noneMethods) as T;\n pushQueryValue(q as Query, 'and', new RawSQL('false'));\n return q;\n};\n\nexport const isQueryNone = (q: unknown) =>\n (q as Query).then === noneMethods.then;\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryQ,\n Query,\n} from '../../query/query';\nimport {\n ColumnsParsers,\n ColumnsShapeBase,\n ColumnTypeBase,\n PickQueryTableMetaResult,\n QueryColumns,\n QueryMetaBase,\n} 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 JoinFirstArg,\n JoinLateralCallback,\n JoinLateralResult,\n JoinResult,\n} from './join';\nimport { getQueryAs, resolveSubQueryCallback } from '../../common/utils';\nimport { processJoinArgs } from './processJoinArgs';\nimport { _queryNone, isQueryNone } from '../none';\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 first - the first argument of join: join target\n * @param args - rest join arguments: columns to join with, or a callback\n */\nexport const _join = <\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n R extends PickQueryTableMetaResult,\n RequireJoined extends boolean,\n RequireMain extends boolean,\n>(\n query: T,\n require: RequireJoined,\n type: string,\n first: JoinFirstArg<never>,\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n): JoinResult<T, R, RequireJoined, RequireMain> => {\n let joinKey: string | undefined;\n let shape: QueryColumns | undefined;\n let parsers: ColumnsParsers | undefined;\n let joinSubQuery = false;\n\n if (typeof first === 'function') {\n first = (\n first as unknown as (q: { [K: string]: Query }) => JoinFirstArg<Query>\n )(query.relations);\n (\n first as unknown as { joinQueryAfterCallback: unknown }\n ).joinQueryAfterCallback = (\n first as unknown as { joinQuery: unknown }\n ).joinQuery;\n }\n\n if (typeof first === 'object') {\n if (require && isQueryNone(first)) {\n return _queryNone(query) as JoinResult<T, R, RequireJoined, RequireMain>;\n }\n\n const q = first as Query;\n joinSubQuery = getIsJoinSubQuery(q);\n\n joinKey = q.q.as || q.table;\n if (joinKey) {\n shape = getShapeFromSelect(q, joinSubQuery);\n parsers = q.q.parsers;\n\n if (joinSubQuery) {\n first = q.clone() as JoinFirstArg<Query>;\n (first as Query).shape = shape as ColumnsShapeBase;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = query.relations[joinKey];\n if (relation) {\n shape = getShapeFromSelect(relation.relationConfig.query);\n parsers = relation.relationConfig.query.q.parsers;\n } else {\n shape = (query as unknown as PickQueryQ).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] as ColumnTypeBase).parseFn;\n if (parser) {\n parsers[key] = parser;\n }\n }\n }\n }\n }\n\n if (joinKey) {\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedShapes',\n joinKey,\n shape,\n );\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedParsers',\n joinKey,\n parsers,\n );\n }\n\n const joinArgs = processJoinArgs(\n query as unknown as Query,\n first,\n args,\n joinSubQuery,\n );\n\n if (joinKey && 's' in joinArgs && joinArgs.s) {\n const j =\n 'j' in joinArgs\n ? joinArgs.r ?? joinArgs.j\n : 'r' in joinArgs\n ? joinArgs.r\n : joinArgs.q;\n\n if (j.q.select || !j.internal.columnsForSelectAll) {\n const shape = getShapeFromSelect(j, true);\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedShapes',\n joinKey,\n shape,\n );\n setQueryObjectValue(\n query as unknown as PickQueryQ,\n 'joinedParsers',\n joinKey,\n j.q.parsers,\n );\n }\n } else if (require && 'r' in joinArgs && isQueryNone(joinArgs.r)) {\n return _queryNone(query) as JoinResult<T, R, RequireJoined, RequireMain>;\n }\n\n return pushQueryValue(query as unknown as PickQueryQ, 'join', {\n type,\n args: joinArgs,\n }) as never;\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 self - 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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n RequireJoined extends boolean,\n>(\n self: T,\n type: string,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n as?: string,\n): JoinLateralResult<T, Table, Meta, Result, RequireJoined> => {\n const q = self as unknown as Query;\n\n let relation: RelationQueryBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = relation.relationConfig.query.clone() as unknown as Arg;\n } else {\n const shape = q.q.withShapes?.[arg];\n if (shape) {\n const t = Object.create((q as unknown as Query).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 = resolveSubQueryCallback(query, cb as never) as unknown as Query;\n\n if (relation) {\n result = relation.relationConfig.joinQuery(\n result as unknown as Query,\n q as unknown as Query,\n ) as unknown as Query;\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 never;\n};\n","import { ColumnType } from './columnType';\nimport { columnCode } from './code';\nimport { Code, ColumnTypeSchemaArg } from 'orchid-core';\nimport { Operators, OperatorsAny } from './operators';\n\nexport class EnumColumn<\n Schema extends ColumnTypeSchemaArg,\n SchemaType extends Schema['type'],\n U extends string = string,\n T extends readonly [U, ...U[]] = [U],\n> extends ColumnType<Schema, T[number], SchemaType, OperatorsAny> {\n operators = Operators.any;\n dataType = 'enum';\n\n constructor(\n schema: Schema,\n public enumName: string,\n public options: T,\n schemaType: SchemaType,\n ) {\n super(schema, schemaType);\n this.inputSchema = this.outputSchema = this.querySchema = schemaType;\n }\n\n toCode(t: string, m?: boolean): Code {\n const options = m\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, t, `enum('${this.enumName}'${options})`, m);\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 {\n addCode,\n Code,\n ArrayMethodsData,\n arrayDataToCode,\n ColumnSchemaConfig,\n ColumnTypeSchemaArg,\n ColumnDataBase,\n Codes,\n} from 'orchid-core';\nimport { columnCode } from './code';\nimport { Operators, OperatorsArray } from './operators';\n\nexport interface ArrayColumnValue {\n type: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n inputType: unknown;\n outputType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n queryType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n toSQL(): string;\n toCode(t: string, m?: boolean): Code;\n parseItem?(input: string): unknown;\n data: ColumnDataBase;\n}\n\nexport interface ArrayData<Item extends ArrayColumnValue>\n extends ColumnData,\n ArrayMethodsData {\n item: Item;\n}\n\nexport class ArrayColumn<\n Schema extends ColumnTypeSchemaArg,\n Item extends ArrayColumnValue,\n InputType,\n OutputType,\n QueryType,\n> extends ColumnType<\n Schema,\n Item['type'][],\n InputType,\n OperatorsArray,\n Item['inputType'][],\n Item['outputType'][],\n OutputType,\n Item['queryType'][],\n QueryType\n> {\n dataType = 'array' as const;\n operators = Operators.array;\n declare data: ArrayData<Item>;\n\n constructor(\n schema: Schema,\n item: Item,\n inputType: InputType,\n outputType?: OutputType,\n queryType?: QueryType,\n ) {\n super(schema, inputType, outputType, queryType);\n this.data.item = item;\n this.data.name = item.data.name;\n }\n\n toSQL(): string {\n return `${this.data.item.toSQL()}[]`;\n }\n\n toCode(\n this: ArrayColumn<\n ColumnSchemaConfig,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n t: string,\n m?: boolean,\n ): Code {\n const code: Codes = ['array('];\n addCode(code, this.data.item.toCode(t));\n addCode(code, `)${arrayDataToCode(this.data, m)}`);\n return columnCode(this, t, code, m);\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: ArrayColumnValue,\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 = (\n item as unknown as { data: ArrayData<ArrayColumnValue> }\n ).data.item as ArrayColumnValue;\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\nconst pushEntry = (\n input: string,\n start: number,\n pos: number,\n entries: unknown[],\n item: ArrayColumnValue,\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 {\n ColumnSchemaConfig,\n ColumnTypeBase,\n EncodeColumn,\n MaybeArray,\n noop,\n ParseColumn,\n RecordUnknown,\n setColumnData,\n} from 'orchid-core';\nimport {\n DateBaseColumn,\n DateColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './dateTime';\nimport { EnumColumn } from './enum';\nimport { ArrayColumn, ArrayColumnValue } from './array';\nimport { JSONColumn } from './json';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './number';\nimport {\n CitextColumn,\n MoneyColumn,\n StringColumn,\n TextColumn,\n VarCharColumn,\n} from './string';\nimport { ColumnType } from './columnType';\n\nexport interface DefaultSchemaConfig extends ColumnSchemaConfig<ColumnType> {\n parse<T extends { type: unknown }, Output>(\n this: T,\n fn: (input: T['type']) => Output,\n ): ParseColumn<T, unknown, Output>;\n\n encode<T extends { type: unknown }, Input>(\n this: T,\n fn: (input: Input) => unknown,\n ): EncodeColumn<T, unknown, Input>;\n\n asType<\n T,\n Types extends {\n type: unknown;\n inputType: unknown;\n outputType: unknown;\n queryType: unknown;\n },\n >(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _fn: (\n type: <Type, Input = Type, Output = Type, Query = Type>() => {\n type: Type;\n inputType: Input;\n outputType: Output;\n queryType: Query;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n dateAsNumber(): ParseColumn<\n DateBaseColumn<DefaultSchemaConfig>,\n unknown,\n number\n >;\n\n dateAsDate(): ParseColumn<DateBaseColumn<DefaultSchemaConfig>, unknown, Date>;\n\n enum<U extends string, T extends readonly [U, ...U[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<DefaultSchemaConfig, unknown, U, T>;\n\n array<Item extends ArrayColumnValue>(\n item: Item,\n ): ArrayColumn<DefaultSchemaConfig, Item, unknown, unknown, unknown>;\n\n json<T>(): JSONColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T\n ? MaybeArray<string | number | boolean | RecordUnknown>\n : T,\n DefaultSchemaConfig\n >;\n\n inputSchema(): undefined;\n outputSchema(): undefined;\n querySchema(): undefined;\n updateSchema(): undefined;\n pkeySchema(): undefined;\n\n smallint(): SmallIntColumn<DefaultSchemaConfig>;\n integer(): IntegerColumn<DefaultSchemaConfig>;\n real(): RealColumn<DefaultSchemaConfig>;\n smallSerial(): SmallSerialColumn<DefaultSchemaConfig>;\n serial(): SerialColumn<DefaultSchemaConfig>;\n\n bigint(): BigIntColumn<DefaultSchemaConfig>;\n decimal(\n precision?: number,\n scale?: number,\n ): DecimalColumn<DefaultSchemaConfig>;\n doublePrecision(): DoublePrecisionColumn<DefaultSchemaConfig>;\n bigSerial(): BigSerialColumn<DefaultSchemaConfig>;\n money(): MoneyColumn<DefaultSchemaConfig>;\n varchar(limit: number): VarCharColumn<DefaultSchemaConfig>;\n text(): TextColumn<DefaultSchemaConfig>;\n string(limit?: number): StringColumn<DefaultSchemaConfig>;\n citext(): CitextColumn<DefaultSchemaConfig>;\n\n date(): DateColumn<DefaultSchemaConfig>;\n timestampNoTZ(precision?: number): TimestampColumn<DefaultSchemaConfig>;\n timestamp(precision?: number): TimestampTZColumn<DefaultSchemaConfig>;\n}\n\n// parse a date string to number, with respect to null\nconst parseDateToNumber = (value: unknown): number =>\n (value ? Date.parse(value as string) : value) as number;\n\n// parse a date string to date object, with respect to null\nconst parseDateToDate = (value: unknown): Date =>\n (value ? new Date(value as string) : value) as Date;\n\n(parseDateToNumber as unknown as { hideFromCode: boolean }).hideFromCode = (\n parseDateToDate as unknown as { hideFromCode: boolean }\n).hideFromCode = true;\n\nexport const defaultSchemaConfig = {\n parse(fn: unknown) {\n return Object.assign(Object.create(this), {\n parseFn: fn,\n parseItem: fn,\n });\n },\n encode(fn: unknown) {\n return Object.assign(Object.create(this), {\n encodeFn: fn,\n });\n },\n asType() {\n return this as never;\n },\n dateAsNumber(this: { parse(fn: unknown): unknown }) {\n return this.parse(parseDateToNumber);\n },\n dateAsDate(this: { parse(fn: unknown): unknown }) {\n return this.parse(parseDateToDate);\n },\n enum<T extends readonly [string, ...string[]]>(dataType: string, type: T) {\n return new EnumColumn(defaultSchemaConfig, dataType, type, undefined);\n },\n array<Item extends ArrayColumnValue>(item: Item) {\n return new ArrayColumn(defaultSchemaConfig, item, undefined);\n },\n boolean: noop,\n buffer: noop,\n unknown: noop,\n never: noop,\n stringSchema: noop,\n stringMin: noop,\n stringMax: noop,\n stringMinMax: noop,\n number: noop,\n int: noop,\n stringNumberDate: noop,\n timeInterval: noop,\n bit: noop,\n uuid: noop,\n nullable(this: ColumnTypeBase) {\n return setColumnData(this, 'isNullable', true);\n },\n json() {\n return new JSONColumn(defaultSchemaConfig, undefined);\n },\n setErrors: noop,\n\n smallint: () => new SmallIntColumn(defaultSchemaConfig),\n integer: () => new IntegerColumn(defaultSchemaConfig),\n real: () => new RealColumn(defaultSchemaConfig),\n smallSerial: () => new SmallSerialColumn(defaultSchemaConfig),\n serial: () => new SerialColumn(defaultSchemaConfig),\n\n bigint: () => new BigIntColumn(defaultSchemaConfig),\n decimal: (precision?: number, scale?: number) =>\n new DecimalColumn(defaultSchemaConfig, precision, scale),\n doublePrecision: () => new DoublePrecisionColumn(defaultSchemaConfig),\n bigSerial: () => new BigSerialColumn(defaultSchemaConfig),\n money: () => new MoneyColumn(defaultSchemaConfig),\n varchar: (limit: number) => new VarCharColumn(defaultSchemaConfig, limit),\n text: () => new TextColumn(defaultSchemaConfig),\n string: (limit?: number) => new StringColumn(defaultSchemaConfig, limit),\n citext: () => new CitextColumn(defaultSchemaConfig),\n\n date: () => new DateColumn(defaultSchemaConfig),\n timestampNoTZ: (precision?: number) =>\n new TimestampColumn(defaultSchemaConfig, precision),\n timestamp: (precision?: number) =>\n new TimestampTZColumn(defaultSchemaConfig, precision),\n} as unknown as DefaultSchemaConfig;\n","import { PickQueryQAndInternal } from '../query/query';\nimport {\n AfterCommitHook,\n emptyArray,\n emptyObject,\n SingleSqlItem,\n TransactionAdapterBase,\n TransactionState,\n} from 'orchid-core';\nimport { QueryBase } from '../query/queryBase';\n\nexport const commitSql: SingleSqlItem = {\n text: 'COMMIT',\n};\n\nexport const rollbackSql: SingleSqlItem = {\n text: 'ROLLBACK',\n};\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport interface TransactionOptions {\n level: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\nexport class Transaction {\n transaction<T extends PickQueryQAndInternal, Result>(\n this: T,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<T extends PickQueryQAndInternal, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<T extends PickQueryQAndInternal, 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 SingleSqlItem;\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 } 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 applyTransforms,\n callWithThis,\n ColumnParser,\n ColumnsParsers,\n emptyArray,\n getValueKey,\n QueryReturnType,\n RecordString,\n RecordUnknown,\n SingleSqlItem,\n Sql,\n TransactionState,\n} from 'orchid-core';\nimport { commitSql } from './transaction';\n\nexport const queryMethodByReturnType: {\n [K in QueryReturnType]: '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 // 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: (\n this: Query,\n) => (this: Query, resolve?: Resolve, reject?: Reject) => Promise<unknown>;\n\n// workaround for the bun issue: https://github.com/romeerez/orchid-orm/issues/198\nif (process.versions.bun) {\n getThen = function () {\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 configurable: true,\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: RecordString = {};\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 beginSql: SingleSqlItem = { text: 'BEGIN' };\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 const { returnType = 'all' } = query;\n const returns = hookSelect ? 'all' : returnType;\n\n let result;\n let queryResult;\n\n if ('text' in sql) {\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 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 result = query.handleResult(q, returns, queryResult);\n } else {\n // autoPreparedStatements in batch doesn't seem to make sense\n\n const queryMethod = hookSelect\n ? 'query'\n : (queryMethodByReturnType[returnType] as 'query');\n\n if (!trx) {\n if (query.log) logData = query.log.beforeQuery(beginSql);\n await adapter.arrays(beginSql);\n if (query.log) query.log.afterQuery(beginSql, logData);\n }\n\n for (const item of sql.batch) {\n sql = item;\n\n if (query.log) {\n logData = query.log.beforeQuery(sql);\n }\n\n const result = (await adapter[queryMethod](sql)) as QueryResult;\n\n if (queryResult) {\n queryResult.rowCount += result.rowCount;\n queryResult.rows.push(...result.rows);\n } else {\n queryResult = result;\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\n if (!trx) {\n if (query.log) logData = query.log.beforeQuery(commitSql);\n await adapter.arrays(commitSql);\n if (query.log) query.log.afterQuery(commitSql, logData);\n }\n\n if (query.patchResult) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await query.patchResult(q, queryResult!);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result = query.handleResult(q, returns, queryResult!);\n }\n\n if (afterHooks || afterCommitHooks || query.after) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result = filterResult(q, returnType, queryResult!, hookSelect, result);\n }\n\n if (query.transform) {\n result = applyTransforms(returnType, query.transform, result);\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 as SingleSqlItem, 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: RecordUnknown = {};\n for (const key of pick) {\n filtered[key] = (full as RecordUnknown)[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 RecordUnknown)[key] = (row as RecordUnknown)[key];\n }\n }\n return result;\n }\n }\n\n if (returnType === 'value') {\n return (result as RecordUnknown[])[0]?.[queryResult.fields[0].name];\n }\n\n if (returnType === 'valueOrThrow') {\n const row = (result as RecordUnknown[])[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 RecordUnknown[]).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 RecordUnknown)[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 {\n GetQueryResult,\n PickQueryQ,\n Query,\n QueryMetaHasSelect,\n QueryReturnsAll,\n WithDataBase,\n} from '../query/query';\nimport {\n ColumnsShapeToNullableObject,\n ColumnsShapeToObject,\n ColumnsShapeToObjectArray,\n ColumnsShapeToPluck,\n} from '../columns';\nimport { JSONTextColumn } from '../columns/json';\nimport { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { SelectItem, SelectQueryData, ToSQLQuery } from '../sql';\nimport { QueryResult } from '../adapter';\nimport {\n applyTransforms,\n ColumnTypeBase,\n emptyArray,\n Expression,\n getValueKey,\n isExpression,\n MaybeArray,\n PickQueryMeta,\n QueryColumn,\n QueryColumns,\n QueryMetaBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n setColumnData,\n setParserToQuery,\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';\nimport { defaultSchemaConfig } from '../columns/defaultSchemaConfig';\nimport { RelationsBase } from '../relations';\nimport { parseRecord } from './then';\nimport { _queryNone, isQueryNone } from './none';\nimport { NotFoundError } from '../errors';\n\ninterface SelectSelf {\n shape: QueryColumns;\n relations: RelationsBase;\n result: QueryColumns;\n meta: QueryMetaBase;\n returnType: QueryReturnType;\n withData: WithDataBase;\n}\n\n// .select method argument.\nexport type SelectArg<T extends SelectSelf> =\n | '*'\n | keyof T['meta']['selectable'];\n\nexport type SelectArgs<T extends SelectSelf> = (\n | '*'\n | keyof T['meta']['selectable']\n)[];\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.\ninterface SelectAsArg<T extends SelectSelf> {\n [K: string]:\n | keyof T['meta']['selectable']\n | Expression\n | ((q: {\n [K in keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['relationConfig']['methodQuery']\n : T[K];\n }) => QueryBase | Expression);\n}\n\n// Result type of select without the ending object argument.\ntype SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = {\n [K in keyof T]: K extends 'result'\n ? ('*' extends Columns[number]\n ? {\n [K in\n | Columns[number]\n | keyof T['shape'] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }\n : {\n [K in Columns[number] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }) &\n (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]> // Omit is optimal\n : unknown)\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n ('*' extends Columns[number]\n ? {\n [K in\n | Columns[number]\n | keyof T['shape'] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }\n : {\n [K in Columns[number] as T['meta']['selectable'][K]['as']]: T['meta']['selectable'][K]['column'];\n }) &\n (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n >\n : T[K];\n} & QueryMetaHasSelect;\n\ntype SelectResultObj<T extends SelectSelf, Obj> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & {\n hasSelect: true;\n selectable: SelectAsSelectable<Obj>;\n }\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in T['meta']['hasSelect'] extends true\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n {\n [K in T['meta']['hasSelect'] extends true\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n >\n >\n : T[K];\n};\n\n// Result type of select with the ending object argument.\ntype SelectResultColumnsAndObj<\n T extends SelectSelf,\n Columns extends PropertyKey[],\n Obj,\n> = {\n [K in keyof T]: K extends 'meta'\n ? T['meta'] & {\n hasSelect: true;\n selectable: SelectAsSelectable<Obj>;\n }\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj as K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['as']\n : K]: K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : never;\n } & (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // result is copy-pasted to save on TS instantiations\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | keyof T['shape']\n : Columns[number])\n | keyof Obj as K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['as']\n : K]: K extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][K]['column']\n : K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : never;\n } & (T['meta']['hasSelect'] extends true\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n >\n : T[K];\n};\n\n// Add new 'selectable' types based on the select object argument.\ntype SelectAsSelectable<Arg> = {\n [K in keyof Arg]: Arg[K] extends (q: never) => {\n returnType: 'value' | 'valueOrThrow';\n result: QueryColumns;\n }\n ? {\n [P in K]: {\n as: K;\n column: ReturnType<Arg[K]>['result']['value'];\n };\n }\n : Arg[K] extends (q: never) => {\n result: QueryColumns;\n }\n ? {\n [C in keyof ReturnType<Arg[K]>['result'] & string as `${K &\n string}.${C}`]: {\n as: C;\n column: ReturnType<Arg[K]>['result'][C];\n };\n }\n : never;\n}[keyof Arg];\n\n// map a single value of select object arg into a column\ntype SelectAsValueResult<\n T extends SelectSelf,\n Arg,\n> = Arg extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][Arg]['column']\n : Arg extends Expression\n ? Arg['result']['value']\n : Arg extends (q: never) => QueryBase\n ? SelectSubQueryResult<ReturnType<Arg>>\n : Arg extends (q: never) => Expression\n ? ReturnType<Arg>['result']['value']\n : Arg extends (q: never) => QueryBase | Expression\n ?\n | SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>>\n | Exclude<ReturnType<Arg>, QueryBase>['result']['value']\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 SelectSelf> = QueryReturnsAll<\n Arg['returnType']\n> extends true\n ? ColumnsShapeToObjectArray<Arg['result']>\n : Arg['returnType'] extends 'value' | 'valueOrThrow'\n ? Arg['result']['value']\n : Arg['returnType'] extends 'pluck'\n ? ColumnsShapeToPluck<Arg['result']>\n : Arg['returnType'] extends 'one'\n ? ColumnsShapeToNullableObject<Arg['result']>\n : ColumnsShapeToObject<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: PickQueryQ,\n key: string | getValueKey,\n raw: Expression,\n) => {\n const type = raw.result.value as unknown as ColumnTypeBase;\n if (type?.parseFn) setParserToQuery(q.q, key, 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: PickQueryQ,\n arg: string,\n as: string | getValueKey = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (row) => parseRecord(parsers, row));\n }\n};\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends PickQueryMeta>(\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 as never, key, arg);\n } else {\n const { q: query } = arg;\n if (query.parsers || query.transform) {\n setParserToQuery((q as unknown as Query).q, key, (item) => {\n const t = query.returnType || 'all';\n\n subQueryResult.rows =\n t === 'value' || t === 'valueOrThrow'\n ? [[item]]\n : t === 'one' || t === 'oneOrThrow'\n ? [item]\n : (item as unknown[]);\n\n const result = query.handleResult(arg, t, subQueryResult, true);\n return query.transform\n ? applyTransforms(t, query.transform, result)\n : result;\n });\n }\n\n if (\n query.returnType === 'valueOrThrow' ||\n query.returnType === 'oneOrThrow'\n ) {\n pushQueryValue(\n q as unknown as PickQueryQ,\n 'transform',\n (data: MaybeArray<RecordUnknown>) => {\n if (Array.isArray(data)) {\n for (const item of data) {\n if (item[key as string] === undefined) {\n throw new NotFoundError(q as unknown as Query);\n }\n }\n } else {\n if (data[key as string] === undefined) {\n throw new NotFoundError(q as unknown as Query);\n }\n }\n return data;\n },\n );\n }\n }\n return arg;\n }\n\n return setParserForSelectedString(q as never, arg as string, as, key);\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 SelectSelf>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string | getValueKey,\n): SelectItem | undefined => {\n if (typeof arg === 'string') {\n return setParserForSelectedString(q as unknown as Query, arg, as, columnAs);\n }\n\n const selectAs: { [K: 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 as unknown as ToSQLQuery, value);\n\n if (isQueryNone(value)) {\n if (value.q.innerJoinLateral) {\n return;\n }\n } else if (!isExpression(value) && value.joinQuery) {\n value = value.joinQuery(value, q);\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 as unknown as Query).q.joinOverrides ??=\n {});\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?.subQuery && value.q.expr) {\n value = value.q.expr;\n }\n }\n\n selectAs[key] = addParserForSelectItem(\n q as unknown as Query,\n as,\n key,\n value,\n );\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: PickQueryQ,\n arg: string,\n as: string | getValueKey | undefined,\n columnAs?: string | getValueKey,\n): string => {\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 return table === as ? column : arg;\n } else {\n if (table === as) {\n const parser = q.q.parsers?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n return column;\n } else {\n const parser = q.q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q.q, columnAs || column, parser);\n return arg;\n }\n }\n } else {\n const parser = q.q.parsers?.[arg];\n if (parser) setParserToQuery(q.q, columnAs || arg, parser);\n return arg;\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: QueryColumns;\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.result.value as unknown as ColumnTypeBase;\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(defaultSchemaConfig);\n }\n }\n }\n } else if (isExpression(item)) {\n result.value = item.result.value;\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: QueryColumns,\n query: SelectQueryData,\n result: QueryColumns,\n isSubQuery?: boolean,\n key?: string,\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: QueryColumn, isSubQuery?: boolean) => {\n // `?` is needed for case when wrong column is passed to subquery (see issue #236)\n return isSubQuery && (column as ColumnTypeBase)?.data.name\n ? setColumnData(column as ColumnTypeBase, 'name', undefined)\n : column;\n};\n\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n>(q: T, columns: Columns): SelectResult<T, Columns>;\nexport function _querySelect<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n q: T,\n obj: Obj,\n): SelectResultObj<T, Obj>;\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n>(\n q: T,\n args: [...columns: Columns, obj: Obj],\n): SelectResultColumnsAndObj<T, Columns, Obj>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _querySelect(q: Query, args: any[]): any {\n const len = args.length;\n if (!len) {\n return q;\n }\n\n const as = q.q.as || q.table;\n const selectArgs = new Array(len) as (SelectItem | undefined)[];\n for (let i = 0; i < len; i++) {\n selectArgs[i] = processSelectArg(q, as, args[i]);\n if (!selectArgs[i]) {\n return _queryNone(q);\n }\n }\n\n return pushQueryArray(q, 'select', selectArgs);\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, specify the returning type via <generic> syntax:\n * db.table.select({\n * raw: sql<number>`1 + 2`,\n * });\n *\n * // select raw SQL value, the resulting type can be set by providing a column type in such way:\n * db.table.select({\n * raw: sql`1 + 2`.type((t) => t.integer()),\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`1 + 2`.type((t) => t.integer()),\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 SelectSelf, Columns extends SelectArgs<T>>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n select<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n this: T,\n obj: Obj,\n ): SelectResultObj<T, Obj>;\n select<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultColumnsAndObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(this: SelectSelf, ...args: any[]): any {\n return _querySelect((this as Query).clone(), args);\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 SelectSelf>(this: T): SelectResult<T, ['*']> {\n const q = (this as unknown as Query).clone();\n q.q.select = ['*'];\n return q as never;\n }\n}\n","import { Expression, QueryColumn } from 'orchid-core';\nimport {\n QueryData,\n SelectAs,\n SelectItem,\n SelectQueryData,\n ToSQLCtx,\n ToSQLQuery,\n} from '../sql';\nimport { selectAllSql, selectedObjectToSQL } from '../sql/select';\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 QueryColumn = QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: QueryData;\n\n constructor(\n public query: ToSQLQuery,\n public item: string | Expression,\n value?: T,\n ) {\n super();\n this.result = { value: value as T };\n this.q = query.q;\n if (value) Object.assign(this, value.operators);\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.query, this.q as SelectQueryData, quotedAs)\n : ctx.aliasValue\n ? columnToSql(ctx, this.q, this.q.shape, this.item, quotedAs, true)\n : columnToSqlWithAs(ctx, this.q, this.item, quotedAs, true)\n : selectedObjectToSQL(ctx, quotedAs, this.item);\n }\n}\n","import {\n PickQueryMetaTable,\n Query,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsColumnOrThrow,\n SetQueryReturnsValueOptional,\n SetQueryReturnsValueOrThrow,\n} from '../query/query';\nimport {\n Expression,\n getValueKey,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport { SelectQueryData } from '../sql';\nimport {\n addParserForRawExpression,\n setParserForSelectedString,\n} from './select';\nimport { getQueryAs } from '../common/utils';\nimport { SelectItemExpression } from '../common/selectItemExpression';\nimport { Operators, setQueryOperators } from '../columns/operators';\n\nexport type QueryGetSelf = PickQueryMetaTable;\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryGetSelf> = GetStringArg<T> | Expression;\n\nexport type GetStringArg<T extends PickQueryMeta> =\n keyof T['meta']['selectable'] & string;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\nexport type GetResult<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOrThrow<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<T, Arg['result']['value']>\n : never;\n\nexport type GetResultOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOptional<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOptional<T, Arg['result']['value']>\n : never;\n\n// mutate the query to get a single value\nconst _get = <\n T extends QueryGetSelf,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n query: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n const q = (query as unknown as Query).q;\n q.returnType = returnType;\n\n let type: QueryColumn | undefined;\n if (typeof arg === 'string') {\n type = 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.as || (query as unknown as Query).table)) {\n type = q.shape[column];\n } else {\n type = q.joinedShapes?.[table]?.[column];\n }\n }\n }\n\n (q as SelectQueryData)[getValueKey] = type;\n\n setParserForSelectedString(\n query as unknown as Query,\n arg,\n getQueryAs(query as unknown as Query),\n getValueKey,\n );\n\n q.expr = new SelectItemExpression(query as unknown as Query, arg, type);\n } else {\n type = arg.result.value;\n (q as SelectQueryData)[getValueKey] = type;\n addParserForRawExpression(query as unknown as Query, getValueKey, arg);\n q.expr = arg;\n }\n\n q.select = [q.expr];\n\n return setQueryOperators(\n query as unknown as Query,\n type?.operators || Operators.any,\n ) as unknown as GetResult<T, Arg> & GetResultOptional<T, Arg>;\n};\n\nexport function _queryGet<T extends QueryGetSelf, Arg extends GetArg<T>>(\n self: T,\n arg: Arg,\n): GetResult<T, Arg> {\n return _get(self, 'valueOrThrow', arg);\n}\n\nexport function _queryGetOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n>(self: T, arg: Arg): GetResultOptional<T, Arg> {\n return _get(self, 'value', arg);\n}\n","import {\n PickQueryMetaTableShape,\n Query,\n SetQueryTableAlias,\n} from '../query/query';\n\nexport type AsQueryArg = PickQueryMetaTableShape;\n\nexport const _queryAs = <T extends AsQueryArg, As extends string>(\n self: T,\n as: As,\n): SetQueryTableAlias<T, As> => {\n (self as unknown as Query).q.as = as;\n return self as SetQueryTableAlias<T, As>;\n};\n\nexport abstract class AsMethods {\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 AsQueryArg, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return _queryAs((this as unknown as Query).clone(), as) as never;\n }\n}\n","import {\n Query,\n SelectableFromShape,\n SetQueryTableAlias,\n WithDataItems,\n PickQueryQ,\n PickQueryMetaTableShapeReturnTypeWithData,\n GetQueryResult,\n} from '../query/query';\nimport { RecordOfColumnsShapeBase, SelectQueryData } from '../sql';\nimport { AliasOrTable } from '../common/utils';\nimport {\n QueryThen,\n ColumnsShapeBase,\n PickQueryTableMetaResult,\n SQLQueryArgs,\n isExpression,\n Expression,\n MaybeArray,\n PickQueryTableMetaResultInputType,\n} from 'orchid-core';\nimport { getShapeFromSelect } from './select';\nimport { QueryBase } from '../query/queryBase';\nimport { sqlQueryArgsToExpression } from '../sql/rawSql';\n\nexport type FromQuerySelf = PickQueryMetaTableShapeReturnTypeWithData;\n\nexport type FromArg<T extends FromQuerySelf> =\n | PickQueryTableMetaResult\n | Expression\n | Exclude<keyof T['withData'], symbol | number>;\n\ntype UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (\n x: infer I,\n) => void\n ? I\n : never;\n\nexport type FromResult<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n> = Arg extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'as'\n ? string | undefined\n : K extends 'selectable'\n ? SelectableFromShape<T['withData'][Arg]['shape'], Arg>\n : K extends 'kind'\n ? 'select'\n : T['meta'][K];\n }\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, T['withData'][Arg]['shape']>>\n : T[K];\n }\n : SetQueryTableAlias<T, Arg>\n : Arg extends PickQueryTableMetaResultInputType\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'as'\n ? AliasOrTable<Arg>\n : K extends 'selectable'\n ? SelectableFromShape<Arg['result'], AliasOrTable<Arg>>\n : K extends 'kind'\n ? 'select'\n : T['meta'][K];\n }\n : K extends 'result'\n ? Arg['result']\n : K extends 'shape'\n ? Arg['result']\n : K extends 'inputType'\n ? Arg['inputType']\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, Arg['result']>>\n : T[K];\n }\n : Arg extends (infer A)[]\n ? {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? UnionToIntersection<\n A extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T['withData'][A]['shape'] &\n string as `${A}.${K}`]: {\n as: K;\n column: T['withData'][A]['shape'][K];\n };\n }\n : never\n : A extends PickQueryTableMetaResult\n ? {\n [K in keyof A['result'] &\n string as `${AliasOrTable<A>}.${K}`]: K extends string\n ? {\n as: K;\n column: A['result'][K];\n }\n : never;\n }\n : never\n >\n : T['meta'][K];\n }\n : T[K];\n }\n : T;\n\nexport function queryFrom<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n>(self: T, arg: Arg): FromResult<T, Arg> {\n const data = (self as unknown as PickQueryQ).q;\n if (typeof arg === 'string') {\n data.as ||= arg;\n data.shape = data.withShapes?.[arg] as ColumnsShapeBase;\n } else if (isExpression(arg)) {\n data.as ||= 't';\n } else if (Array.isArray(arg)) {\n const { shape } = data;\n const parsers = (data.parsers ??= {});\n for (const item of arg) {\n if (typeof item === 'string') {\n const withShape = (data.withShapes as RecordOfColumnsShapeBase)[item];\n\n Object.assign(shape, withShape);\n\n for (const key in withShape) {\n if (withShape[key].parseFn) {\n parsers[key] = withShape[key].parseFn;\n }\n }\n } else if (!isExpression(item)) {\n Object.assign(shape, getShapeFromSelect(item as QueryBase, true));\n Object.assign(parsers, item.q.parsers);\n }\n }\n } else {\n const q = arg as Query;\n data.as ||= q.q.as || q.table || 't';\n data.shape = getShapeFromSelect(arg as QueryBase, true) as ColumnsShapeBase;\n data.parsers = q.q.parsers;\n }\n\n data.from = arg as Query;\n\n return self as never;\n}\n\nexport function queryFromSql<T extends FromQuerySelf>(\n self: T,\n args: SQLQueryArgs,\n): T {\n const data = (self as unknown as PickQueryQ).q;\n data.as ||= 't';\n data.from = sqlQueryArgsToExpression(args);\n return self;\n}\n\nexport class FromMethods {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * `from` determines a set of available tables and columns withing the query,\n * and thus it must not follow `select`, use `select` only after `from`.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(db.otherTable.select('foo', 'bar'));\n *\n * // accepts alias of `WITH` expression:\n * q.with('withTable', db.table.select('id', 'name'))\n * .from('withTable')\n * // `select` is after `from`\n * .select('id', 'name');\n * ```\n *\n * `from` can accept multiple sources:\n *\n * ```ts\n * db.table\n * // add a `WITH` statement called `withTable\n * .with('withTable', db.table.select('one'))\n * // select from `withTable` and from `otherTable`\n * .from('withTable', db.otherTable.select('two'))\n * // source names and column names are properly typed when selecting\n * .select('withTable.one', 'otherTable.two');\n * ```\n *\n * @param arg - query or name of CTE table\n */\n from<T extends FromQuerySelf, Arg extends MaybeArray<FromArg<T>>>(\n this: T,\n arg: T['meta']['hasSelect'] extends true\n ? '`select` must be placed after `from`'\n : Arg,\n ): FromResult<T, Arg> {\n return queryFrom((this as unknown as Query).clone(), arg as never) as never;\n }\n\n /**\n * Set the `FROM` value with custom SQL:\n *\n * ```ts\n * const value = 123;\n * db.table.fromSql`value = ${value}`;\n * ```\n *\n * @param args - SQL expression\n */\n fromSql<T extends FromQuerySelf>(this: T, ...args: SQLQueryArgs): T {\n return queryFromSql(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * Adds `ONLY` SQL keyword to the `FROM`.\n * When selecting from a parent table that has a table inheritance,\n * setting `only` will make it to select rows only from the parent table.\n *\n * ```ts\n * db.table.only();\n *\n * // disabling `only` after being enabled\n * db.table.only().only(false);\n * ```\n *\n * @param only - can be disabled by passing `false` if was enabled previously.\n */\n only<T>(this: T, only = true): T {\n const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).only = only;\n return q as T;\n }\n}\n","import { Query, SetQueryTableAlias } from '../query/query';\nimport { _queryAs } from './as';\nimport { queryFrom } from './from';\nimport { WrapQueryArg } from './queryMethods';\nimport { PickQueryTableMetaResult } from 'orchid-core';\n\nexport function queryWrap<\n T extends PickQueryTableMetaResult,\n Q extends WrapQueryArg,\n As extends string = 't',\n>(self: T, query: Q, as: As = 't' as As): SetQueryTableAlias<Q, As> {\n return _queryAs(queryFrom(query, self), as) as never;\n}\n\n/**\n * This function is useful when wrapping a query,\n * such as when doing `SELECT json_agg(t.*) FROM (...) AS t`,\n * to get rid of default scope conditions (WHERE deletedAt IS NULL)\n * that otherwise would be duplicated inside the `FROM` and after `AS t`.\n */\nexport function cloneQueryBaseUnscoped(query: Query) {\n const q = query.baseQuery.clone();\n q.q.or = q.q.and = q.q.scopes = undefined;\n return q;\n}\n","import { _queryGetOptional } from './get.utils';\nimport { RawSQL } from '../sql/rawSql';\nimport {\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { QueryColumn } from 'orchid-core';\nimport { cloneQueryBaseUnscoped, queryWrap } from './queryMethods.utils';\n\nexport function queryJson<T>(\n self: T,\n coalesce?: boolean,\n): SetQueryReturnsColumnOptional<T, QueryColumn<string>> {\n const q = queryWrap(\n self as Query,\n cloneQueryBaseUnscoped(self as Query),\n ) as unknown as Query;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n _queryGetOptional(\n q,\n new RawSQL(\n queryTypeWithLimitOne[(self as Query).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 never;\n}\n","import { SelectItem } from './types';\nimport { RawSQL } from './rawSql';\nimport { columnToSql, columnToSqlWithAs } from './common';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../errors';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { SelectQueryData } from './data';\nimport { SelectableOrExpression } from '../common/utils';\nimport { addValue, Expression, isExpression } from 'orchid-core';\nimport { Query } from '../query/query';\nimport { _queryGetOptional } from '../queryMethods/get.utils';\nimport { queryJson } from '../queryMethods/json.utils';\nimport { queryWrap } from '../queryMethods/queryMethods.utils';\nimport { isQueryNone } from '../queryMethods/none';\nimport { IntegerBaseColumn } from '../columns';\nimport { getSqlText } from './utils';\n\nexport const pushSelectSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['join'] },\n quotedAs?: string,\n) => {\n ctx.sql.push(selectToSql(ctx, table, query, quotedAs));\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['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 {\n [K: string]: SelectableOrExpression | ToSQLQuery;\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}\"`);\n } else {\n pushSubQuerySql(ctx, value, 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}\"`,\n );\n }\n }\n } else {\n list.push(selectedObjectToSQL(ctx, 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: ToSQLQuery,\n query: { select?: SelectQueryData['select']; join?: SelectQueryData['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 quotedAs: string | undefined,\n item: Expression,\n) {\n const sql = item.toSQL(ctx, quotedAs);\n return ctx.aliasValue ? `${sql} r` : sql;\n}\n\nexport const selectAllSql = (\n table: ToSQLQuery,\n query: { join?: 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: ToSQLQuery,\n as: string,\n list: string[],\n quotedAs?: string,\n) => {\n const { returnType = 'all' } = query.q;\n\n if (isQueryNone(query)) {\n let sql: string;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n case 'void':\n return;\n case 'value':\n case 'valueOrThrow':\n if (query.q.expr?.result.value instanceof IntegerBaseColumn) {\n sql = '0';\n } else {\n return;\n }\n break;\n case 'all':\n case 'pluck':\n case 'rows':\n sql = `'[]'::json`;\n break;\n case 'rowCount':\n sql = '0';\n break;\n default:\n throw new UnhandledTypeError(query as Query, returnType);\n }\n list.push(`${sql} \"${as}\"`);\n return;\n }\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 as 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 = queryJson(query) 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 as 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 = queryWrap(cloned, cloned.baseQuery.clone());\n _queryGetOptional(query, 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 as Query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${getSqlText(makeSQL(query, ctx))})`,\n quotedAs,\n )} \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\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 { maybeSelectedColumnToSql } from './common';\nimport { ToSQLCtx } from './toSQL';\nimport { QueryData, SelectQueryData } from './data';\nimport { addValue, 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 `${maybeSelectedColumnToSql(ctx, data, 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 { 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 { WithItem, WithOptions } from './types';\nimport { emptyObject, Expression } from 'orchid-core';\nimport { getSqlText } from './utils';\n\nexport const pushWithSql = (ctx: ToSQLCtx, items: WithItem[]) => {\n if (!items.length) return;\n\n ctx.sql.push(\n 'WITH',\n items\n .map((item) => {\n let inner: string;\n if (item.q) {\n inner = getSqlText(makeSQL(item.q, ctx));\n } else {\n inner = (item.s as Expression).toSQL(ctx, `\"${item.n}\"`);\n }\n\n const o = item.o ?? (emptyObject as WithOptions);\n return `${o.recursive ? 'RECURSIVE ' : ''}\"${item.n}\"${\n o.columns ? `(${o.columns.map((x) => `\"${x}\"`).join(', ')})` : ''\n } AS ${\n o.materialized\n ? 'MATERIALIZED '\n : o.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`;\n })\n .join(', '),\n );\n};\n","import { Query, QueryWithTable } from '../query/query';\nimport { RelationQuery } from '../relations';\nimport { SelectableOrExpression } from '../common/utils';\nimport { SelectQueryData } from './data';\nimport {\n Expression,\n MaybeArray,\n TemplateLiteralArgs,\n SelectableBase,\n RecordUnknown,\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 q.q.scopes\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 'only',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n\nexport type WithItem = {\n // name\n n: string;\n // options\n o?: WithOptions;\n // query\n q?: Query;\n // sql\n s?: Expression;\n};\n\nexport interface WithOptions {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport type SelectItem = string | SelectAs | Expression;\n\nexport interface SelectAs {\n selectAs: SelectAsValue;\n}\n\ninterface SelectAsValue {\n [K: string]: string | Query | Expression;\n}\n\nexport type OrderTsQueryConfig = true | OrderTsQueryConfigObject;\n\ninterface OrderTsQueryConfigObject {\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> | SearchWeightRecord;\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 SimpleJoinItemNonSubQueryArgs =\n | [{ [K: string]: string | Expression } | Expression | true]\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n\nexport type JoinItemArgs =\n | {\n // relation query from `relationConfig.joinQuery`\n j: Query;\n // join sub query\n s: boolean;\n // callback result, if callback is present\n r?: Query;\n }\n | {\n // `with` item name\n w: string;\n // callback result\n r: Query;\n // join sub query\n s: boolean;\n }\n | {\n // `with` item name\n w: string;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n }\n | {\n // joining query\n q: QueryWithTable;\n // join sub query\n s: boolean;\n }\n | {\n // joining query\n q: QueryWithTable;\n // callback result\n r: Query;\n // join sub query\n s: boolean;\n }\n | {\n // joining query\n q: QueryWithTable;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n // join sub query\n s: boolean;\n };\n\nexport interface SimpleJoinItem {\n type: string;\n args: JoinItemArgs;\n}\n\nexport type JoinLateralItem = [type: string, joined: Query, as: string];\n\nexport type WhereItem =\n | {\n [K: string]:\n | unknown\n | { [K: string]: unknown | Query | Expression }\n | Expression;\n\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<JoinItemArgs>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n }\n | ((q: unknown) => QueryBase | RelationQuery | Expression)\n | Query\n | Expression;\n\nexport interface 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 interface 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 SearchWeightRecord = { [K: string]: SearchWeight };\n\nexport interface 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 | { [K: 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 = { [K: string]: WindowDeclaration | Expression };\n\nexport interface WindowDeclaration {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n}\n\nexport interface UnionItem {\n a: Query | Expression;\n k: UnionKind;\n}\n\nexport interface UnionSet {\n b: Query;\n u: UnionItem[];\n}\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport type OnConflictTarget =\n | string\n | string[]\n | Expression\n | { constraint: string };\n\nexport type OnConflictSet = RecordUnknown | Expression;\n\nexport type OnConflictMerge = string | string[] | { except: string | string[] };\n","import { columnToSql, quoteSchemaAndTable } from './common';\nimport { checkIfASimpleQuery, QuerySourceItem } from './types';\nimport { makeSQL, ToSQLCtx } from './toSQL';\nimport { QueryData, QueryDataFromItem, SelectQueryData } from './data';\nimport { QueryBase } from '../query/queryBase';\nimport { addValue, isExpression, isRawSQL, MaybeArray } from 'orchid-core';\nimport { getSqlText } from './utils';\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n table: QueryBase,\n data: SelectQueryData,\n quotedAs?: string,\n) => {\n let sql = 'FROM ';\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 data: SelectQueryData,\n quotedAs?: string,\n) => {\n if (data.from) {\n const { from } = data;\n if (Array.isArray(from)) {\n return from\n .map((item) => fromToSql(ctx, data, item, quotedAs))\n .join(', ');\n }\n\n return fromToSql(ctx, data, from, quotedAs);\n }\n\n let sql = quoteSchemaAndTable(data.schema, table.table as string);\n if (data.only) sql = `ONLY ${sql}`;\n return sql;\n};\n\nconst fromToSql = (\n ctx: ToSQLCtx,\n data: SelectQueryData,\n from: QueryDataFromItem,\n quotedAs?: string,\n) => {\n let only: boolean | undefined;\n let sql;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n sql = from.toSQL(ctx, quotedAs);\n } else {\n only = (from.q as SelectQueryData).only;\n\n if (!from.table) {\n sql = `(${getSqlText(makeSQL(from, ctx))})`;\n }\n // if query contains more than just schema return (SELECT ...)\n else if (!checkIfASimpleQuery(from)) {\n sql = `(${getSqlText(makeSQL(from, ctx))})`;\n } else {\n sql = quoteSchemaAndTable(from.q.schema, from.table);\n }\n }\n } else {\n sql = quoteSchemaAndTable(data.schema, from);\n }\n\n return (only === undefined ? data.only : only) ? `ONLY ${sql}` : sql;\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","export const MAX_BINDING_PARAMS = 65536;\n","import { ownColumnToSql } from './common';\nimport { pushWhereStatementSql } from './where';\nimport { Query } from '../query/query';\nimport { selectToSql } from './select';\nimport { makeSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { pushQueryValue } from '../query/queryUtils';\nimport { InsertQueryData, QueryData, QueryHookSelect } from './data';\nimport {\n addValue,\n ColumnTypeBase,\n emptyArray,\n Expression,\n isExpression,\n MaybeArray,\n pushOrNewArray,\n SingleSqlItem,\n Sql,\n} from 'orchid-core';\nimport { joinSubQuery } from '../common/utils';\nimport { Db } from '../query/db';\nimport { RawSQL } from './rawSql';\nimport { OnConflictTarget } from './types';\nimport { getSqlText } from './utils';\nimport { MAX_BINDING_PARAMS } from './constants';\n\n// reuse array for the columns list\nconst quotedColumns: string[] = [];\n\nexport const makeInsertSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: InsertQueryData,\n quotedAs: string,\n): Sql => {\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] as ColumnTypeBase;\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(\n `INSERT INTO ${quotedAs}(${quotedColumns.join(', ')})`,\n null as never,\n );\n\n const QueryClass = ctx.queryBuilder.constructor as unknown as Db;\n\n if (query.onConflict) {\n ctx.sql.push('ON CONFLICT');\n\n const { target } = query.onConflict;\n if (target) {\n if (typeof target === 'string') {\n ctx.sql.push(`(\"${shape[target]?.data.name || target}\")`);\n } else if (Array.isArray(target)) {\n ctx.sql.push(\n `(${target.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else if ('toSQL' in target) {\n ctx.sql.push(target.toSQL(ctx, quotedAs));\n } else {\n ctx.sql.push(`ON CONSTRAINT \"${target.constraint}\"`);\n }\n }\n\n // merge: undefined should also be handled by this `if`\n if ('merge' in query.onConflict) {\n let sql: string;\n\n const { merge } = query.onConflict;\n if (merge) {\n if (typeof merge === 'string') {\n const name = shape[merge]?.data.name || merge;\n sql = `DO UPDATE SET \"${name}\" = excluded.\"${name}\"`;\n } else if ('except' in merge) {\n sql = mergeColumnsSql(columns, quotedColumns, target, merge.except);\n } else {\n sql = `DO UPDATE SET ${merge.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '')}`;\n }\n } else {\n sql = mergeColumnsSql(columns, quotedColumns, target);\n }\n\n ctx.sql.push(sql);\n } else if (query.onConflict.set) {\n let sql: string;\n\n const { set } = query.onConflict;\n if (isExpression(set)) {\n sql = set.toSQL(ctx, quotedAs);\n } else {\n const arr: string[] = [];\n for (const key in set) {\n arr.push(\n `\"${shape[key]?.data.name || key}\" = ${addValue(\n ctx.values,\n set[key],\n )}`,\n );\n }\n sql = arr.join(', ');\n }\n\n ctx.sql.push('DO UPDATE SET', sql);\n } else {\n ctx.sql.push('DO NOTHING');\n }\n }\n\n pushWhereStatementSql(ctx, q, query, quotedAs);\n\n const hookSelect = pushReturningSql(\n ctx,\n q,\n query,\n quotedAs,\n query.afterCreateSelect,\n );\n\n if (query.kind === 'object') {\n const valuesSql: string[] = [];\n let ctxValues = ctx.values;\n const restValuesLen = ctxValues.length;\n let currentValuesLen = restValuesLen;\n let batch: SingleSqlItem[] | undefined;\n\n for (let i = 0; i < (values as unknown[][]).length; i++) {\n const encodedRow = `(${encodeRow(\n ctx,\n ctxValues,\n q,\n QueryClass,\n (values as unknown[][])[i],\n runtimeDefaults,\n quotedAs,\n )})`;\n\n if (ctxValues.length > MAX_BINDING_PARAMS) {\n if (ctxValues.length - currentValuesLen > MAX_BINDING_PARAMS) {\n throw new Error(\n `Too many parameters for a single insert row, max is ${MAX_BINDING_PARAMS}`,\n );\n }\n\n // save current batch\n ctx.sql[1] = `VALUES ${valuesSql.join(',')}`;\n ctxValues.length = currentValuesLen;\n batch = pushOrNewArray(batch, {\n text: ctx.sql.join(' '),\n values: ctxValues,\n });\n\n // reset sql and values for the next batch, repeat the last cycle\n ctxValues = ctx.values = [];\n valuesSql.length = 0;\n i--;\n } else {\n currentValuesLen = ctxValues.length;\n valuesSql.push(encodedRow);\n }\n }\n\n if (batch) {\n ctx.sql[1] = `VALUES ${valuesSql.join(',')}`;\n batch.push({\n text: ctx.sql.join(' '),\n values: ctxValues,\n });\n\n return {\n hookSelect,\n batch,\n };\n } else {\n ctx.sql[1] = `VALUES ${valuesSql.join(', ')}`;\n }\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[1] = `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[1] = `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(\n ctx,\n ctx.values,\n q,\n QueryClass,\n v[0],\n runtimeDefaults,\n quotedAs,\n ),\n ),\n );\n }\n\n ctx.sql[1] = getSqlText(makeSQL(q, { values: ctx.values }));\n }\n\n return {\n hookSelect,\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n};\n\nconst mergeColumnsSql = (\n columns: string[],\n quotedColumns: string[],\n target: OnConflictTarget | undefined,\n except?: MaybeArray<string>,\n): string => {\n const notExcluded: string[] = [];\n\n const exclude =\n typeof target === 'string'\n ? [target]\n : Array.isArray(target)\n ? [...target]\n : [];\n\n if (except) {\n if (typeof except === 'string') {\n exclude.push(except);\n } else {\n exclude.push(...except);\n }\n }\n\n for (let i = 0; i < columns.length; i++) {\n if (!exclude.includes(columns[i])) {\n notExcluded.push(quotedColumns[i]);\n }\n }\n\n return notExcluded.length\n ? `DO UPDATE SET ${notExcluded\n .map((column) => `${column} = excluded.${column}`)\n .join(', ')}`\n : 'DO NOTHING';\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n values: unknown[],\n q: ToSQLQuery,\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n) => {\n const arr = row.map((value) => {\n if (value && typeof value === 'object') {\n if (value instanceof Expression) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n return `(${getSqlText(joinSubQuery(q, value as Query).toSQL(ctx))})`;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(values, value);\n });\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(values, fn()));\n }\n }\n\n return arr.join(', ');\n};\n\nexport const pushReturningSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\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 { quoteSchemaAndTable } from './common';\nimport { pushReturningSql } from './insert';\nimport { pushWhereStatementSql } from './where';\nimport { pushLimitSQL, ToSQLCtx, ToSQLQuery } from './toSQL';\nimport {\n QueryHookSelect,\n SelectQueryData,\n UpdateQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from './data';\nimport { addValue, isExpression, pushOrNewArray } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { joinSubQuery } from '../common/utils';\nimport { selectToSql } from './select';\nimport { countSelect } from './rawSql';\nimport { getSqlText } from './utils';\nimport { Query } from '../query/query';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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: ToSQLQuery,\n set: string[],\n data: UpdateQueryDataItem[],\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n const QueryClass = ctx.queryBuilder.constructor as unknown 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: ToSQLQuery,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n if ((value as Query).q.subQuery === 1) {\n return selectToSql(ctx, table, (value as Query).q, quotedAs);\n }\n\n return `(${getSqlText(\n joinSubQuery(table, value as ToSQLQuery).toSQL(ctx),\n )})`;\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 { pushWhereStatementSql } from './where';\nimport { pushReturningSql } from './insert';\nimport { processJoinItem } from './join';\nimport { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { DeleteQueryData, QueryHookSelect } from './data';\nimport { getSqlText } from './utils';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 targets: string[] = [];\n const ons: string[] = [];\n\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\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\n const as = item[2];\n targets.push(\n `LATERAL (${getSqlText(q.toSQL(ctx))}) \"${\n query.joinOverrides?.[as] || as\n }\"`,\n );\n\n ctx.aliasValue = aliasValue;\n } else {\n const join = processJoinItem(ctx, table, query, item.args, quotedAs);\n\n const key = `${join.target}${join.on}`;\n if (joinSet) {\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n targets.push(join.target);\n if (join.on) ons.push(join.on);\n }\n }\n\n if (targets.length) {\n ctx.sql.push(`USING ${targets.join(', ')}`);\n }\n\n conditions = ons.join(' AND ');\n }\n\n pushWhereStatementSql(ctx, table, query, quotedAs);\n\n if (conditions) {\n if (query.and?.length || query.or?.length || query.scopes) {\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 { ToSQLCtx, ToSQLQuery } from './toSQL';\nimport { ColumnInfoQueryData } from './data';\nimport { addValue } from 'orchid-core';\n\nexport const pushColumnInfoSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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, ToSQLQuery } from './toSQL';\nimport { CopyQueryData } from './data';\nimport { quoteString } from '../quote';\nimport { pushWhereStatementSql } from './where';\n\nexport const pushCopySql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\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 { maybeSelectedColumnToSql } 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 { makeInsertSql } 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 { addValue, isExpression, Sql } from 'orchid-core';\nimport { Db } from '../query/db';\nimport { getSqlText } from './utils';\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 type ToSQLQuery = {\n __isQuery: Query['__isQuery'];\n q: Query['q'];\n queryBuilder: Query['queryBuilder'];\n table?: Query['table'];\n internal: Query['internal'];\n relations: Query['relations'];\n withData: Query['withData'];\n clone: Query['clone'];\n baseQuery: Query['baseQuery'];\n meta: Query['meta'];\n returnType: Query['returnType'];\n result: Query['result'];\n shape: Query['shape'];\n};\n\nexport const toSQL = (table: ToSQLQuery, options?: ToSQLOptions): Sql => {\n return (\n (!options?.clearCache && table.q[toSQLCacheKey]) ||\n (table.q[toSQLCacheKey] = makeSQL(table, options))\n );\n};\n\nexport const makeSQL = (\n table: ToSQLQuery,\n options?: ToSqlOptionsInternal,\n): 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 const tableName = table.table ?? query.as;\n if (!tableName) throw new Error(`Table is missing for ${query.type}`);\n\n if (query.type === 'truncate') {\n pushTruncateSql(ctx, tableName, query);\n return { text: sql.join(' '), values };\n }\n\n if (query.type === 'columnInfo') {\n pushColumnInfoSql(ctx, table, query);\n return { text: sql.join(' '), values };\n }\n\n const quotedAs = `\"${query.as || tableName}\"`;\n\n if (query.type === 'insert') {\n return makeInsertSql(ctx, table, query, `\"${tableName}\"`);\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 if (query.union) {\n sql.push(`(${getSqlText(makeSQL(query.union.b, { values }))})`);\n\n for (const u of query.union.u) {\n const itemSql = isExpression(u.a)\n ? u.a.toSQL(ctx, quotedAs)\n : getSqlText(makeSQL(u.a, { values }));\n sql.push(`${u.k} (${itemSql})`);\n }\n } else {\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 || query.scopes) {\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 : maybeSelectedColumnToSql(ctx, table.q, 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\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 { PickQueryQ, Query } from '../query/query';\nimport { QueryLogger, QueryLogObject } from '../queryMethods';\nimport { Adapter, QueryResult } from '../adapter';\nimport { toSQLCacheKey } from './toSQL';\nimport {\n HavingItem,\n JoinItem,\n OnConflictTarget,\n OnConflictSet,\n OrderItem,\n QuerySourceItem,\n SelectItem,\n UnionItem,\n WhereItem,\n WindowItem,\n WithItem,\n OnConflictMerge,\n} from './types';\nimport { SelectableOrExpression } from '../common/utils';\nimport {\n ColumnsShapeBase,\n MaybeArray,\n Sql,\n getValueKey,\n ColumnsParsers,\n Expression,\n QueryColumn,\n RecordString,\n RecordUnknown,\n QueryReturnType,\n PickQueryTable,\n ExpressionChain,\n QueryDataTransform,\n} from 'orchid-core';\nimport { RelationQuery } from '../relations';\n\nexport interface RecordOfColumnsShapeBase {\n [K: string]: ColumnsShapeBase;\n}\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = RecordOfColumnsShapeBase;\n\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport interface JoinedParsers {\n [K: string]: ColumnsParsers;\n}\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 = RecordString;\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 interface QueryScopes {\n [K: string]: QueryScopeData;\n}\n\n// Query data stored for a specific scope to be applied to the query.\nexport interface QueryScopeData {\n and?: WhereItem[];\n or?: WhereItem[][];\n}\n\nexport type QueryDataFromItem = string | Query | Expression;\n\nexport interface QueryDataJoinTo extends PickQueryTable, PickQueryQ {}\n\nexport interface 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?: RecordOfColumnsShapeBase;\n joinTo?: QueryDataJoinTo;\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?: MaybeArray<QueryDataFromItem>;\n sources?: { [K: string]: QuerySourceItem };\n and?: WhereItem[];\n or?: WhereItem[][];\n coalesceValue?: unknown | Expression;\n parsers?: ColumnsParsers;\n notFoundDefault?: unknown;\n defaults?: RecordUnknown;\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?: QueryDataTransform[];\n // default language for the full text search\n language?: string;\n // Is set for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `subQuery` is true,\n // the join will be applied after callback is resolved.\n // 1 for the same query, 2 for relation queries returned from the callback.\n subQuery?: number;\n // Chained relations, such as `db.user.messages.chat` are stored into array.\n relChain?: (Query | RelationQuery)[];\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?: RecordUnknown;\n // Track the applied scopes, this is used when removing the scope from the query.\n scopes?: { [K: string]: QueryScopeData };\n // to allow updating or deleting all records\n all?: true;\n\n chain?: ExpressionChain;\n}\n\nexport interface SelectQueryData extends CommonQueryData {\n type: undefined;\n distinct?: SelectableOrExpression[];\n only?: boolean;\n join?: JoinItem[];\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: { b: Query; u: UnionItem[] };\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]?: QueryColumn;\n}\n\nexport type CreateKind = 'object' | 'raw' | 'from';\n\nexport interface InsertQueryData extends 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 target?: OnConflictTarget;\n set?: OnConflictSet;\n merge?: OnConflictMerge;\n };\n}\n\nexport interface UpdateQueryDataObject {\n [K: string]: 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 interface UpdateQueryData extends CommonQueryData {\n type: 'update';\n updateData: UpdateQueryDataItem[];\n}\n\nexport interface DeleteQueryData extends CommonQueryData {\n type: 'delete';\n join?: JoinItem[];\n}\n\nexport interface TruncateQueryData extends CommonQueryData {\n type: 'truncate';\n restartIdentity?: boolean;\n cascade?: boolean;\n}\n\nexport interface ColumnInfoQueryData extends CommonQueryData {\n type: 'columnInfo';\n column?: string;\n}\n\nexport interface CopyQueryData extends 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 interface PickQueryDataShapeAndJoinedShapes {\n shape: ColumnsShapeBase;\n joinedShapes?: JoinedShapes;\n}\n\nexport const cloneQuery = (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 if (q.scopes) q.scopes = { ...q.scopes };\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 = { b: q.union.b, u: q.union.u.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 { cloneQuery, QueryData, toSQLCacheKey, ToSQLQuery } from '../sql';\nimport type { Query } from '../query/query';\nimport type { QueryColumn } from 'orchid-core';\nimport { RelationQuery } from '../relations';\nimport { Expression, PickQueryMeta } from 'orchid-core';\nimport { PickQueryMetaTable } from '../query/query';\n\nexport type AliasOrTable<T extends PickQueryMetaTable> =\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 PickQueryMeta = PickQueryMeta,\n C extends QueryColumn = QueryColumn,\n> = '*' | keyof T['meta']['selectable'] | Expression<C>;\n\nexport type SelectableOrExpressions<\n T extends PickQueryMeta = PickQueryMeta,\n C extends QueryColumn = QueryColumn,\n> = ('*' | keyof T['meta']['selectable'] | Expression<C>)[];\n\nexport type ExpressionOutput<\n T extends PickQueryMeta,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['meta']['selectable']\n ? T['meta']['selectable'][Expr]['column']\n : Expr extends Expression\n ? Expr['result']['value']\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 cloneQuery(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: ToSQLQuery,\n cb: (q: ToSQLQuery) => ToSQLQuery,\n): ToSQLQuery => {\n const { subQuery, relChain } = q.q;\n q.q.subQuery = 1;\n q.q.relChain = undefined;\n const result = cb(q);\n q.q.subQuery = subQuery;\n q.q.relChain = relChain;\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: ToSQLQuery, sub: ToSQLQuery): Query => {\n if (!('relationConfig' in sub)) return sub as Query;\n\n return (sub as unknown as RelationQuery).relationConfig.joinQuery(\n sub as unknown as Query,\n q as Query,\n );\n};\n","import {\n Code,\n ColumnDataBase,\n ColumnSchemaConfig,\n ColumnTypeBase,\n setColumnData,\n singleQuote,\n} from 'orchid-core';\nimport { ColumnType } from './columnType';\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<\n Schema extends ColumnSchemaConfig,\n> extends ColumnType<\n Schema,\n unknown,\n ReturnType<Schema['unknown']>,\n typeof Operators.any\n> {\n operators = Operators.any;\n\n constructor(schema: Schema, public dataType: string) {\n super(\n schema,\n schema.unknown() as never,\n schema.unknown() as never,\n schema.unknown() as never,\n );\n this.data.isOfCustomType = true;\n }\n\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `type(${singleQuote(this.dataType)})`, m);\n }\n\n as<\n T extends { inputType: unknown; outputType: unknown; data: ColumnDataBase },\n // Omit is optimal\n C extends Omit<ColumnTypeBase, 'inputType' | 'outputType'> & {\n inputType: T['inputType'];\n outputType: T['outputType'];\n },\n >(this: T, column: C): C {\n const c = setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as C;\n\n c.inputSchema = column.inputSchema;\n c.outputSchema = column.outputSchema;\n c.querySchema = column.querySchema;\n\n return c;\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn<\n Schema extends ColumnSchemaConfig,\n> extends CustomTypeColumn<Schema> {\n toCode(t: string, m?: boolean): Code {\n return columnCode(this, t, `domain(${singleQuote(this.dataType)})`, m);\n }\n}\n","import { IdentityColumn, IntegerColumn } from './number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n XMLColumn,\n} from './string';\nimport { IntervalColumn, TimeColumn } from './dateTime';\nimport { BooleanColumn } from './boolean';\nimport { JSONTextColumn } from './json';\nimport {\n ColumnSchemaConfig,\n makeTimestampsHelpers,\n QueryColumnsInit,\n setCurrentColumnName,\n setDefaultLanguage,\n setDefaultNowFn,\n TimestampHelpers,\n} from 'orchid-core';\nimport { makeRegexToFindInSql } from '../common/utils';\nimport { CustomTypeColumn, DomainColumn } from './customType';\nimport { RawSQL, sqlFn, SqlFn } from '../sql/rawSql';\nimport { TableData } from '../tableData';\n\nexport const getColumnTypes = <ColumnTypes, Shape extends QueryColumnsInit>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n): Shape => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n return fn(types);\n};\n\nexport interface DefaultColumnTypes<SchemaConfig extends ColumnSchemaConfig>\n extends TimestampHelpers {\n schema: SchemaConfig;\n enum: SchemaConfig['enum'];\n array: SchemaConfig['array'];\n\n name<T>(this: T, name: string): T;\n\n sql: SqlFn;\n\n smallint: SchemaConfig['smallint'];\n integer: SchemaConfig['integer'];\n bigint: SchemaConfig['bigint'];\n numeric: SchemaConfig['decimal'];\n decimal: SchemaConfig['decimal'];\n real: SchemaConfig['real'];\n doublePrecision: SchemaConfig['doublePrecision'];\n identity(\n options?: TableData.Identity,\n ): IdentityColumn<ReturnType<SchemaConfig['integer']>>;\n smallSerial: SchemaConfig['smallSerial'];\n serial: SchemaConfig['serial'];\n bigSerial: SchemaConfig['bigSerial'];\n money: SchemaConfig['money'];\n varchar: SchemaConfig['varchar'];\n text: SchemaConfig['text'];\n // `varchar` column with optional limit defaulting to 255.\n string: SchemaConfig['string'];\n citext: SchemaConfig['citext'];\n bytea(): ByteaColumn<SchemaConfig>;\n date: SchemaConfig['date'];\n timestampNoTZ: SchemaConfig['timestampNoTZ'];\n timestamp: SchemaConfig['timestamp'];\n time(precision?: number): TimeColumn<SchemaConfig>;\n interval(fields?: string, precision?: number): IntervalColumn<SchemaConfig>;\n boolean(): BooleanColumn<SchemaConfig>;\n point(): PointColumn<SchemaConfig>;\n line(): LineColumn<SchemaConfig>;\n lseg(): LsegColumn<SchemaConfig>;\n box(): BoxColumn<SchemaConfig>;\n path(): PathColumn<SchemaConfig>;\n polygon(): PolygonColumn<SchemaConfig>;\n circle(): CircleColumn<SchemaConfig>;\n cidr(): CidrColumn<SchemaConfig>;\n inet(): InetColumn<SchemaConfig>;\n macaddr(): MacAddrColumn<SchemaConfig>;\n macaddr8(): MacAddr8Column<SchemaConfig>;\n bit(length: number): BitColumn<SchemaConfig>;\n bitVarying(length?: number): BitVaryingColumn<SchemaConfig>;\n tsvector(): TsVectorColumn<SchemaConfig>;\n tsquery(): TsQueryColumn<SchemaConfig>;\n uuid(): UUIDColumn<SchemaConfig>;\n xml(): XMLColumn<SchemaConfig>;\n json: SchemaConfig['json'];\n jsonText(): JSONTextColumn<SchemaConfig>;\n type(dataType: string): CustomTypeColumn<SchemaConfig>;\n domain(dataType: string): DomainColumn<SchemaConfig>;\n}\n\nexport const makeColumnTypes = <SchemaConfig extends ColumnSchemaConfig>(\n schema: SchemaConfig,\n): DefaultColumnTypes<SchemaConfig> => {\n return {\n schema,\n enum: schema.enum,\n array: schema.array,\n\n name(name: string) {\n setCurrentColumnName(name);\n return this;\n },\n\n sql: sqlFn,\n\n smallint: schema.smallint,\n integer: schema.integer,\n bigint: schema.bigint,\n numeric: schema.decimal,\n decimal: schema.decimal,\n real: schema.real,\n doublePrecision: schema.doublePrecision,\n identity(options) {\n return (schema.integer() as IntegerColumn<SchemaConfig>).identity(\n options,\n ) as never;\n },\n smallSerial: schema.smallSerial,\n serial: schema.serial,\n bigSerial: schema.bigSerial,\n money: schema.money,\n varchar: schema.varchar,\n text: schema.text,\n string: schema.string,\n citext: schema.citext,\n bytea() {\n return new ByteaColumn<SchemaConfig>(schema);\n },\n date: schema.date,\n timestampNoTZ: schema.timestampNoTZ,\n timestamp: schema.timestamp,\n time(precision) {\n return new TimeColumn<SchemaConfig>(schema, precision);\n },\n interval(fields, precision) {\n return new IntervalColumn<SchemaConfig>(schema, fields, precision);\n },\n boolean() {\n return new BooleanColumn<SchemaConfig>(schema);\n },\n point() {\n return new PointColumn<SchemaConfig>(schema);\n },\n line() {\n return new LineColumn<SchemaConfig>(schema);\n },\n lseg() {\n return new LsegColumn<SchemaConfig>(schema);\n },\n box() {\n return new BoxColumn<SchemaConfig>(schema);\n },\n path() {\n return new PathColumn<SchemaConfig>(schema);\n },\n polygon() {\n return new PolygonColumn<SchemaConfig>(schema);\n },\n circle() {\n return new CircleColumn<SchemaConfig>(schema);\n },\n cidr() {\n return new CidrColumn<SchemaConfig>(schema);\n },\n inet() {\n return new InetColumn<SchemaConfig>(schema);\n },\n macaddr() {\n return new MacAddrColumn<SchemaConfig>(schema);\n },\n macaddr8() {\n return new MacAddr8Column<SchemaConfig>(schema);\n },\n bit(length) {\n return new BitColumn<SchemaConfig>(schema, length);\n },\n bitVarying(length) {\n return new BitVaryingColumn<SchemaConfig>(schema, length);\n },\n tsvector() {\n return new TsVectorColumn<SchemaConfig>(schema);\n },\n tsquery() {\n return new TsQueryColumn<SchemaConfig>(schema);\n },\n uuid() {\n return new UUIDColumn<SchemaConfig>(schema);\n },\n xml() {\n return new XMLColumn<SchemaConfig>(schema);\n },\n json: schema.json,\n jsonText() {\n return new JSONTextColumn<SchemaConfig>(schema);\n },\n type(dataType) {\n return new CustomTypeColumn<SchemaConfig>(schema, dataType);\n },\n domain(dataType) {\n return new DomainColumn<SchemaConfig>(schema, dataType);\n },\n\n ...makeTimestampsHelpers(makeRegexToFindInSql),\n };\n};\n\nRawSQL.prototype.columnTypes = makeColumnTypes;\n","import { ColumnType } from './columnType';\nimport { CreateCtx, CreateSelf, UpdateCtx, UpdateSelf } from '../queryMethods';\nimport { Operators, OperatorsAny } from './operators';\nimport { ColumnSchemaConfig, RecordUnknown } from 'orchid-core';\n\nexport abstract class VirtualColumn<\n Schema extends ColumnSchemaConfig,\n InputSchema extends Schema['type'] = ReturnType<Schema['never']>,\n> extends ColumnType<Schema, unknown, InputSchema, OperatorsAny> {\n dataType = '';\n operators = Operators.any;\n\n constructor(\n schema: Schema,\n inputSchema: InputSchema = schema.never() as InputSchema,\n ) {\n super(schema, inputSchema);\n }\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: CreateSelf,\n ctx: CreateCtx,\n item: RecordUnknown,\n rowIndex: number,\n ): void;\n\n update?(q: UpdateSelf, ctx: UpdateCtx, set: RecordUnknown): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { ColumnSchemaConfig } from 'orchid-core';\nimport { RawSQL } from '../sql/rawSql';\nimport { defaultSchemaConfig } from './defaultSchemaConfig';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn<\n Schema extends ColumnSchemaConfig,\n> extends VirtualColumn<Schema> {\n constructor(schema: Schema) {\n super(schema, schema.unknown() as never);\n }\n}\n\nRawSQL.prototype.result = { value: new UnknownColumn(defaultSchemaConfig) };\n","import { ColumnSchemaConfig, ColumnTypeBase } from 'orchid-core';\nimport { makeColumnTypes } from './columnTypes';\nimport { ColumnType } from './columnType';\n\nexport interface ColumnsByType {\n [K: string]: () => ColumnTypeBase;\n}\n\nexport const makeColumnsByType = (schema: ColumnSchemaConfig) => {\n const t = makeColumnTypes(schema);\n\n // not implementing char, character, bpchar\n return {\n bool: t.boolean,\n boolean: t.boolean,\n bytea: t.bytea,\n int8: t.bigint,\n bigint: t.bigint,\n int2: t.smallint,\n smallint: t.smallint,\n int4: t.integer,\n integer: t.integer,\n text: t.text,\n json: t.jsonText,\n xml: t.xml,\n point: t.point,\n lseg: t.lseg,\n path: t.path,\n box: t.box,\n polygon: t.polygon,\n line: t.line,\n cidr: t.cidr,\n float4: t.real,\n real: t.real,\n float8: t.doublePrecision,\n 'double precision': t.doublePrecision,\n circle: t.circle,\n macaddr8: t.macaddr8,\n money: t.money,\n macaddr: t.macaddr,\n inet: t.inet,\n varchar: t.varchar as () => ColumnTypeBase,\n 'character varying': t.varchar as () => ColumnTypeBase,\n date: t.date,\n time: t.time,\n 'time without time zone': t.time,\n timestamp: t.timestampNoTZ,\n 'timestamp without time zone': t.timestampNoTZ,\n timestamptz: t.timestamp,\n 'timestamp with time zone': t.timestamp,\n interval: t.interval,\n bit() {\n return t.bit(Infinity);\n },\n varbit: t.bitVarying,\n 'bit varying': t.bitVarying,\n numeric: t.decimal,\n decimal: t.decimal,\n uuid: t.uuid,\n tsvector: t.tsvector,\n tsquery: t.tsquery,\n jsonb: schema.json as () => ColumnType,\n smallserial: t.smallSerial,\n serial: t.serial,\n bigserial: t.bigSerial,\n } as ColumnsByType;\n};\n","import pg, { Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n emptyObject,\n FnUnknownToUnknown,\n QueryInput,\n QueryResultRow,\n setAdapterConnectRetry,\n SingleSqlItem,\n Sql,\n} from 'orchid-core';\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface 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 interface 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: FnUnknownToUnknown = (arg) => arg;\n\nconst rollbackSql = { text: 'ROLLBACK' };\nconst commitSql: SingleSqlItem = { text: 'COMMIT' };\n\nexport interface AdapterConfig\n extends AdapterConfigBase,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n schema?: string;\n databaseURL?: string;\n}\n\nexport interface AdapterOptions extends 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 if (config.connectRetry) {\n setAdapterConnectRetry(\n this,\n () => this.pool.connect(),\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n }\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n query: QueryInput,\n types?: TypeParsers,\n ): Promise<QueryResult<T>> {\n return performQuery(this, query, types) as never;\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(this, query, types, 'array') as never;\n }\n\n async transaction<Result>(\n begin: SingleSqlItem,\n cb: (adapter: TransactionAdapter) => Promise<Result>,\n end: SingleSqlItem = commitSql,\n ): Promise<Result> {\n const client = await this.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, rollbackSql, this.types);\n throw err;\n }\n await performQueryOnClient(client, end, 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\ninterface ConnectionSchema {\n connection: { schema?: string };\n}\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 adapter: Adapter,\n query: QueryInput,\n types?: TypeParsers,\n rowMode?: 'array',\n) => {\n const client = await adapter.connect();\n try {\n await setSearchPath(client, adapter.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 schema?: string;\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 this.schema = adapter.schema;\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\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 {\n PickQueryMetaResultRelationsWindows,\n Query,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport {\n addValue,\n ColumnTypeBase,\n emptyObject,\n Expression,\n ExpressionTypeMethod,\n getValueKey,\n PickQueryMeta,\n PickQueryMetaResultWindows,\n QueryColumn,\n setParserToQuery,\n toArray,\n} from 'orchid-core';\nimport { SelectableOrExpression } from './utils';\nimport {\n OrderItem,\n QueryData,\n SelectQueryData,\n ToSQLCtx,\n WhereItem,\n} from '../sql';\nimport { columnToSql, rawOrColumnToSql } from '../sql/common';\nimport { pushOrderBySql } from '../sql/orderBy';\nimport { whereToSql } from '../sql/where';\nimport { windowToSql } from '../sql/window';\nimport {\n OrderArg,\n OrderArgs,\n WhereArg,\n WhereArgs,\n WindowArgDeclaration,\n} from '../queryMethods';\nimport { extendQuery } from '../query/queryUtils';\n\n// Additional SQL options that can be accepted by any aggregate function.\nexport interface AggregateOptions<\n T extends PickQueryMetaResultRelationsWindows,\n> {\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> | OrderArgs<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?: WhereArgs<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 PickQueryMetaResultWindows> =\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 PickQueryMeta> = (\n | SelectableOrExpression<Q>\n | FnExpressionArgsPairs<Q>\n | FnExpressionArgsValue\n)[];\n\nexport interface FnExpressionArgsPairs<Q extends PickQueryMeta> {\n pairs: { [K: string]: SelectableOrExpression<Q> };\n}\n\nexport interface FnExpressionArgsValue {\n value: unknown;\n}\n\n// Expression for SQL function calls.\nexport class FnExpression<\n Q extends Query = Query,\n T extends QueryColumn = QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: QueryData;\n\n /**\n * @param query - query object.\n * @param fn - SQL function name.\n * @param args - arguments of the function.\n * @param options - aggregate options.\n * @param value - column type of the function result.\n */\n constructor(\n public query: Q,\n public fn: string,\n public args: FnExpressionArgs<Q>,\n public options: AggregateOptions<Q> = emptyObject,\n value: T,\n ) {\n super();\n this.result = { value };\n (this.q = query.q).expr = this;\n Object.assign(query, value.operators);\n\n // Throw happens only on `undefined`, which is not the case for `sum` and other functions that can return `null`.\n query.q.returnType = 'valueOrThrow';\n (query.q as SelectQueryData).returnsOne = true;\n (query.q as SelectQueryData)[getValueKey] = value;\n query.q.select = [this];\n\n const { parseFn } = value as never as ColumnTypeBase;\n if (parseFn) {\n setParserToQuery(query.q, getValueKey, parseFn);\n }\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, this.q.shape, arg, quotedAs, true);\n } else if (arg instanceof Expression) {\n return arg.toSQL(ctx, quotedAs);\n } else if ('pairs' in (arg as FnExpressionArgsPairs<Query>)) {\n const args: string[] = [];\n const { pairs } = arg as FnExpressionArgsPairs<Query>;\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,\n pairs[key as keyof typeof pairs] as never,\n quotedAs,\n )}`,\n );\n }\n return args.join(', ');\n } else {\n return addValue(values, (arg as FnExpressionArgsValue).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,\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.query,\n {\n and: options.filter ? ([options.filter] as WhereItem[]) : undefined,\n or: options.filterOr?.map((item) => [item]) as WhereItem[][],\n shape: this.q.shape,\n joinedShapes: this.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, options.over as string, quotedAs)}`,\n );\n }\n\n return sql.join('');\n }\n}\n\n// Applies a function expression to the query.\nexport function makeFnExpression<\n T extends PickQueryMetaResultRelationsWindows,\n C extends QueryColumn,\n>(\n self: T,\n type: C,\n fn: string,\n args: FnExpressionArgs<Query>,\n options?: AggregateOptions<T>,\n): SetQueryReturnsColumnOrThrow<T, C> & C['operators'] {\n const q = extendQuery(self as unknown as Query, type.operators);\n (q.baseQuery as unknown as ExpressionTypeMethod).type =\n ExpressionTypeMethod.prototype.type;\n\n new FnExpression<Query, QueryColumn>(\n q,\n fn,\n args,\n options as AggregateOptions<Query> | undefined,\n type,\n );\n\n return q as never;\n}\n","import {\n PickQueryMetaResultRelationsWindows,\n PickQueryQ,\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { ExpressionOutput, SelectableOrExpression } from '../common/utils';\nimport {\n emptyArray,\n emptyObject,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../common/fn';\nimport {\n OperatorsAny,\n OperatorsArray,\n OperatorsBoolean,\n OperatorsNumber,\n OperatorsText,\n} from '../columns/operators';\nimport { RawSQL } from '../sql/rawSql';\nimport { IntegerColumn, RealColumn } from '../columns';\nimport { defaultSchemaConfig } from '../columns/defaultSchemaConfig';\nimport { _queryGetOptional, QueryGetSelf } from './get.utils';\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: PickQueryQ) => {\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(defaultSchemaConfig);\nint.parseItem = int.parseFn = (input): number => parseInt(input as never);\n\n// Parse nullable string to int, the nullable string may happen because of `bigint` db type.\nconst nullableInt = new IntegerColumn(defaultSchemaConfig);\nnullableInt.parseItem = nullableInt.parseFn = (input): number =>\n (input === null ? null : parseInt(input as never)) as number;\n\n// double-precision is represented by string in JS, parse it to float.\nconst nullableFloat = new RealColumn(defaultSchemaConfig);\nnullableFloat.parseItem = nullableFloat.parseFn = (input): number =>\n (input === null ? null : parseFloat(input as never)) as number;\n\ntype QueryReturnsAgg<T, C, Op> = SetQueryReturnsColumnOrThrow<\n T,\n QueryColumn<C, Op>\n> &\n Op;\n\ntype CountReturn<T> = QueryReturnsAgg<T, number, OperatorsNumber> & {\n isCount: true;\n};\n\ntype NumberColumn = QueryColumn<number, OperatorsNumber>;\n\ntype NumberNullable = QueryColumn<number | null, OperatorsNumber>;\n\ntype NullableNumberReturn<T> = SetQueryReturnsColumnOrThrow<T, NumberNullable> &\n OperatorsNumber;\n\nexport type BooleanQueryColumn = QueryColumn<boolean, OperatorsBoolean>;\n\ntype BooleanNullable = QueryColumn<boolean | null, OperatorsBoolean>;\n\ntype NullableBooleanReturn<T> = SetQueryReturnsColumnOrThrow<\n T,\n BooleanNullable\n> &\n OperatorsBoolean;\n\ntype NullableJSONAggReturn<\n T extends PickQueryMeta,\n Arg extends SelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type: (ExpressionOutput<T, Arg>['type'] | null)[] | null;\n outputType: (ExpressionOutput<T, Arg>['outputType'] | null)[] | null;\n queryType: (ExpressionOutput<T, Arg>['queryType'] | null)[] | null;\n operators: OperatorsArray;\n }\n> &\n OperatorsArray;\n\ninterface RecordSelectableOrExpression<T extends PickQueryMeta> {\n [K: string]: SelectableOrExpression<T>;\n}\n\ntype NullableJSONObjectReturn<\n T extends PickQueryMeta,\n Obj extends RecordSelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['type'];\n }\n | null;\n outputType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['outputType'];\n }\n | null;\n queryType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['queryType'];\n }\n | null;\n operators: OperatorsAny;\n }\n> &\n OperatorsAny;\n\ntype StringColumn = QueryColumn<string, OperatorsText>;\n\ntype StringNullable = QueryColumn<string | null, OperatorsText>;\n\ntype NullableStringReturn<T> = SetQueryReturnsColumnOrThrow<T, StringNullable> &\n OperatorsText;\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\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 QueryGetSelf>(\n this: T,\n ): SetQueryReturnsColumnOrThrow<T, BooleanQueryColumn> {\n const q = _queryGetOptional(\n (this as unknown as Query).clone(),\n new RawSQL('true'),\n );\n q.q.notFoundDefault = false;\n q.q.coalesceValue = new RawSQL('false');\n return q as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): CountReturn<T> {\n return makeFnExpression(this, int, 'count', [arg], options) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'min',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'max',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'sum',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'avg',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'bit_and',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, NumberColumn>,\n options?: AggregateOptions<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(\n this,\n nullableFloat,\n 'bit_or',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'bool_and',\n [arg],\n options,\n ) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'bool_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, BooleanQueryColumn>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'every',\n [arg],\n options,\n ) as never;\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<\n T extends PickQueryMetaResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n emptyObject as never,\n 'json_agg',\n [arg],\n options,\n );\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<\n T extends PickQueryMetaResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n emptyObject as never,\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: 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: 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 PickQueryMetaResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n emptyObject as never,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n );\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends PickQueryMetaResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n emptyObject as never,\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n ) as NullableStringReturn<T>;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n emptyObject as QueryColumn,\n 'xmlagg',\n [arg],\n options,\n ) as NullableStringReturn<T>;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'row_number', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'dense_rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableInt, 'percent_rank', emptyArray, {\n over,\n }) as never;\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 PickQueryMetaResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T> {\n return makeFnExpression(this, nullableFloat, 'cume_dist', emptyArray, {\n over,\n }) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { isExpression, RecordUnknown } 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 const q = this.clone();\n clears.forEach((clear) => {\n if (clear === 'where') {\n delete q.q.and;\n delete q.q.or;\n } else if (clear === 'counters') {\n if ('type' in q.q && q.q.type === 'update') {\n q.q.updateData = q.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 RecordUnknown;\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 (q.q as never as RecordUnknown)[clear];\n }\n });\n return q;\n }\n}\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Query,\n QueryOrExpression,\n QueryReturnsAll,\n queryTypeWithLimitOne,\n SetQueryKind,\n SetQueryKindResult,\n SetQueryReturnsAllKind,\n SetQueryReturnsAllKindResult,\n SetQueryReturnsColumnKind,\n SetQueryReturnsColumnKindResult,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsOneKind,\n SetQueryReturnsOneKindResult,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluckColumnKind,\n SetQueryReturnsPluckColumnKindResult,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport { RelationConfigDataForCreate, RelationsBase } from '../relations';\nimport {\n CreateKind,\n InsertQueryData,\n OnConflictMerge,\n ToSQLQuery,\n} from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape } from '../query/db';\nimport {\n Expression,\n ColumnSchemaConfig,\n RecordUnknown,\n PickQueryUniqueProperties,\n QueryColumn,\n FnUnknownToUnknown,\n isExpression,\n} from 'orchid-core';\nimport { isSelectingCount } from './aggregate';\nimport { resolveSubQueryCallback } from '../common/utils';\n\nexport interface CreateSelf\n extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryUniqueProperties {\n inputType: RecordUnknown;\n}\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 CreateSelf,\n BelongsToData = CreateBelongsToData<T>,\n> = RelationsBase extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaults<T, keyof T['meta']['defaults']>\n : CreateRelationsData<T, BelongsToData>;\n\ntype CreateDataWithDefaults<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults]?: K extends keyof T['inputType'] ? CreateColumn<T, K> : never;\n};\n\ntype CreateDataWithDefaultsForRelations<\n T extends CreateSelf,\n Defaults extends keyof T['inputType'],\n OmitFKeys extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults | OmitFKeys\n ? never\n : K]: K extends Defaults | OmitFKeys ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults as K extends OmitFKeys ? never : K]?: CreateColumn<T, K>;\n};\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<\n T extends CreateSelf,\n K extends keyof T['inputType'],\n> =\n | T['inputType'][K]\n | QueryOrExpression<T['inputType'][K]>\n | ((q: T) => QueryOrExpression<T['inputType'][K]>);\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<T extends CreateSelf, BelongsToData> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsForRelations<\n T,\n keyof T['meta']['defaults'],\n T['relations'][keyof T['relations']]['relationConfig']['omitForeignKeyInCreate']\n > &\n BelongsToData &\n // Union of the rest relations objects, intersection is not needed here because there are no required properties:\n // { foo: object } | { bar: object }\n T['relations'][keyof T['relations']]['relationConfig']['optionalDataForCreate'];\n\n// Intersection of objects for `belongsTo` relations:\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateBelongsToData<T extends CreateSelf> =\n CreateRelationsDataOmittingFKeys<\n T,\n T['relations'][keyof T['relations']]['relationConfig']['dataForCreate']\n >;\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 CreateSelf,\n // Collect a union of `belongsTo` relation objects.\n Union,\n> =\n // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n (\n Union extends RelationConfigDataForCreate\n ? (\n u: // omit relation columns if they are in defaults, is tested in factory.test.ts\n keyof Union['columns'] extends keyof T['meta']['defaults']\n ? Omit<Union['columns'], keyof T['meta']['defaults']> & {\n [P in keyof T['meta']['defaults'] &\n keyof Union['columns']]?: Union['columns'][P];\n } & Partial<Union['nested']>\n : Union['columns'] | Union['nested'],\n ) => void\n : never\n ) extends // must be handled as a function argument, belongsTo.test relies on this\n (u: infer Obj extends RecordUnknown) => void\n ? Obj\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 CreateSelf, BT> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>;\n\ntype CreateRawOrFromResult<T extends CreateSelf> = T extends { isCount: true }\n ? SetQueryKind<T, 'create'>\n : QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKind<T, 'create'>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKind<T, 'create'>\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<\n T extends CreateSelf,\n BT,\n> = T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryReturnsRowCount<T, 'create'>;\n\ntype InsertRawOrFromResult<T extends CreateSelf> =\n T['meta']['hasSelect'] extends true\n ? QueryReturnsAll<T['returnType']> extends true\n ? SetQueryReturnsOneKind<T, 'create'>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnKind<T, 'create'>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<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 CreateSelf, BT> = T extends { isCount: true }\n ? SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>;\n\ntype CreateManyRawOrFromResult<T extends CreateSelf> = T extends {\n isCount: true;\n}\n ? SetQueryKind<T, 'create'>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKind<T, 'create'>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKind<T, 'create'>\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<\n T extends CreateSelf,\n BT,\n> = T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKindResult<\n T,\n 'create',\n NarrowCreateResult<T, BT>\n >\n : SetQueryKindResult<T, 'create', NarrowCreateResult<T, BT>>\n : SetQueryReturnsRowCount<T, 'create'>;\n\ntype InsertManyRawOrFromResult<T extends CreateSelf> =\n T['meta']['hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllKind<T, 'create'>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnKind<T, 'create'>\n : SetQueryKind<T, 'create'>\n : SetQueryReturnsRowCount<T, 'create'>;\n\n/**\n * When creating a record with a *belongs to* nested record,\n * un-nullify foreign key columns of the result.\n *\n * The same should work as well with any non-null columns passed to `create`, but it's to be implemented later.\n */\ntype NarrowCreateResult<T extends CreateSelf, BT> = [\n T['relations'][keyof T['relations'] &\n keyof BT]['relationConfig']['omitForeignKeyInCreate'],\n] extends [never]\n ? T['result']\n : {\n [K in keyof T['result']]: K extends T['relations'][keyof T['relations'] &\n keyof BT]['relationConfig']['omitForeignKeyInCreate']\n ? QueryColumn<\n Exclude<T['result'][K]['type'], null>,\n T['result'][K]['operators']\n >\n : T['result'][K];\n };\n\n// `onConflictDoNothing()` 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 CreateSelf> = T['returnType'] extends 'oneOrThrow'\n ? SetQueryReturnsOneOptional<T>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturnsColumnOptional<T, T['result']['value']>\n : T;\n\n// `createRaw` method argument.\n// Contains array of columns and a raw SQL for values.\ninterface CreateRawData<T extends CreateSelf> {\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.\ninterface CreateManyRawData<T extends CreateSelf> {\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 CreateSelf> = {\n [K in keyof T['inputType'] as K extends keyof T['meta']['defaults']\n ? never\n : null | 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 CreateSelf,\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 keyof RawRequiredColumns<T> & string,\n Arg['columns'][number]\n >}`,\n ];\n\n// Argument of `onConflict`, can be:\n// - a unique column name\n// - an array of unique column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends PickQueryUniqueProperties> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples']\n | Expression\n | { constraint: T['internal']['uniqueConstraints'] };\n\nexport type AddQueryDefaults<T extends CreateSelf, Defaults> = {\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 interface CreateCtx {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: RecordUnknown[];\n}\n\n// Type of `encodeFn` of columns.\ninterface RecordEncoder {\n [K: string]: FnUnknownToUnknown;\n}\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: CreateSelf,\n item: RecordUnknown,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: RecordEncoder,\n) => {\n const { shape } = (q as Query).q;\n for (const key in item) {\n if (shape[key] instanceof VirtualColumn) {\n (shape[key] as VirtualColumn<ColumnSchemaConfig>).create?.(\n q,\n ctx,\n item,\n rowIndex,\n );\n } else {\n if (typeof item[key] === 'function') {\n item[key] = resolveSubQueryCallback(\n q as unknown as ToSQLQuery,\n item[key] as (q: ToSQLQuery) => ToSQLQuery,\n );\n }\n\n 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 FnUnknownToUnknown;\n }\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 RecordUnknown[],\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: RecordEncoder,\n data: RecordUnknown,\n): unknown[] => {\n return columns.map((key) =>\n encoders[key] && !isExpression(data[key])\n ? encoders[key](data[key])\n : 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: CreateSelf,\n data: RecordUnknown,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).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: CreateSelf,\n data: RecordUnknown[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).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: CreateSelf,\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 unknown as { q: InsertQueryData };\n\n delete q.and;\n delete q.or;\n delete q.scopes;\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: CreateSelf,\n obj?: { columns: string[] },\n many?: boolean,\n) => {\n if (!many && !queryTypeWithLimitOne[(from as Query).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 as Query).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 CreateSelf,\n Q extends Query,\n Many extends boolean,\n>(\n q: T,\n from: Q,\n many: Many,\n data?: Omit<CreateData<T, never>, 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\nexport const _queryCreate = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>,\n): CreateResult<T, BT> => {\n createSelect(q as unknown as Query);\n return _queryInsert(q, data) as never;\n};\n\nexport const _queryInsert = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>,\n): InsertResult<T, BT> => {\n const ctx = createCtx();\n const obj = handleOneData(q, data, ctx) as {\n columns: string[];\n values: InsertQueryData['values'];\n };\n\n const values = ((q as unknown as Query).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(q, obj, 'object') as never;\n};\n\nexport const _queryCreateMany = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>[],\n): CreateManyResult<T, BT> => {\n createSelect(q as unknown as Query);\n return _queryInsertMany(q, data as never) as never;\n};\n\nexport const _queryInsertMany = <\n T extends CreateSelf,\n BT extends CreateBelongsToData<T>,\n>(\n q: T,\n data: CreateData<T, BT>[],\n): InsertManyResult<T, BT> => {\n const ctx = createCtx();\n let result = insert(\n q,\n handleManyData(q, data, ctx),\n 'object',\n true,\n ) as InsertManyResult<T, BT>;\n if (!data.length)\n result = (result as Query).none() as InsertManyResult<T, BT>;\n return result;\n};\n\nexport const _queryCreateRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateRawData<T>>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as never;\n};\n\nexport const _queryInsertRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateRawData<T>>,\n): InsertRawOrFromResult<T> => {\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression },\n 'raw',\n ) as never;\n};\n\nexport const _queryCreateManyRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateManyRawData<T>>,\n): CreateManyRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return _queryInsertManyRaw(q, args as never) as never;\n};\n\nexport const _queryInsertManyRaw = <T extends CreateSelf>(\n q: T,\n args: CreateRawArgs<T, CreateManyRawData<T>>,\n): InsertManyRawOrFromResult<T> => {\n return insert(\n q,\n args[0] as { columns: string[]; values: Expression[] },\n 'raw',\n true,\n ) as never;\n};\n\nexport const _queryCreateFrom = <\n T extends CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFromQuery(q, query, false, data as never) as never;\n};\n\nexport const _queryInsertFrom = <\n T extends CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n): InsertRawOrFromResult<T> => {\n return insertFromQuery(q, query, false, data as never) as never;\n};\n\nexport const _queryCreateManyFrom = <T extends CreateSelf>(\n q: T,\n query: Query,\n): CreateManyRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFromQuery(q, query, true) as never;\n};\n\nexport const _queryInsertManyFrom = <T extends CreateSelf>(\n q: T,\n query: Query,\n): InsertManyRawOrFromResult<T> => {\n return insertFromQuery(q, query, true) as never;\n};\n\nexport const _queryDefaults = <\n T extends CreateSelf,\n Data extends Partial<CreateData<T, CreateBelongsToData<T>>>,\n>(\n q: T,\n data: Data,\n): AddQueryDefaults<T, { [K in keyof Data]: true }> => {\n (q as unknown as Query).q.defaults = data;\n return q as never;\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 | 'insert'\n | 'createMany'\n | 'insertMany'\n | 'createRaw'\n | 'insertRaw'\n | 'createFrom'\n | 'insertFrom'\n | 'createManyFrom'\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 `.onConflictDoNothing()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflictDoNothing();\n *\n * await db.table.create({\n * // raw SQL\n * column1: (q) => q.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 * `create` and `insert` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // create a record in one table\n * .with('a', db.table.select('id').create(data))\n * // create a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').create({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n create<T extends CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>,\n ): CreateResult<T, BT> {\n return _queryCreate((this as unknown as Query).clone(), data) as never;\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 CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>,\n ): InsertResult<T, BT> {\n return _queryInsert((this as unknown as Query).clone(), data) as never;\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 * Because of a limitation of Postgres protocol, queries having more than **65535** of values are going to fail in runtime.\n * To solve this seamlessly, OrchidORM will automatically batch such queries, and wrap them into a transaction, unless they are already in a transaction.\n *\n * ```ts\n * // OK: executes 2 inserts wrapped into a transaction\n * await db.table.createMany(\n * Array.from({ length: 65536 }, () => ({ text: 'text' })),\n * );\n * ```\n *\n * However, this only works in the case shown above. This **won't** work if you're using the `createMany` in `with` statement,\n * or if the insert is used as a sub-query in other query part.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>[],\n ): CreateManyResult<T, BT> {\n return _queryCreateMany((this as unknown as Query).clone(), data) as never;\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 CreateSelf, BT extends CreateBelongsToData<T>>(\n this: T,\n data: CreateData<T, BT>[],\n ): InsertManyResult<T, BT> {\n return _queryInsertMany((this as unknown as Query).clone(), data) as never;\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: sql`'name', random()`,\n * });\n * ```\n *\n * @param args - object with columns list and raw SQL for values\n */\n createRaw<T extends CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateRawData<T>>\n ): CreateRawOrFromResult<T> {\n return _queryCreateRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateRawData<T>>\n ): InsertRawOrFromResult<T> {\n return _queryInsertRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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: [sql`'one', 2`, 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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateManyRawData<T>>\n ): CreateManyRawOrFromResult<T> {\n return _queryCreateManyRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf>(\n this: T,\n ...args: CreateRawArgs<T, CreateManyRawData<T>>\n ): InsertManyRawOrFromResult<T> {\n return _queryInsertManyRaw(\n (this as unknown as Query).clone() as unknown as T,\n args,\n );\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 CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n ): CreateRawOrFromResult<T> {\n return _queryCreateFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n data,\n );\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 CreateSelf,\n Q extends Query & { returnType: 'one' | 'oneOrThrow' },\n >(\n this: T,\n query: Q,\n data?: Omit<CreateData<T, CreateBelongsToData<T>>, keyof Q['result']>,\n ): InsertRawOrFromResult<T> {\n return _queryInsertFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n data,\n );\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 CreateSelf>(\n this: T,\n query: Query,\n ): CreateManyRawOrFromResult<T> {\n return _queryCreateManyFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n );\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 CreateSelf>(\n this: T,\n query: Query,\n ): InsertManyRawOrFromResult<T> {\n return _queryInsertManyFrom(\n (this as unknown as Query).clone() as unknown as T,\n query,\n );\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 {@link create} and {@link 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<\n T extends CreateSelf,\n Data extends Partial<CreateData<T, CreateBelongsToData<T>>>,\n >(this: T, data: Data): AddQueryDefaults<T, { [K in keyof Data]: true }> {\n return _queryDefaults(\n (this as unknown as Query).clone() as unknown as T,\n data,\n );\n }\n\n /**\n * By default, violating unique constraint will cause the creative query to throw,\n * you can define what to do on a conflict: to ignore it, or to merge the existing record with a new data.\n *\n * A conflict occurs when a table has a primary key or a unique index on a column,\n * or a composite primary key unique index on a set of columns,\n * and a row being created has the same value as a row that already exists in the table in this column(s).\n *\n * Use {@link onConflictDoNothing} to suppress the error and continue without updating the record,\n * or the `merge` to update the record with new values automatically,\n * or the `set` to specify own values for the update.\n *\n * `onConflict` only accepts column names that are defined in `primaryKey` or `unique` in the table definition.\n * To specify a constraint, its name also must be explicitly set in `primaryKey` or `unique` in the table code.\n *\n * Postgres has a limitation that a single `INSERT` query can have only a single `ON CONFLICT` clause that can target only a single unique constraint\n * for updating the record.\n *\n * If your table has multiple potential reasons for unique constraint violation, such as username and email columns in a user table,\n * consider using `upsert` instead.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflictDoNothing();\n *\n * // single column:\n * // (this requires a composite primary key or unique index, see below)\n * db.table.create(data).onConflict('email').merge();\n *\n * // array of columns:\n * db.table.create(data).onConflict(['email', 'name']).merge();\n *\n * // constraint name\n * db.table.create(data).onConflict({ constraint: 'unique_index_name' }).merge();\n *\n * // raw SQL expression:\n * db.table\n * .create(data)\n * .onConflict(sql`(email) where condition`)\n * .merge();\n * ```\n *\n * :::info\n * A primary key or a unique index for a **single** column can be fined on a column:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns((t) => ({\n * pkey: t.uuid().primaryKey(),\n * unique: t.string().unique(),\n * }));\n * }\n * ```\n *\n * But for composite primary keys or indexes (having multiple columns), define it in a separate function:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns(\n * (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * three: t.boolean(),\n * }),\n * (t) => [t.primaryKey(['one', 'two']), t.unique(['two', 'three'])],\n * );\n * }\n * ```\n * :::\n *\n * You can use the `sql` function exported from your `BaseTable` file 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(sql`(email) where active`)\n * .ignore();\n * ```\n *\n * For `merge` and `set`, you can append `where` to update data only for the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as Arg);\n }\n\n /**\n * Use `onConflictDoNothing` to suppress unique constraint violation error when creating a record.\n *\n * Adds `ON CONFLICT (columns) DO NOTHING` clause to the insert statement, columns are optional.\n *\n * Can also accept a constraint name.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * // on any conflict:\n * .onConflictDoNothing()\n * // or, for a specific column:\n * .onConflictDoNothing('email')\n * // or, for a specific constraint:\n * .onConflictDoNothing({ constraint: 'unique_index_name' });\n * ```\n *\n * When there is a conflict, nothing can be returned from the database, so `onConflictDoNothing` adds `| undefined` part to the response type.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflictDoNothing();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflictDoNothing();\n * ```\n *\n * When creating multiple records, only 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]).onConflictDoNothing();\n * ```\n */\n onConflictDoNothing<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): IgnoreResult<T> {\n const q = (this as unknown as Query).clone();\n (q.q as InsertQueryData).onConflict = {\n target: arg as never,\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 never;\n }\n}\n\nexport class OnConflictQueryBuilder<\n T extends CreateSelf,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(private query: T, private onConflict: Arg) {}\n\n /**\n * Available only after `onConflict`.\n *\n * Updates the record with a given data when conflict occurs.\n *\n * ```ts\n * db.table.create(data).onConflict('column').set({\n * description: 'setting different data on conflict',\n * });\n * ```\n *\n * The `set` can take a raw SQL expression:\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict()\n * .set(sql`raw SQL expression`);\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({ key: 'value' })\n * .where({ ...certainConditions });\n * ```\n *\n * @param set - object containing new column values, or raw SQL\n */\n set(set: Partial<T['inputType']> | Expression): T {\n ((this.query as unknown as Query).q as InsertQueryData).onConflict = {\n target: this.onConflict as never,\n set,\n };\n return this.query;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Use this method to merge all the data you have passed into `create` to update the existing record on conflict.\n *\n * If the table has columns with **dynamic** default values, such values will be applied as well.\n *\n * You can exclude certain columns from being merged by passing the `exclude` option.\n *\n * ```ts\n * // merge the full data\n * db.table.create(data).onConflict('email').merge();\n *\n * // merge only a single column\n * db.table.create(data).onConflict('email').merge('name');\n *\n * // merge multiple columns\n * db.table.create(data).onConflict('email').merge(['name', 'quantity']);\n *\n * // merge all columns except some\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge({ except: ['name', 'quantity'] });\n *\n * // merge can be applied also for batch creates\n * db.table.createMany([data1, data2, data2]).onConflict('email').merge();\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge()\n * .where({ ...certainConditions });\n * ```\n *\n * @param merge - no argument will merge all data, or provide a column(s) to merge, or provide `except` to update all except some.\n */\n merge(\n merge?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | { except: keyof T['shape'] | (keyof T['shape'])[] },\n ): T {\n ((this.query as unknown as Query).q as InsertQueryData).onConflict = {\n target: this.onConflict as never,\n merge: merge as OnConflictMerge,\n };\n return this.query;\n }\n}\n","import { Query, SetQueryKind, SetQueryReturnsRowCount } from '../query/query';\nimport { throwIfNoWhere } from '../query/queryUtils';\nimport { EmptyTuple, PickQueryMetaResult } from 'orchid-core';\n\nexport type DeleteMethodsNames = 'delete';\n\nexport type DeleteArgs<T extends PickQueryMetaResult> =\n T['meta']['hasWhere'] extends true ? EmptyTuple : [never];\n\nexport type DeleteResult<T extends PickQueryMetaResult> =\n T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'delete'>\n : SetQueryReturnsRowCount<T, 'delete'>;\n\nexport const _queryDelete = <T extends PickQueryMetaResult>(\n query: T,\n): DeleteResult<T> => {\n const q = (query as unknown as Query).q;\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(query as unknown as Query, 'delete');\n\n q.type = 'delete';\n return query as never;\n};\n\nexport class Delete {\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 * `delete` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // delete a record in one table\n * .with('a', db.table.find(1).select('id').delete())\n * // delete a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').whereIn('aId', q.from('a').pluck('id')).delete(),\n * )\n * .from('b');\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete<T extends PickQueryMetaResult>(\n this: T,\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete((this as unknown as Query).clone()) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { SelectQueryData } from '../sql';\nimport { Expression, IsQuery } from 'orchid-core';\nimport { extendQuery } from '../query/queryUtils';\n\ntype ForQueryBuilder<Q> = Q & {\n noWait<T extends Q>(this: T): T;\n skipLocked<T extends Q>(this: T): T;\n};\n\nconst forMethods = {\n noWait() {\n const q = (this as unknown as Query).clone();\n const data = q.q as SelectQueryData | undefined;\n if (data?.for) data.for.mode = 'NO WAIT';\n return q as never;\n },\n skipLocked() {\n const q = (this as unknown as Query).clone();\n const data = q.q as SelectQueryData | undefined;\n if (data?.for) data.for.mode = 'SKIP LOCKED';\n return q as never;\n },\n};\n\n// Extends the query with `for` methods, the query is cloned, and sets `for` data.\nconst forQueryBuilder = <T>(\n arg: T,\n type: Exclude<SelectQueryData['for'], undefined>['type'],\n tableNames?: string[] | Expression,\n): ForQueryBuilder<T> => {\n const q = extendQuery(arg as Query, forMethods);\n\n (q.q as SelectQueryData).for = {\n type,\n tableNames,\n };\n\n return q as never;\n};\n\nexport class For {\n forUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'UPDATE', tableNames);\n }\n\n forNoKeyUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'NO KEY UPDATE', tableNames);\n }\n\n forShare<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'SHARE', tableNames);\n }\n\n forKeyShare<T extends IsQuery>(\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 {\n GetArg,\n GetResult,\n GetResultOptional,\n _queryGet,\n _queryGetOptional,\n QueryGetSelf,\n} from './get.utils';\n\nexport class QueryGet {\n /**\n * `.get` returns a single value, adds `LIMIT 1` to the query, and accepts a column name or a raw SQL expression.\n *\n * `get` throws a `NotFoundError` when not found, and `getOptional` returns `undefined`.\n *\n * ```ts\n * import { NumberColumn } from 'orchid-orm';\n * import { sql } from './baseTable';\n *\n * const firstName: string = await db.table.get('name');\n *\n * const rawResult: number = await db.table.get(sql((t) => t.integer())`1 + 1`);\n *\n * const firstNameOptional: string | undefined = await db.table.getOptional(\n * 'name',\n * );\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n get<T extends QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return _queryGet((this as unknown as Query).clone(), arg) as never;\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 QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return _queryGetOptional((this as unknown as Query).clone(), arg) as never;\n }\n}\n","import { PickQueryQ, Query } from '../query/query';\nimport { FnUnknownToUnknown, SQLQueryArgs } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\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> = (q: T) => {\n result: { value: { outputType: boolean } };\n};\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 * 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: HavingArgFn<T>[]): T {\n const q = this.clone();\n return pushQueryValue(\n q,\n 'having',\n args.map((arg) => ((arg as FnUnknownToUnknown)(q) as PickQueryQ).q.expr),\n );\n }\n\n /**\n * Provide SQL expression for the `HAVING` SQL statement:\n *\n * ```ts\n * db.table.havingSql`count(*) >= ${10}`;\n * ```\n *\n * @param args - SQL expression\n */\n havingSql<T extends Query>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValue(this.clone(), 'having', args);\n }\n}\n","import { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { PickQueryShape, QueryColumns } from 'orchid-core';\nimport { QueryAfterHook, QueryBeforeHook } from '../sql';\nimport { PickQueryQ, Query } from '../query/query';\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 QueryColumns,\n> = QueryAfterHook<\n {\n [K in keyof Select[number]]: K extends keyof Shape\n ? Shape[K]['outputType']\n : never;\n }[]\n>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelect<T extends PickQueryShape> = (keyof T['shape'] &\n string)[];\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>(q: T, key: HookAction, cb: QueryBeforeHook): T =>\n pushQueryValue(q as PickQueryQ, `before${key}`, cb) as never;\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends PickQueryShape, 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 as never, `after${key}${commit ? 'Commit' : ''}`, cb),\n `after${key}Select`,\n select,\n );\n\nexport const _queryHookBeforeQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return pushQueryValue(q as never, 'before', cb);\n};\n\nexport const _queryHookAfterQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryAfterHook,\n): T => {\n return pushQueryValue(q as never, 'after', cb);\n};\n\nexport const _queryHookBeforeCreate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Create', cb);\n};\n\nexport const _queryHookAfterCreate = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb);\n};\n\nexport const _queryHookAfterCreateCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb, true);\n};\n\nexport const _queryHookBeforeUpdate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Update', cb);\n};\n\nexport const _queryHookAfterUpdate = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb);\n};\n\nexport const _queryHookAfterUpdateCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb, true);\n};\n\nexport const _queryHookBeforeSave = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(before(q, 'Create', cb), 'Update', cb);\n};\n\nexport const _queryHookAfterSave = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(after(q, 'Create', select, cb), 'Update', select, cb);\n};\n\nexport const _queryAfterSaveCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(\n after(q, 'Create', select, cb, true),\n 'Update',\n select,\n cb,\n true,\n );\n};\n\nexport const _queryHookBeforeDelete = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Delete', cb);\n};\n\nexport const _queryHookAfterDelete = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb);\n};\n\nexport const _queryHookAfterDeleteCommit = <\n T extends PickQueryShape,\n S extends HookSelect<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb, true);\n};\n\nexport abstract class QueryHooks {\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeQuery((this as Query).clone(), cb) as T;\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>(this: T, cb: QueryAfterHook): T {\n return _queryHookAfterQuery((this as Query).clone(), cb) as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeCreate((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreate(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreateCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeUpdate((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdate(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdateCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeSave((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterSave(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryAfterSaveCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeDelete((this as Query).clone(), cb) as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDelete(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\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 PickQueryShape, S extends HookSelect<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDeleteCommit(\n (this as unknown as Query).clone(),\n select,\n cb,\n ) as unknown as T;\n }\n}\n","import {\n GetQueryResult,\n PickQueryMetaResultRelationsWithDataReturnType,\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n PickQueryMetaShapeRelationsWithData,\n PickQueryMetaWithData,\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQueryWithData,\n Query,\n SelectableFromShape,\n WithDataItem,\n} from '../../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../../query/queryUtils';\nimport {\n EmptyTuple,\n Expression,\n PickQueryMeta,\n PickQueryMetaResultReturnType,\n PickQueryMetaShape,\n PickQueryTable,\n PickQueryTableMetaResult,\n PickQueryTableMetaResultShape,\n QueryColumns,\n QueryColumnToNullable,\n QueryMetaBase,\n QueryThen,\n SelectableBase,\n} from 'orchid-core';\nimport { _join, _joinLateral } from './_join';\nimport { AliasOrTable } from '../../common/utils';\nimport {\n ColumnsShapeToNullableObject,\n ColumnsShapeToObject,\n} from '../../columns';\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 PickQueryWithData,\n W extends keyof T['withData'],\n> = T['withData'][W] extends WithDataItem\n ?\n | keyof T['withData'][W]['shape']\n | `${T['withData'][W]['table']}.${keyof T['withData'][W]['shape'] &\n string}`\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 PickQueryRelationsWithData> =\n | PickQueryTableMetaResult\n | keyof T['relations']\n | keyof T['withData']\n | ((q: T['relations']) => PickQueryTableMetaResult);\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> =\n | [on?: JoinCallback<T, Arg>]\n | (Arg extends PickQueryTableMetaResult\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 PickQueryTableMetaResult> =\n | keyof Q['result']\n | `${AliasOrTable<Q>}.${keyof Q['result'] & string}`;\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<\n T extends PickQueryMeta,\n Q extends PickQueryTableMetaResult,\n> =\n | [\n conditions:\n | {\n [K in JoinSelectable<Q>]:\n | keyof T['meta']['selectable']\n | Expression;\n }\n | Expression\n | true,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n rightColumn: keyof T['meta']['selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Q> | Expression,\n op: string,\n rightColumn: keyof T['meta']['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<\n T extends PickQueryMetaWithData,\n W extends keyof T['withData'],\n> =\n | [\n conditions:\n | {\n [K in WithSelectable<T, W>]:\n | keyof T['meta']['selectable']\n | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n rightColumn: keyof T['meta']['selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<T, W> | Expression,\n op: string,\n rightColumn: keyof T['meta']['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 PickQueryMetaResultReturnType,\n R extends PickQueryTableMetaResult,\n RequireJoined,\n RequireMain,\n> = RequireMain extends true\n ? JoinAddSelectable<\n T,\n JoinResultSelectable<R['result'], AliasOrTable<R>, RequireJoined>\n >\n : JoinOptionalMain<\n T,\n JoinResultSelectable<R['result'], AliasOrTable<R>, RequireJoined>\n >;\n\n/**\n * Calls {@link JoinResult} with either callback result, if join has a callback,\n * or with a query derived from the first join argument.\n */\ntype JoinResultFromArgs<\n T extends PickQueryMetaResultRelationsWithDataReturnType,\n Arg,\n Args,\n RequireJoined,\n RequireMain,\n> = JoinResult<\n T,\n Args extends GenericJoinCallbackTuple\n ? ReturnType<Args[0]>\n : Arg extends PickQueryTableMetaResultShape\n ? Arg['meta']['hasSelect'] extends true\n ? // If joined query has select, computed values won't be available, use `result` as is\n Arg\n : // If no select, allow using computed values by setting result to shape\n { table: Arg['table']; meta: Arg['meta']; result: Arg['shape'] }\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['query']\n : Arg extends GenericJoinCallback\n ? ReturnType<Arg>\n : Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? {\n table: T['withData'][Arg]['table'];\n meta: QueryMetaBase;\n result: T['withData'][Arg]['shape'];\n }\n : never\n : never,\n RequireJoined,\n RequireMain\n>;\n\ntype GenericJoinCallback = (q: never) => PickQueryTableMetaResult;\ntype GenericJoinCallbackTuple = [GenericJoinCallback];\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 PickQueryMeta,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n RequireJoined,\n> = JoinAddSelectable<\n T,\n JoinResultSelectable<\n Result,\n Meta['as'] extends string ? Meta['as'] : Table,\n RequireJoined\n >\n>;\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 // Interestingly, accepting T and inlining T['result'] adds a LOT (~823k) instantiations\n Result extends QueryColumns,\n As extends string,\n RequireJoined,\n> = (RequireJoined extends true\n ? {\n [K in keyof Result & string as `${As}.${K}`]: {\n as: K;\n column: Result[K];\n };\n }\n : {\n [K in keyof Result & string as `${As}.${K}`]: {\n as: K;\n column: QueryColumnToNullable<Result[K]>;\n };\n }) & {\n [K in As as `${As}.*`]: {\n as: K;\n column: RequireJoined extends true\n ? ColumnsShapeToObject<Result>\n : ColumnsShapeToNullableObject<Result>;\n };\n};\n\n// Replace the 'selectable' of the query with the given selectable.\ntype JoinAddSelectable<T extends PickQueryMeta, Selectable> = {\n // is optimal\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? T['meta']['selectable'] & Selectable\n : T['meta'][K];\n }\n : 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 PickQueryMetaResultReturnType,\n Selectable extends SelectableBase,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta']]: K extends 'selectable'\n ? {\n [K in keyof T['meta']['selectable']]: {\n as: T['meta']['selectable'][K]['as'];\n column: QueryColumnToNullable<\n T['meta']['selectable'][K]['column']\n >;\n };\n } & Selectable // & is optimal\n : T['meta'][K];\n }\n : K extends 'result'\n ? // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: QueryColumnToNullable<T['result'][K]>;\n }\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n T,\n // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: QueryColumnToNullable<T['result'][K]>;\n }\n >\n >\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 */\ninterface JoinWithArgToQuery<With extends WithDataItem> extends Query {\n table: With['table'];\n meta: QueryMetaBase & {\n selectable: {\n [K in keyof With['shape'] & string as `${With['table']}.${K}`]: {\n as: K;\n column: With['shape'][K];\n };\n };\n };\n result: With['shape'];\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 PickQueryRelationsWithData,\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 PickQueryTableMetaResult\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['relationConfig']['query']\n : Arg extends JoinArgToQueryCallback\n ? ReturnType<Arg>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JoinArgToQueryCallback = (...args: any[]) => PickQueryTableMetaResult;\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<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> = (\n q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>,\n) => PickQueryTableMetaResult;\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 PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n> = (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n table: Table;\n meta: Meta;\n result: Result;\n};\n\n/**\n * Type of {@link Join.join} query method.\n */\nexport type JoinQueryMethod = <\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n>(\n this: T,\n arg: Arg,\n ...args: Args\n) => JoinResultFromArgs<T, Arg, Args, true, true>;\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, filter and 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 * .where({ commentsCount: { gt: 10 } })\n * .order({ commentsCount: 'DESC' });\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 * When joining the same table with the same condition more than once, duplicated joins will be ignored:\n *\n * ```ts\n * // joining a relation\n * db.post.join('comments').join('comments');\n *\n * // joining a table with a condition\n * db.post\n * .join('comments', 'comments.postId', 'post.id')\n * .join('comments', 'comments.postId', 'post.id');\n * ```\n *\n * Both queries will produce SQL with only 1 join\n *\n * ```sql\n * SELECT * FROM post JOIN comments ON comments.postId = post.id\n * ```\n *\n * However, this is only possible if the join has no dynamic values:\n *\n * ```ts\n * db.post\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }))\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }));\n * ```\n *\n * Both joins above have the same `{ gt: 5 }`, but still, the `5` is a dynamic value and in this case joins will be duplicated,\n * resulting in a database error.\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 relevant `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 * // `sql` can be imported from your `BaseTable` file\n * 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 * sql`lower(\"message\".\"text\")`,\n * sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * '!=',\n * 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: 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 * 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 * ## implicit join lateral\n *\n * `JOIN`'s source expression that comes before `ON` cannot access other tables, but in some cases this may be needed.\n *\n * For example, let's consider joining last 10 messages of a user:\n *\n * ```ts\n * await db.user.join('messages', (q) => q.order({ createdAt: 'DESC' }).limit(10));\n * ```\n *\n * When the `join`'s callback returns a more complex query than the one that simply applies certain conditions,\n * it will implicitly generate a `JOIN LATERAL` SQL query, as the following:\n *\n * ```sql\n * SELECT *\n * FROM \"user\"\n * JOIN LATERAL (\n * SELECT *\n * FROM \"message\" AS \"messages\"\n * WHERE \"message\".\"userId\" = \"user\".\"id\"\n * ORDER BY \"message\".\"createdAt\" DESC\n * LIMIT 10\n * ) \"messages\" ON true\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, true, true> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n true,\n 'JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, false, true> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n false,\n 'LEFT JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, true, false> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n true,\n 'RIGHT JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Args extends JoinArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Args\n ): JoinResultFromArgs<T, Arg, Args, false, false> {\n return _join(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n false,\n 'FULL JOIN',\n arg,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\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 * 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 * Note that the regular `join` will also generate `JOIN LATERAL` SQL expression when the query returned from callback is complex enough (see the bottom of {@link join} description).\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n ): JoinLateralResult<T, Table, Meta, Result, true> {\n return _joinLateral<T, Arg, Table, Meta, Result, true>(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n 'JOIN',\n arg,\n cb,\n );\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 PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Arg extends JoinFirstArg<T>,\n Table extends string,\n Meta extends QueryMetaBase,\n Result extends QueryColumns,\n >(\n this: T,\n arg: Arg,\n cb: JoinLateralCallback<T, Arg, Table, Meta, Result>,\n ): JoinLateralResult<T, Table, Meta, Result, false> {\n return _joinLateral<T, Arg, Table, Meta, Result, false>(\n (this as any).clone(), // eslint-disable-line @typescript-eslint/no-explicit-any\n 'LEFT JOIN',\n arg,\n cb,\n );\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<S extends SelectableBase> =\n | [leftColumn: keyof S, rightColumn: keyof S]\n | [leftColumn: keyof S, op: string, rightColumn: keyof S];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: PickQueryMeta,\n joinFrom: PickQueryMeta,\n args: OnArgs<SelectableBase>,\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 PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...on: OnArgs<SelectableBase>\n): T => {\n return pushQueryValue(\n q as unknown as PickQueryQ,\n 'and',\n makeOnItem(joinFrom, joinTo, on),\n ) as unknown as T;\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn = <T extends PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...on: OnArgs<SelectableBase>\n) => {\n return pushQueryValue(q as unknown as PickQueryQ, 'or', [\n makeOnItem(joinFrom, joinTo, on),\n ]);\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 PickQueryMeta>(\n q: T,\n joinFrom: PickQueryMeta,\n joinTo: PickQueryMeta,\n ...args: OnArgs<SelectableBase>\n): T => {\n const cloned = (q as unknown as Query).clone() as unknown;\n setQueryObjectValue(\n cloned as PickQueryQ,\n 'joinedShapes',\n ((joinFrom as unknown as PickQueryQ).q.as ||\n (joinFrom as PickQueryTable).table) as string,\n (joinFrom as unknown as PickQueryQ).q.shape,\n );\n return pushQueryOn(cloned as PickQueryMeta, joinFrom, joinTo, ...args) as T;\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<S extends SelectableBase> = [\n leftColumn: keyof S,\n leftPath: string,\n rightColumn: keyof S,\n rightPath: string,\n];\n\n/**\n * Mutative {@link OnMethods.on}\n */\nexport const _queryJoinOn = <T extends PickQueryMeta>(\n q: T,\n args: OnArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQueryMeta,\n q,\n ...args,\n );\n};\n\n/**\n * Mutative {@link OnMethods.orOn}\n */\nexport const _queryJoinOrOn = <T extends PickQueryMeta>(\n q: T,\n args: OnArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryOrOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQueryMeta,\n q,\n ...args,\n ) as unknown as T;\n};\n\n/**\n * Mutative {@link OnMethods.onJsonPathEquals}\n */\nexport const _queryJoinOnJsonPathEquals = <T extends PickQueryMeta>(\n q: T,\n args: OnJsonPathEqualsArgs<T['meta']['selectable']>,\n): T => {\n return pushQueryValue(q as unknown as PickQueryQ, 'and', {\n ON: args,\n }) as unknown as T;\n};\n\n/**\n * Argument of join callback.\n * It is a query object of table that you're joining, with ability to select main table's columns.\n * Adds {@link OnMethods.on} method and similar to the query.\n */\nexport type JoinQueryBuilder<\n T extends PickQueryMetaShape = PickQueryMetaShape,\n J extends PickQueryTableMetaResult = PickQueryTableMetaResult,\n> = {\n [K in keyof J]: K extends 'meta'\n ? {\n [K in keyof J['meta']]: K extends 'selectable'\n ? SelectableFromShape<J['result'], AliasOrTable<J>> &\n Omit<T['meta']['selectable'], keyof T['shape']>\n : J['meta'][K];\n }\n : J[K];\n} & OnMethods;\n\nexport class OnMethods {\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 PickQueryMeta>(\n this: T,\n ...args: OnArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOn((this as any).clone(), 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 PickQueryMeta>(\n this: T,\n ...args: OnArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOrOn((this as any).clone(), 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 PickQueryMeta>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T['meta']['selectable']>\n ): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return _queryJoinOnJsonPathEquals((this as any).clone(), args);\n }\n}\n","import { Query, SetQueryReturnsColumnOptional } from '../query/query';\nimport { QueryColumn } from 'orchid-core';\nimport { queryJson } from './json.utils';\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>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, QueryColumn<string>> {\n return queryJson((this as unknown as Query).clone(), coalesce) as never;\n }\n}\n","import { Query } from '../query/query';\nimport { quote } from '../quote';\nimport { SingleSql } from 'orchid-core';\n\nexport interface QueryLogObject {\n colors: boolean;\n beforeQuery(sql: SingleSql): unknown;\n afterQuery(sql: SingleSql, logData: unknown): void;\n onError(error: Error, sql: SingleSql, logData: unknown): void;\n}\n\nexport interface QueryLogger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface 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>(this: T, log = true): T {\n const q = (this as Query).clone();\n q.q.log = logParamToLogObject(q.q.logger, log);\n return q as T;\n }\n}\n","import {\n Query,\n GetQueryResult,\n PickQueryMetaResultReturnTypeWithDataWindows,\n} from '../query/query';\nimport { SelectQueryData, UnionSet } from '../sql';\nimport {\n getValueKey,\n MergeObjects,\n PickQueryMetaResult,\n QueryReturnType,\n QueryThen,\n RecordBoolean,\n RecordUnknown,\n} from 'orchid-core';\n\nexport type MergeQuery<\n T extends PickQueryMetaResultReturnTypeWithDataWindows,\n Q extends PickQueryMetaResultReturnTypeWithDataWindows,\n> = {\n [K in keyof T]: K extends 'meta'\n ? {\n [K in keyof T['meta'] | keyof Q['meta']]: K extends 'selectable'\n ? MergeObjects<T['meta']['selectable'], Q['meta']['selectable']>\n : K extends keyof Q['meta']\n ? Q['meta'][K]\n : T['meta'][K];\n }\n : K extends 'result'\n ? MergeQueryResult<T, Q>\n : K extends 'returnType'\n ? QueryReturnType extends Q['returnType']\n ? T['returnType']\n : Q['returnType']\n : K extends 'then'\n ? QueryThen<\n GetQueryResult<\n QueryReturnType extends Q['returnType'] ? T : Q,\n MergeQueryResult<T, Q>\n >\n >\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\ntype MergeQueryResult<\n T extends PickQueryMetaResult,\n Q extends PickQueryMetaResult,\n> = 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\nconst mergableObjects: RecordBoolean = {\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 const query = this.clone();\n const a = query.q as never as RecordUnknown;\n const b = q.q as never as RecordUnknown;\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 RecordUnknown), ...value }\n : value;\n } else if (key === 'union') {\n a[key] = a[key]\n ? {\n b: (a[key] as UnionSet).b,\n u: [...(a[key] as UnionSet).u, ...(value as UnionSet).u],\n }\n : value;\n } else {\n a[key] = value;\n }\n break;\n }\n }\n\n (a as never as SelectQueryData)[getValueKey] = (\n b as never as SelectQueryData\n )[getValueKey];\n\n if (b.returnType) a.returnType = b.returnType;\n\n return query as never;\n }\n}\n","import { Expression, PickQueryResult } from 'orchid-core';\nimport { Query } from '../query/query';\nimport { SelectQueryData, UnionItem, UnionKind } from '../sql';\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 UnionArgs<T extends PickQueryResult> = (\n | {\n result: {\n [K in keyof T['result']]: {\n queryType: T['result'][K]['queryType'];\n };\n };\n }\n | ((q: T) => Expression)\n)[];\n\nexport const _queryUnion = <T extends Query>(\n base: T,\n args: UnionArgs<T>,\n k: UnionKind,\n): T => {\n const q = base.baseQuery.clone();\n\n const u = args.map(\n (a) =>\n ({\n a: typeof a === 'function' ? a(q as never) : a,\n k,\n } as UnionItem),\n );\n\n const union = ((q.q as SelectQueryData).union = (\n base.q as SelectQueryData\n ).union);\n\n if (union) {\n union.u.push(...u);\n } else {\n (q.q as SelectQueryData).union = {\n b: base,\n u,\n };\n }\n\n return q as never;\n};\n\nexport class Union {\n /**\n * Creates a union query, takes one or more queries or SQL expressions.\n *\n * ```ts\n * // The first query of the union\n * db.one\n * .select('id', 'name')\n * // add two more queries to the union\n * .union(\n * db.two.select('id', 'name'),\n * (q = q.sql`SELECT id, name FROM \"thirdTable\"`),\n * )\n * // sub-sequent `union` is equivalent to passing multiple queries into a single `union`\n * .union(db.three.select('id', 'name'));\n * ```\n *\n * `order`, `limit`, `offset` are special, it matters if you place them **before** or **after** the `union`, it also have a meaning to place them before and after.\n *\n * ```ts\n * // order, limit, offset are applied ONLY to 'one'\n * db.one\n * .order('x')\n * .limit(1)\n * .offset(1)\n * // 'two' also has order, limit, and offset\n * .unionAll(db.two.order('y').limit(2).offset(2))\n * // sets order, limit, offset for all records\n * .order('z')\n * .limit(3)\n * .offset(3);\n * ```\n *\n * Equivalent SQL:\n *\n * ```sql\n * -- both union parts have their own order, limit, offset\n * ( SELECT * FROM one ORDER x ASC LIMIT 1 OFFSET 1 )\n * UNION ALL\n * ( SELECT * FROM two ORDER y ASC LIMIT 2 OFFSET 2 )\n * -- order, limit, offset of the whole query\n * ORDER BY z ASC LIMIT 3 OFFSET 3\n * ```\n *\n * All the listed methods have the same signature, they are only different by SQL keyword:\n *\n * - `union` - union of all queries, performs deduplication\n * - `unionAll` - `union` that allows duplicated rows\n * - `intersect` - get only rows that are present in all queries\n * - `intersectAll` - `intersect` that allows duplicated rows\n * - `except` - get only rows that are in the first query but not in the second\n * - `exceptAll` - `except` that allows duplicated rows\n *\n * @param args - array of queries or SQL expressions\n */\n union<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'UNION',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n unionAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'UNION ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses a `INTERSECT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n intersect<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'INTERSECT',\n ) as never;\n }\n\n /**\n * Same as {@link intersect}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n intersectAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'INTERSECT ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses an `EXCEPT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n except<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'EXCEPT',\n ) as never;\n }\n\n /**\n * Same as {@link except}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n exceptAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n (this as unknown as Query).clone(),\n args as UnionArgs<Query>,\n 'EXCEPT ALL',\n ) as never;\n }\n}\n","import { WithOptions } from '../sql';\nimport {\n PickQueryMetaWithDataColumnTypes,\n PickQueryWithDataColumnTypes,\n Query,\n} from '../query/query';\nimport { pushQueryValue, setQueryObjectValue } from '../query/queryUtils';\nimport {\n Expression,\n ColumnsShapeBase,\n EmptyObject,\n PickQueryResult,\n QueryColumns,\n} from 'orchid-core';\nimport { SqlMethod } from './sql';\nimport { getShapeFromSelect } from './select';\nimport { _queryUnion } from './union';\n\n// `with` method options\n// - `columns`: true to get all columns from the query, or array of column names\n// - `materialized`, `notMaterialized`: adds corresponding SQL keyword\nexport interface WithArgsOptions {\n columns?: string[] | boolean;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface WithRecursiveOptions extends WithArgsOptions {\n union?:\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n}\n\nexport interface WithQueryBuilder<T extends PickQueryWithDataColumnTypes>\n extends Query {\n sql: SqlMethod<T['columnTypes']>['sql'];\n relations: EmptyObject;\n withData: T['withData'];\n}\n\n// Adds a `withData` entry to a query\nexport type WithResult<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n> = {\n [K in keyof T]: K extends 'meta'\n ? { [K in keyof T['meta']]: K extends 'kind' ? 'select' : T['meta'][K] }\n : K extends 'withData'\n ? {\n [K in keyof T['withData'] | Name]: K extends Name\n ? {\n table: Name;\n shape: Q['result'];\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nexport type WithSqlResult<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends QueryColumns,\n> = {\n [K in keyof T]: K extends 'withData'\n ? {\n [K in Name | keyof T['withData']]: K extends Name\n ? {\n table: Name;\n shape: Shape;\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nexport class WithMethods {\n /**\n * Add Common Table Expression (CTE) to the query.\n *\n * ```ts\n * import { columnTypes } from 'orchid-orm';\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 * 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: sql`1`.type((t) => t.integer()) }),\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 with<T extends PickQueryMetaWithDataColumnTypes, Name extends string, Q>(\n this: T,\n name: Name,\n query: Q | ((q: WithQueryBuilder<T>) => Q),\n ): WithResult<T, Name, Q extends Query ? Q : never>;\n with<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n >(\n this: T,\n name: Name,\n options: WithArgsOptions,\n query: Q | ((q: WithQueryBuilder<T>) => Q),\n ): WithResult<T, Name, Q>;\n with(\n name: string,\n second:\n | WithArgsOptions\n | Query\n | ((q: WithQueryBuilder<PickQueryWithDataColumnTypes>) => Query),\n third?:\n | Query\n | ((q: WithQueryBuilder<PickQueryWithDataColumnTypes>) => Query),\n ) {\n const q = (this as unknown as Query).clone();\n\n // eslint-disable-next-line prefer-const\n let [options, queryArg] = third\n ? [second as WithArgsOptions, third]\n : [undefined, second];\n\n let query: Query;\n if (typeof queryArg === 'function') {\n const arg = q.queryBuilder.clone();\n arg.q.withShapes = q.q.withShapes;\n query = queryArg(arg);\n } else {\n query = queryArg as Query;\n }\n\n if (options?.columns === true) {\n options = {\n ...options,\n columns: Object.keys(query.shape),\n };\n }\n\n pushQueryValue(q, 'with', { n: name, o: options, q: query });\n\n const shape = getShapeFromSelect(query, true);\n\n return setQueryObjectValue(q, 'withShapes', name, shape);\n }\n\n withRecursive<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n Result = WithResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n base: Q | ((qb: WithQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => Query,\n ): Result;\n withRecursive<\n T extends PickQueryMetaWithDataColumnTypes,\n Name extends string,\n Q extends Query,\n Result = WithResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n options: WithRecursiveOptions,\n base: Q | ((qb: WithQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => Query,\n ): Result;\n withRecursive(name: string, ...args: unknown[]) {\n const q = (this as unknown as Query).clone();\n\n // eslint-disable-next-line prefer-const\n let [options, baseFn, recursiveFn] = (\n args.length === 2 ? [{}, args[0], args[1]] : args\n ) as [\n options: WithRecursiveOptions,\n base: Query | ((q: unknown) => Query),\n recursive: (q: unknown) => Query,\n ];\n\n const arg = q.queryBuilder.clone();\n arg.q.withShapes = q.q.withShapes;\n let query = typeof baseFn === 'function' ? baseFn(arg) : baseFn;\n const shape = ((arg.q.withShapes ??= {})[name] = getShapeFromSelect(\n query,\n true,\n ) as ColumnsShapeBase);\n const recursive = recursiveFn(arg);\n\n query = _queryUnion(query, [recursive], options.union ?? 'UNION ALL');\n\n (options as WithOptions).recursive = true;\n\n if (options.columns === true) {\n options = {\n ...options,\n columns: Object.keys(shape),\n };\n }\n\n pushQueryValue(q, 'with', { n: name, o: options, q: query });\n\n return setQueryObjectValue(q, 'withShapes', name, shape);\n }\n\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends ColumnsShapeBase,\n >(\n this: T,\n name: Name,\n options: WithOptions,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): WithSqlResult<T, Name, Shape>;\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends ColumnsShapeBase,\n >(\n this: T,\n name: Name,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): WithSqlResult<T, Name, Shape>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n withSql(this: PickQueryWithDataColumnTypes, name: string, ...args: any[]) {\n const q = (this as unknown as Query).clone();\n\n const [options, shape, sql] =\n args.length === 2 ? [undefined, args[0], args[1]] : args;\n\n pushQueryValue(q, 'with', {\n n: name,\n o: options,\n s: sql(q),\n });\n\n return setQueryObjectValue(\n q,\n 'withShapes',\n name,\n shape(this.columnTypes),\n ) as never;\n }\n}\n","import {\n PickQueryMetaRelations,\n PickQueryMetaShapeRelationsWithData,\n PickQueryRelations,\n Query,\n QueryOrExpression,\n QueryOrExpressionBooleanOrNullResult,\n} from '../../query/query';\nimport { ColumnOperators } from '../../sql';\nimport { pushQueryArray, pushQueryValue } from '../../query/queryUtils';\nimport { JoinArgs, JoinFirstArg } from '../join/join';\nimport {\n ColumnsShapeBase,\n Expression,\n MaybeArray,\n PickQueryMeta,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { getIsJoinSubQuery } from '../../sql/join';\nimport { getShapeFromSelect } from '../select';\nimport { QueryBase } from '../../query/queryBase';\nimport { sqlQueryArgsToExpression } from '../../sql/rawSql';\nimport { RelationsBase } from '../../relations';\nimport { processJoinArgs } from '../join/processJoinArgs';\nimport { ExpressionMethods } from '../expressions';\nimport { _queryNone } from '../none';\nimport {\n getClonedQueryData,\n resolveSubQueryCallback,\n} from '../../common/utils';\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 PickQueryMetaRelations> =\n | {\n [K in\n | keyof T['meta']['selectable']\n | 'NOT'\n | 'OR'\n | 'IN']?: K extends 'NOT'\n ? WhereArg<T> | WhereArgs<T>\n : K extends 'OR'\n ? (WhereArg<T> | WhereArgs<T>)[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['meta']['selectable'])[];\n values: unknown[][] | QueryBase | Expression;\n }>\n :\n | T['meta']['selectable'][K]['column']['queryType']\n | null\n | ColumnOperators<T['meta']['selectable'], K>\n | QueryOrExpression<\n T['meta']['selectable'][K]['column']['queryType'] | null\n >\n | ((\n q: T,\n ) => QueryOrExpression<\n T['meta']['selectable'][K]['column']['queryType'] | null\n >);\n }\n | QueryOrExpressionBooleanOrNullResult\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryOrExpressionBooleanOrNullResult | WhereQueryBuilder<T>);\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 PickQueryRelations> =\n RelationsBase extends T['relations']\n ? {\n [K in keyof T]: K extends\n | keyof QueryBase\n | keyof Where\n | keyof ExpressionMethods\n | 'sql'\n | 'get'\n | 'ref'\n ? T[K]\n : never;\n }\n : {\n [K in keyof T]: K extends keyof T['relations']\n ? T['relations'][K]\n : K extends\n | keyof QueryBase\n | keyof Where\n | keyof ExpressionMethods\n | 'sql'\n | 'get'\n | 'ref'\n ? T[K]\n : never;\n };\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends PickQueryMetaRelations> = WhereArg<T>[];\n\nexport type WhereNotArgs<T extends PickQueryMetaRelations> = [WhereArg<T>];\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends PickQueryMetaRelations> =\n | keyof T['meta']['selectable']\n | [keyof T['meta']['selectable'], ...(keyof T['meta']['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 PickQueryMetaRelations,\n Column,\n> = Column extends keyof T['meta']['selectable']\n ?\n | T['meta']['selectable'][Column]['column']['queryType'][]\n | Query\n | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['meta']['selectable']\n ? T['meta']['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 PickQueryMeta> = {\n [K in keyof T['meta']['selectable']]?:\n | T['meta']['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> = T & QueryMetaHasWhere;\n\nexport interface QueryMetaHasWhere {\n meta: {\n hasWhere: true;\n };\n}\n\nconst resolveCallbacksInArgs = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n) => {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === 'function') {\n const qb = Object.create(q);\n qb.q = getClonedQueryData((q as unknown as Query).q);\n qb.q.and = qb.q.or = qb.q.scopes = undefined;\n qb.q.subQuery = 1;\n\n args[i] = resolveSubQueryCallback(qb, arg as never) as never;\n }\n }\n};\n\n/**\n * Mutative {@link Where.where}\n */\nexport const _queryWhere = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'and',\n args,\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereSql}\n */\nexport const _queryWhereSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValue(\n q as unknown as Query,\n 'and',\n sqlQueryArgsToExpression(args),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereNot}\n */\nexport const _queryWhereNot = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereNotArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValue(q as unknown as Query, 'and', {\n NOT: args,\n }) as never;\n};\n\n/**\n * Mutative {@link Where.whereNotSql}\n */\nexport const _queryWhereNotSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValue(q as unknown as Query, 'and', {\n NOT: sqlQueryArgsToExpression(args),\n }) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.orWhere}\n */\nexport const _queryOr = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'or',\n args.map((item) => [item]),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.orWhereNot}\n */\nexport const _queryOrNot = <T extends PickQueryMetaRelations>(\n q: T,\n args: WhereArgs<T>,\n): WhereResult<T> => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArray(\n q as unknown as Query,\n 'or',\n args.map((item) => {\n return [{ NOT: item }];\n }),\n ) as unknown as WhereResult<T>;\n};\n\n/**\n * Mutative {@link Where.whereIn}\n */\nexport const _queryWhereIn = <T>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | unknown[][] | Query | Expression | undefined,\n not?: boolean,\n): WhereResult<T> => {\n let item;\n if (values) {\n if ('length' in values && !values.length) {\n return _queryNone(q) as WhereResult<T>;\n }\n\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n } else {\n item = { [arg as string]: { in: values } };\n }\n } else {\n item = {} as { [K: string]: { in: unknown[] } };\n for (const key in arg as { [K: string]: unknown[] }) {\n const values = (arg as { [K: string]: unknown[] })[key];\n if ('length' in values && !values.length) {\n return _queryNone(q) as WhereResult<T>;\n }\n\n item[key] = { in: values };\n }\n }\n\n if (not) item = { NOT: item };\n\n if (and) {\n pushQueryValue(q as unknown as Query, 'and', item);\n } else {\n pushQueryValue(q as unknown as Query, 'or', [item]);\n }\n\n return q as unknown as WhereResult<T>;\n};\n\n/**\n * Process arguments of `whereExists`.\n */\nconst existsArgs = (\n self: Query,\n q: JoinFirstArg<Query>,\n args: JoinArgs<Query, Query>,\n) => {\n let joinSubQuery;\n if (typeof q === 'object') {\n joinSubQuery = getIsJoinSubQuery(q as Query);\n if (joinSubQuery) {\n q = (q as Query).clone();\n (q as Query).shape = getShapeFromSelect(\n q as Query,\n true,\n ) as ColumnsShapeBase;\n }\n } else {\n joinSubQuery = false;\n }\n\n const joinArgs = processJoinArgs(self, q, args as never, joinSubQuery);\n\n return [\n {\n EXISTS: joinArgs,\n },\n ] as never;\n};\n\n/**\n * Mutative {@link Where.whereExists}\n */\nexport const _queryWhereExists = <\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n>(\n q: T,\n arg: Arg,\n args: JoinArgs<T, Arg>,\n): WhereResult<T> => {\n return _queryWhere(\n q,\n existsArgs(q as unknown as Query, arg as never, args as never),\n ) as never;\n};\n\nexport 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 * // import `sql` from your `BaseTable`\n * column: sql`sql expression`,\n * // or use `(q) => q.sql` for the same\n * column2: (q) => q.sql`sql expression`,\n *\n * // reference other columns in such a way:\n * firstName: (q) => q.ref('lastName'),\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(sql`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 * 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 * 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: 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(), sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `varchar`, `string`, 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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryWhere(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * Use a custom SQL expression in `WHERE` statement:\n *\n * ```ts\n * db.table.whereSql`a = b`;\n * ```\n *\n * @param args - SQL expression\n */\n whereSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereSql(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * `whereNot` takes the same argument as `where`,\n * multiple conditions are combined with `AND`,\n * the whole group of conditions is negated with `NOT`.\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * // WHERE NOT color = 'red'\n * db.table.whereNot({ one: 1, two: 2 });\n * // WHERE NOT (one = 1 AND two = 2)\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends PickQueryMetaRelations>(\n this: T,\n ...args: WhereNotArgs<T>\n ): WhereResult<T> {\n return _queryWhereNot(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\n }\n\n /**\n * `whereNotSql` is a version of `whereNot` accepting SQL expression:\n *\n * ```ts\n * db.table.whereNotSql`sql expression`\n * ```\n *\n * @param args - SQL expression\n */\n whereNotSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereNotSql((this as unknown as Query).clone(), args) as never;\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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryOr((this as unknown as Query).clone(), args as never) as never;\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 PickQueryMetaRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): WhereResult<T> {\n return _queryOrNot(\n (this as unknown as Query).clone(),\n args as never,\n ) as never;\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'], sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * When empty set of values is given, `whereIn` will resolve into a {@link QueryMethods.none} query that has a special behavior.\n *\n * ```ts\n * // following queries resolves into `none`:\n * db.table.where('id', [])\n * db.table.where(['id', 'name'], [])\n * db.table.where({ id: [] })\n * ```\n */\n whereIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n true,\n args[0],\n args[1],\n ) as never;\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 orWhereIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n false,\n args[0],\n args[1],\n ) as never;\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 whereNotIn<T extends PickQueryMetaRelations, Column extends WhereInColumn<T>>(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n true,\n args[0],\n args[1],\n true,\n ) as never;\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 orWhereNotIn<\n T extends PickQueryMetaRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): WhereResult<T> {\n return _queryWhereIn(\n (this as unknown as Query).clone(),\n false,\n args[0],\n args[1],\n true,\n ) as never;\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 whereExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n return _queryWhereExists(\n (this as unknown as Query).clone() as unknown as T,\n arg,\n args,\n );\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 orWhereExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryOr(q, existsArgs(q, arg as never, args as never)) as never;\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 PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryWhereNot(\n q,\n existsArgs(q, arg as never, args as never),\n ) as never;\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 orWhereNotExists<\n T extends PickQueryMetaShapeRelationsWithData,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n return _queryOrNot(q, existsArgs(q, arg as never, args as never)) as never;\n }\n}\n","import {\n PickQueryMetaResultRelationsWithDataReturnTypeShape,\n Query,\n QueryOrExpression,\n QueryReturnsAll,\n SetQueryKind,\n SetQueryReturnsRowCount,\n} from '../query/query';\nimport {\n pushQueryValue,\n saveSearchAlias,\n throwIfNoWhere,\n} from '../query/queryUtils';\nimport { RelationConfigBase } from '../relations';\nimport { _queryWhereIn, WhereResult } from './where/where';\nimport { ToSQLQuery } from '../sql';\nimport { VirtualColumn } from '../columns';\nimport { anyShape, Db } from '../query/db';\nimport {\n isExpression,\n Expression,\n callWithThis,\n RecordUnknown,\n PickQueryShape,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { QueryResult } from '../adapter';\nimport { RawSQL, sqlQueryArgsToExpression } from '../sql/rawSql';\nimport { resolveSubQueryCallback } from '../common/utils';\nimport { OrchidOrmInternalError } from '../errors';\n\nexport interface UpdateSelf\n extends PickQueryMetaResultRelationsWithDataReturnTypeShape {\n inputType: RecordUnknown;\n}\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 UpdateSelf> = {\n [K in\n | keyof T['inputType']\n | keyof T['relations']]?: K extends keyof T['inputType']\n ? UpdateColumn<T, K>\n : UpdateRelationData<T, T['relations'][K]['relationConfig']>;\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 UpdateSelf, Key extends keyof T['inputType']> =\n | T['inputType'][Key]\n | QueryOrExpression<T['inputType'][Key]>\n | ((q: T) => QueryOrExpression<T['inputType'][Key]>);\n\n// Add relation operations to the update argument.\ntype UpdateRelationData<\n T extends UpdateSelf,\n Rel extends RelationConfigBase,\n> = QueryReturnsAll<T['returnType']> extends true\n ? Rel['dataForUpdate']\n : Rel['one'] extends true\n ? Rel['dataForUpdate'] | Rel['dataForUpdateOne']\n : Rel['dataForUpdate'] & Rel['dataForUpdateOne'];\n\n// Type of argument for `update`.\n// not available when there are no conditions on the query.\nexport type UpdateArg<T extends UpdateSelf> = T['meta']['hasWhere'] extends true\n ? UpdateData<T>\n : never;\n\n// Type of argument for `updateSql`.\n// not available when there are no conditions on the query.\ntype UpdateRawArgs<T extends UpdateSelf> = T['meta']['hasWhere'] extends true\n ? SQLQueryArgs\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 UpdateSelf> = T['meta']['hasSelect'] extends true\n ? SetQueryKind<T, 'update'>\n : SetQueryReturnsRowCount<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 PickQueryShape> =\n | keyof T['shape']\n | { [K in 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 interface UpdateCtx {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n collect?: UpdateCtxCollect;\n}\n\nexport interface UpdateCtxCollect {\n keys: string[];\n data: RecordUnknown;\n}\n\n// apply `increment` or a `decrement`,\n// mutates the `queryData` of a query.\nexport const _queryChangeCounter = <T extends UpdateSelf>(\n self: T,\n op: string,\n data: ChangeCountArg<T>,\n) => {\n const q = (self as unknown as Query).q;\n q.type = 'update';\n\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returnType = 'rowCount';\n }\n\n let map: { [K: 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 as unknown as Query, 'updateData', map);\n return self as never;\n};\n\n// sets query type, `returnType`, casts type from Query to UpdateResult\nconst update = <T extends UpdateSelf>(self: T): UpdateResult<T> => {\n const q = (self as unknown as Query).q;\n q.type = 'update';\n\n if (!q.select) {\n q.returnType = 'rowCount';\n }\n\n throwIfNoWhere(self as unknown as Query, 'update');\n\n return self as never;\n};\n\nexport const _queryUpdate = <T extends UpdateSelf>(\n query: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n const { q } = query as unknown as Query;\n\n const set: RecordUnknown = { ...arg };\n pushQueryValue(query as unknown as Query, '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(query, 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 (query as unknown as Query).baseQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\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(\n query as unknown as Query,\n 'q',\n 'withShapes',\n );\n pushQueryValue(query as unknown as Query, 'with', {\n n: as,\n q: value,\n });\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.collect) {\n const t = (query as unknown as Query).baseQuery.clone();\n const { keys } = ctx.collect;\n\n (\n _queryWhereIn as unknown as (\n q: Query,\n keys: string[],\n values: unknown[][],\n ) => Query\n )(\n t,\n keys,\n queryResult.rows.map((item) => keys.map((key) => item[key])),\n );\n\n _queryUpdate(\n t as WhereResult<Query>,\n ctx.collect.data as UpdateData<WhereResult<Query>>,\n );\n\n for (const row of queryResult.rows) {\n Object.assign(row, ctx.collect.data);\n }\n }\n };\n }\n\n return update(query);\n};\n\nexport const _queryUpdateRaw = <T extends UpdateSelf>(\n q: T,\n sql: Expression,\n): UpdateResult<T> => {\n pushQueryValue(q as unknown as Query, 'updateData', sql);\n\n (q as unknown as Query).q.type = 'update';\n\n return update(q);\n};\n\nexport const _queryUpdateOrThrow = <T extends UpdateSelf>(\n q: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n (q as unknown as Query).q.throwOnNotFound = true;\n return _queryUpdate(q, arg);\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: (q) => q.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 * `update` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$queryBuilder\n * // update record in one table\n * .with('a', db.table.find(1).select('id').update(data))\n * // update record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable\n * .find(1)\n * .select('id')\n * .update({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\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 UpdateSelf>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n return _queryUpdate(\n (this as unknown as Query).clone(),\n arg as never,\n ) as never;\n }\n\n /**\n * `updateSql` 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).updateSql`name = ${value}`;\n *\n * // or update with `sql` function:\n * await db.table.find(1).updateSql(sql`name = ${value}`);\n * ```\n * @param args - raw SQL via a template string or by using a `sql` method\n */\n updateSql<T extends UpdateSelf>(\n this: T,\n ...args: UpdateRawArgs<T>\n ): UpdateResult<T> {\n return _queryUpdateRaw(\n (this as unknown as Query).clone(),\n sqlQueryArgsToExpression(args),\n ) as never;\n }\n\n /**\n * To make sure that at least one row was updated use `updateOrThrow`:\n *\n * ```ts\n * import { NotFoundError } from 'orchid-orm';\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 UpdateSelf>(\n this: T,\n arg: UpdateArg<T>,\n ): UpdateResult<T> {\n return _queryUpdateOrThrow(\n (this as unknown as Query).clone(),\n arg as never,\n ) as never;\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 UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(\n (this as unknown as Query).clone(),\n '+',\n data as never,\n );\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 UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(\n (this as unknown as Query).clone(),\n '-',\n data as never,\n );\n }\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../query/query';\nimport { AggregateMethods } from './aggregate';\nimport {\n addValue,\n emptyObject,\n Expression,\n MaybeArray,\n PickQueryMeta,\n QueryColumn,\n} from 'orchid-core';\nimport {\n OrderTsQueryConfig,\n QueryData,\n QuerySourceItem,\n SearchWeight,\n ToSQLCtx,\n} from '../sql';\nimport {\n pushQueryValue,\n saveSearchAlias,\n setQueryObjectValue,\n} from '../query/queryUtils';\nimport { getSearchLang, getSearchText } from '../sql/fromAndAs';\nimport { OrchidOrmInternalError } from '../errors';\nimport { columnToSql } from '../sql/common';\nimport { Operators } from '../columns/operators';\n\n// `headline` first argument is a name of the search.\ntype HeadlineSearchArg<T extends PickQueryMeta> = 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).\ninterface HeadlineParams<T extends PickQueryMeta> {\n text?: SelectableOrExpressionOfType<T, QueryColumn<string>>;\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 PickQueryMeta>(\n this: T,\n search: HeadlineSearchArg<T>,\n options?: HeadlineParams<T>,\n ): SetQueryReturnsColumnOrThrow<T, QueryColumn<string>>;\n }\n}\n\n// type of `search` argument\nexport type SearchArg<T extends PickQueryMeta, 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['meta']['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['meta']['selectable']>\n | { [K in keyof T['meta']['selectable']]?: SearchWeight };\n }\n | {\n // search in a generated vector column\n vector: {\n [K in keyof T['meta']['selectable']]: T['meta']['selectable'][K]['column']['dataType'] extends 'tsvector'\n ? K\n : never;\n }[keyof T['meta']['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, As extends string> = T & {\n meta: { tsQuery: string extends As ? never : As };\n};\n\nclass Headline extends Expression<QueryColumn<string>> {\n result = emptyObject as { value: QueryColumn<string> };\n\n constructor(\n public q: QueryData,\n public source: QuerySourceItem,\n public params?: HeadlineParams<Query>,\n ) {\n super();\n q.expr = this;\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\nObject.assign(Headline, Operators.text);\n\nAggregateMethods.prototype.headline = function (\n this: PickQueryMeta,\n search,\n params,\n) {\n const q = this as unknown as Query;\n const source = q.q.sources?.[search];\n if (!source)\n throw new OrchidOrmInternalError(q, `Search \\`${search}\\` is not defined`);\n\n return new Headline(\n q.q,\n source,\n params as HeadlineParams<Query> | undefined,\n ) as never;\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 PickQueryMeta, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n const q = (this as unknown as Query).clone();\n\n if (!arg.as) {\n const as = saveSearchAlias(q, '@q', 'joinedShapes') as As;\n\n arg = {\n ...arg,\n as,\n };\n }\n\n setQueryObjectValue(q, 'sources', arg.as as string, arg);\n if (arg.order) {\n pushQueryValue(q, 'order', arg.as);\n }\n\n return pushQueryValue(q, 'and', { SEARCH: arg }) as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsOneKind,\n SetQueryReturnsVoidKind,\n} from '../query/query';\nimport { _queryUpdate, UpdateData, UpdateSelf } from './update';\nimport { CreateBelongsToData, CreateData, CreateSelf } from './create';\nimport { MoreThanOneRowError } from '../errors';\nimport {\n FnUnknownToUnknown,\n isObjectEmpty,\n PickQueryMetaResult,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryMetaHasWhere } from './where/where';\n\n// `orCreate` arg type.\n// Unlike `upsert`, doesn't pass a data to `create` callback.\nexport type OrCreateArg<Data> = Data | (() => Data);\n\ntype UpsertCreate<DataKey extends PropertyKey, CD> = {\n [K in keyof CD as K extends DataKey ? never : K]: CD[K];\n} & {\n [K in DataKey]?: K extends keyof CD ? CD[K] : never;\n};\n\n// unless upsert query has a select, it returns void\nexport type UpsertResult<T extends PickQueryMetaResult> =\n T['meta']['hasSelect'] extends true\n ? SetQueryReturnsOneKind<T, 'upsert'>\n : SetQueryReturnsVoidKind<T, 'upsert'>;\n\n// Require type of query object to query only one record\n// because upserting multiple isn't possible\nexport type UpsertThis = UpdateSelf &\n CreateSelf &\n QueryMetaHasWhere & {\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 | FnUnknownToUnknown,\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) data = { ...mergeData, ...(data as RecordUnknown) };\n\n const inner = q.create(data as CreateData<Query, never>);\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<\n T extends UpsertThis,\n Update extends UpdateData<T>,\n BT extends CreateBelongsToData<T>,\n >(\n this: T,\n data:\n | {\n update: Update;\n create: CreateData<T, BT> | ((update: Update) => CreateData<T, BT>);\n }\n | {\n data: Update;\n create:\n | UpsertCreate<keyof Update, CreateData<T, BT>>\n | ((\n update: Update,\n ) => UpsertCreate<keyof Update, CreateData<T, BT>>);\n },\n ): UpsertResult<T> {\n const q = (this as unknown as Query).clone();\n\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 _queryUpdate(q, updateData as never);\n }\n\n return orCreate(q as never, 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, BT extends CreateBelongsToData<T>>(\n this: T,\n data: OrCreateArg<CreateData<T, BT>>,\n ): UpsertResult<T> {\n return orCreate((this as unknown as Query).clone() as never, data);\n }\n}\n","import { DynamicSQLArg, QueryColumn, StaticSQLArgs } from 'orchid-core';\nimport { DynamicRawSQL, raw, RawSQL } from '../sql/rawSql';\nimport { PickQueryColumnTypes } from '../query/query';\n\nexport class SqlMethod<ColumnTypes> {\n /**\n * When there is a need to use a piece of raw SQL, use the `sql` exported from the `BaseTable` file, it is also attached to query objects for convenience.\n *\n * When selecting a custom SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const result: { num: number }[] = await db.table.select({\n * num: sql<number>`random() * 100`,\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 * import { sql } from './baseTable';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: sql`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 * Many query methods have a version suffixed with `Sql`, you can pass an SQL template literal directly to these methods.\n * These methods are: `whereSql`, `whereNotSql`, `orderSql`, `havingSql`, `fromSql`, `findBySql`.\n *\n * ```ts\n * await db.table.whereSql`\"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.whereSql`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](/guide/sql-expressions#column) or [ref](/guide/sql-expressions#ref) to reference a column:\n *\n * ```ts\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.ref('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 { sql } from './baseTable';\n *\n * // no interpolation is okay\n * await db.table.where(sql({ 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(sql({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `sql({ raw: '...' })` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` or `ref` are preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\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 * sql<boolean>({\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 * import { sql } from './baseTable';\n *\n * // simplest form:\n * sql`key = ${value}`;\n *\n * // with resulting type:\n * sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * sql`($one + $two) / $one`.type((t) => t.numeric()).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: PickQueryColumnTypes,\n ...args: StaticSQLArgs\n ): RawSQL<QueryColumn<T>, ColumnTypes>;\n sql<T = unknown>(\n this: PickQueryColumnTypes,\n ...args: [DynamicSQLArg]\n ): DynamicRawSQL<QueryColumn<T>, ColumnTypes>;\n sql(this: PickQueryColumnTypes, ...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, QueryInternal, WithDataBase } from './query';\nimport { QueryData } from '../sql';\nimport {\n EmptyObject,\n QueryBaseCommon,\n QueryMetaBase,\n QueryColumns,\n RecordKeyTrue,\n QueryThen,\n QueryReturnType,\n} from 'orchid-core';\nimport { RelationsBase } from '../relations';\nimport { getClonedQueryData } from '../common/utils';\n\nexport type CloneSelfKeys = 'clone' | 'baseQuery' | 'q';\n\nexport abstract class QueryBase<Scopes extends RecordKeyTrue = EmptyObject>\n implements QueryBaseCommon<Scopes>\n{\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>(this: T): T {\n const cloned = Object.create((this as unknown as Query).baseQuery);\n cloned.q = getClonedQueryData((this as unknown as Query).q);\n return cloned;\n }\n __isQuery!: true;\n result!: QueryColumns;\n q = {} as QueryData;\n table?: string;\n shape!: QueryColumns;\n relations!: RelationsBase;\n withData!: WithDataBase;\n baseQuery!: Query;\n internal!: QueryInternal;\n meta!: QueryMetaBase<Scopes>;\n returnType!: QueryReturnType;\n}\n\nexport interface QueryBaseThen<T> extends QueryBase {\n then: QueryThen<T>;\n}\n","import { Query } from '../query/query';\nimport { QueryColumn, QueryThen } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\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 * It is meant to transform the whole result of a query, for transforming individual records consider using {@link QueryMap.map}.\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, Result>(\n this: T,\n fn: (\n input: T['then'] extends QueryThen<infer Data> ? Data : never,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: QueryColumn<Result> }\n : K extends 'then'\n ? QueryThen<Result>\n : T[K];\n } {\n return pushQueryValue(this.clone(), 'transform', fn) as never;\n }\n}\n","import { Query, QueryReturnsAll } from '../query/query';\nimport { QueryColumn, QueryThen, RecordUnknown } from 'orchid-core';\nimport { pushQueryValue } from '../query/queryUtils';\n\nexport class QueryMap {\n /**\n * Use `map` to transform individual records of a query result.\n *\n * It accepts a single record and should return a single transformed record.\n *\n * For transforming the whole result of a query, consider using [transform](#transform) instead.\n *\n * The [hooks](/guide/hooks) that are going to run after the query will receive the query result **before** transformation.\n *\n * ```ts\n * // add a `titleLength` to every post\n * const posts = await db.post.limit(10).map((post) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * posts[0].titleLength; // number\n *\n * // using the exact same `map` function to transform a single post\n * const singlePost = await db.post.find(id).map((post) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * singlePost.titleLength; // number\n *\n * // can be used in sub-queries\n * const postsWithComments = await db.post.select('title', {\n * comments: (q) =>\n * q.comments.map((comment) => ({\n * ...comment,\n * truncatedContent: comment.content.slice(0, 100),\n * })),\n * });\n *\n * postsWithComments[0].comments[0].truncatedContent; // string\n * ```\n *\n * @param fn - function to transform an individual record\n */\n map<T extends Query, Result extends RecordUnknown>(\n this: T,\n fn: (\n input: QueryReturnsAll<T['returnType']> extends true\n ? T['then'] extends QueryThen<(infer Data)[]>\n ? Data\n : never\n : T['then'] extends QueryThen<infer Data>\n ? Data\n : never,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'result'\n ? { [K in keyof Result]: QueryColumn<Result[K]> }\n : K extends 'then'\n ? QueryThen<\n QueryReturnsAll<T['returnType']> extends true ? Result[] : Result\n >\n : T[K];\n } {\n return pushQueryValue(this.clone(), 'transform', { map: fn }) as never;\n }\n}\n","import { QueryBase } from '../query/queryBase';\nimport { PickQueryMeta, QueryColumns, QueryMetaBase } from 'orchid-core';\nimport { QueryScopes } from '../sql';\nimport { setQueryObjectValue } from '../query/queryUtils';\nimport { Where, WhereResult } from './where/where';\nimport { Query, SelectableFromShape } from '../query/query';\n\ninterface ScopeArgumentQueryMeta<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends QueryMetaBase {\n selectable: SelectableFromShape<Shape, Table>;\n}\n\nexport interface ScopeArgumentQuery<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends Where,\n QueryBase {\n table: Table;\n shape: Shape;\n meta: ScopeArgumentQueryMeta<Table, Shape>;\n}\n\n/**\n * This feature allows defining a set of query modifiers to use it later.\n * Only [where conditions](/guide/where.html) can be set in a scope.\n * If you define a scope with name `default`, it will be applied for all table queries by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * hidden: t.boolean(),\n * active: t.boolean(),\n * }));\n *\n * scopes = this.setScopes({\n * default: (q) => q.where({ hidden: false }),\n * active: (q) => q.where({ active: true }),\n * });\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * some: SomeTable,\n * },\n * );\n *\n * // the default scope is applied for all queries:\n * const nonHiddenRecords = await db.some;\n * ```\n */\nexport class ScopeMethods {\n /**\n * See {@link ScopeMethods}\n *\n * Use the `scope` method to apply a pre-defined scope.\n *\n * ```ts\n * // use the `active` scope that is defined in the table:\n * await db.some.scope('active');\n * ```\n *\n * @param scope - name of the scope to apply\n */\n scope<T extends PickQueryMeta>(\n this: T,\n scope: keyof T['meta']['scopes'],\n ): WhereResult<T> {\n const q = (this as unknown as Query).clone();\n\n if (!q.q.scopes?.[scope as string]) {\n const s = (q.internal.scopes as QueryScopes)[scope as string];\n\n if (!s) throw new Error(`Scope ${scope as string} is not defined`);\n\n setQueryObjectValue(q, 'scopes', scope as string, s);\n }\n\n return q as never;\n }\n\n /**\n * See {@link ScopeMethods}\n *\n * Remove conditions that were added by the scope from the query.\n *\n * ```ts\n * // SomeTable has a default scope, ignore it for this query:\n * await db.some.unscope('default');\n * ```\n *\n * @param scope - name of the scope to remove from the query\n */\n unscope<T extends PickQueryMeta>(\n this: T,\n scope: keyof T['meta']['scopes'],\n ): T {\n const q = (this as unknown as Query).clone();\n\n if (q.q.scopes) {\n delete q.q.scopes[scope as string];\n for (const _ in q.q.scopes) {\n return q as never;\n }\n delete q.q.scopes;\n }\n\n return q as never;\n }\n}\n","import {\n PickQueryResult,\n QueryColumns,\n QueryColumnsInit,\n QueryMetaBase,\n RecordUnknown,\n} from 'orchid-core';\nimport { QueryScopes } from '../sql';\nimport { Query } from '../query/query';\nimport { RawSQL } from '../sql/rawSql';\nimport {\n _queryDelete,\n _queryUpdate,\n DeleteArgs,\n DeleteResult,\n UpdateArg,\n} from './index';\n\nexport type SoftDeleteOption<Shape extends QueryColumns> = true | keyof Shape;\n\nexport function enableSoftDelete(\n q: Query,\n table: string | undefined,\n shape: QueryColumnsInit,\n softDelete: true | PropertyKey,\n scopes: QueryScopes,\n) {\n const column = softDelete === true ? 'deletedAt' : softDelete;\n\n if (!shape[column as string]) {\n throw new Error(\n `Table ${table} is missing ${\n column as string\n } column which is required for soft delete`,\n );\n }\n\n const scope = {\n and: [{ [column]: null }],\n };\n\n (scopes as RecordUnknown).deleted = scope;\n (q.q.scopes ??= {}).nonDeleted = scope;\n\n const _del = _softDelete(column);\n // @ts-expect-error it's ok\n q.baseQuery.delete = function (this: Query) {\n return _del.call(this.clone());\n };\n}\n\nconst nowSql = new RawSQL('now()');\n\nconst _softDelete = (column: PropertyKey) => {\n const set = { [column]: nowSql };\n return function <T extends Query>(this: T) {\n return _queryUpdate(this, set as UpdateArg<T>);\n };\n};\n\nexport interface QueryWithSoftDelete extends PickQueryResult {\n meta: QueryMetaBase<{ nonDeleted: true }>;\n}\n\n/**\n * `softDelete` configures the table to set `deletedAt` to current time instead of deleting records.\n * All queries on such table will filter out deleted records by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * deletedAt: t.timestamp().nullable(),\n * }));\n *\n * // true is for using `deletedAt` column\n * readonly softDelete = true;\n * // or provide a different column name\n * readonly softDelete = 'myDeletedAt';\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * someTable: SomeTable,\n * },\n * );\n *\n * // deleted records are ignored by default\n * const onlyNonDeleted = await db.someTable;\n * ```\n */\nexport class SoftDeleteMethods {\n /**\n * `includeDeleted` disables the default `deletedAt` filter:\n *\n * ```ts\n * const allRecords = await db.someTable.includeDeleted();\n * ```\n */\n includeDeleted<T extends QueryWithSoftDelete>(this: T): T {\n return (this as unknown as Query).unscope('nonDeleted' as never) as never;\n }\n\n /**\n * `hardDelete` deletes records bypassing the `softDelete` behavior:\n *\n * ```ts\n * await db.someTable.find(1).hardDelete();\n * ```\n */\n hardDelete<T extends QueryWithSoftDelete>(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete(\n (this as unknown as Query).clone().unscope('nonDeleted' as never),\n ) as never;\n }\n}\n","import {\n ColumnTypeBase,\n emptyObject,\n Expression,\n ExpressionData,\n isExpression,\n PickOutputType,\n PickQueryMeta,\n PickQueryShape,\n QueryColumn,\n QueryThen,\n ValExpression,\n} from 'orchid-core';\nimport { getSqlText, JoinedShapes, QueryData, ToSQLCtx } from '../sql';\nimport { columnToSql, simpleExistingColumnToSQL } from '../sql/common';\nimport {\n PickQueryColumnTypes,\n PickQueryMetaResultRelationsWindowsColumnTypes,\n Query,\n QueryMetaHasSelect,\n QueryOrExpressionBooleanOrNullResult,\n} from '../query/query';\nimport { SelectableOrExpressions } from '../common/utils';\nimport { AggregateOptions, makeFnExpression } from '../common/fn';\nimport { BooleanQueryColumn } from './aggregate';\nimport { Operators, OperatorsBoolean } from '../columns/operators';\n\n// Expression created by `Query.column('name')`, it will prefix the column with a table name from query's context.\nexport class ColumnRefExpression<T extends QueryColumn> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(value: T, public name: string) {\n super();\n this.result = { value };\n this.q = { expr: this };\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return simpleExistingColumnToSQL(\n ctx,\n this.name,\n this.result.value,\n quotedAs,\n );\n }\n}\n\nexport class RefExpression<T extends QueryColumn> extends Expression<T> {\n result: { value: T };\n\n constructor(value: T, public q: QueryData, public ref: string) {\n super();\n this.result = { value };\n q.expr = this;\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return columnToSql(ctx, this.q, this.q.shape, this.ref, quotedAs);\n }\n}\n\nexport interface OrExpression\n extends Expression<BooleanQueryColumn>,\n OperatorsBoolean {}\n\ntype OrExpressionArg = QueryOrExpressionBooleanOrNullResult | undefined;\n\nexport class OrExpression extends Expression<BooleanQueryColumn> {\n declare result: { value: BooleanQueryColumn };\n q: ExpressionData;\n\n constructor(public args: [OrExpressionArg, ...OrExpressionArg[]]) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: { values: unknown[] }, quotedAs?: string): string {\n const res: string[] = [];\n for (const arg of this.args) {\n if (arg) {\n if (isExpression(arg)) {\n const sql = arg.toSQL(ctx, quotedAs);\n if (sql) res.push(sql);\n } else {\n res.push(`(${getSqlText((arg as unknown as Query).toSQL(ctx))})`);\n }\n }\n }\n\n return `(${res.join(' OR ')})`;\n }\n}\n\nObject.assign(OrExpression.prototype, Operators.boolean);\n\ninterface QueryReturnsFnAdd<T extends PickQueryColumnTypes>\n extends QueryMetaHasSelect {\n type<C extends QueryColumn>(\n fn: (types: T['columnTypes']) => C,\n ): {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n } & C['operators'];\n}\n\ntype SetQueryReturnsFn<\n T extends PickQueryColumnTypes,\n C extends PickOutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n} & QueryReturnsFnAdd<T>;\n\nexport class ExpressionMethods {\n /**\n * `column` references a table column, this can be used in raw SQL or when building a column expression.\n * Only for referencing a column in the query's table. For referencing joined table's columns, see [ref](#ref).\n *\n * ```ts\n * await db.table.select({\n * // select `(\"table\".\"id\" = 1 OR \"table\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * q.sql<boolean>`${q.column('id')} = ${1} OR ${q.column('name')} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) => q.column('id').equals(1).or(q.column('name').equals('name')),\n * });\n * ```\n *\n * @param name - column name\n */\n column<T extends PickQueryShape, K extends keyof T['shape']>(\n this: T,\n name: K,\n ): ColumnRefExpression<T['shape'][K]> & T['shape'][K]['operators'] {\n const column = (this.shape as { [K: PropertyKey]: ColumnTypeBase })[name];\n return new ColumnRefExpression(\n column as T['shape'][K],\n name as string,\n ) as never;\n }\n\n /**\n * `ref` is similar to [column](#column), but it also allows to reference a column of joined table,\n * and other dynamically defined columns.\n *\n * ```ts\n * await db.table.join('otherTable').select({\n * // select `(\"otherTable\".\"id\" = 1 OR \"otherTable\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * q.sql<boolean>`${q.ref('otherTable.id')} = ${1} OR ${q.ref(\n * 'otherTable.name',\n * )} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) =>\n * q\n * .ref('otherTable.id')\n * .equals(1)\n * .or(q.ref('otherTable.name').equals('name')),\n * });\n * ```\n *\n * @param arg - any available column name, such as of a joined table\n */\n ref<\n T extends PickQueryMeta,\n K extends keyof T['meta']['selectable'] & string,\n >(\n this: T,\n arg: K,\n ): RefExpression<T['meta']['selectable'][K]['column']> &\n T['meta']['selectable'][K]['column']['operators'] {\n const q = (this as unknown as Query).clone();\n\n const { shape } = q.q;\n let column: QueryColumn;\n\n const index = arg.indexOf('.');\n if (index !== -1) {\n const table = arg.slice(0, index);\n const col = arg.slice(index + 1);\n if (table === (q.q.as || q.table)) {\n column = shape[col];\n } else {\n column = (q.q.joinedShapes as JoinedShapes)[table][col];\n }\n } else {\n column = shape[arg];\n }\n\n return new RefExpression(column, q.q, arg) as never;\n }\n\n val(value: unknown): ValExpression {\n return new ValExpression(value);\n }\n\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 (see [Aggregate](/guide/aggregate.html)) via third parameter.\n *\n * Use `type` method to specify a column type so that its operators such as `lt` and `gt` become available:\n *\n * ```ts\n * const q = await User.select({\n * // Produces `sqrt(\"numericColumn\") > 5`\n * sqrtIsGreaterThan5: (q) =>\n * q\n * .fn('sqrt', ['numericColumn'])\n * .type((t) => t.float())\n * .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 */\n fn<\n T extends PickQueryMetaResultRelationsWindowsColumnTypes,\n Type = unknown,\n C extends QueryColumn = QueryColumn<Type>,\n >(\n this: T,\n fn: string,\n args: SelectableOrExpressions<T>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsFn<T, C> {\n return makeFnExpression(this, emptyObject as C, fn, args, options) as never;\n }\n\n or(...args: [OrExpressionArg, ...OrExpressionArg[]]): OrExpression {\n return new OrExpression(args);\n }\n}\n","import {\n GetQueryResult,\n PickQueryMetaResultReturnTypeWithDataWindowsTable,\n PickQueryQ,\n PickQueryShapeResultSinglePrimaryKey,\n Query,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n SetQueryReturnsPluck,\n SetQueryReturnsRows,\n SetQueryReturnsVoid,\n SetQueryReturnsVoidKind,\n SetQueryTableAlias,\n WithDataBase,\n} from '../query/query';\nimport {\n AliasOrTable,\n SelectableOrExpression,\n SelectableOrExpressions,\n} from '../common/utils';\nimport {\n OrderTsQueryConfig,\n SelectItem,\n SelectQueryData,\n SortDir,\n toSQL,\n ToSQLOptions,\n ToSQLQuery,\n TruncateQueryData,\n} from '../sql';\nimport { pushQueryArray, pushQueryValue } from '../query/queryUtils';\nimport { Then } from './then';\nimport { AggregateMethods } from './aggregate';\nimport { addParserForSelectItem, Select } from './select';\nimport { FromMethods, FromQuerySelf } from './from';\nimport { Join, OnMethods } from './join/join';\nimport { WithMethods } from './with';\nimport { Union } from './union';\nimport { JsonMethods } from './json';\nimport { Create } from './create';\nimport { Update } from './update';\nimport { Delete } from './delete';\nimport { Transaction } from './transaction';\nimport { For } from './for';\nimport {\n _queryWhere,\n _queryWhereSql,\n QueryMetaHasWhere,\n Where,\n WhereArgs,\n WhereResult,\n} 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 { SqlMethod } from './sql';\nimport {\n applyMixins,\n EmptyObject,\n Expression,\n PickQueryMeta,\n PickQueryMetaResult,\n PickQueryMetaResultReturnType,\n PickQueryMetaShape,\n PickQueryResult,\n PickQueryResultUniqueColumns,\n PickQueryTableMetaResult,\n QueryColumns,\n QueryMetaBase,\n QueryReturnType,\n QueryThen,\n RecordUnknown,\n Sql,\n SQLQueryArgs,\n} from 'orchid-core';\nimport { AsMethods } from './as';\nimport { QueryBase } from '../query/queryBase';\nimport { OrchidOrmInternalError } from '../errors';\nimport { TransformMethods } from './transform';\nimport { QueryMap } from './map';\nimport { sqlQueryArgsToExpression } from '../sql/rawSql';\nimport { ScopeMethods } from './scope';\nimport { SoftDeleteMethods } from './softDelete';\nimport { queryWrap } from './queryMethods.utils';\nimport { ExpressionMethods } from './expressions';\nimport { _queryNone } from './none';\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 interface WindowArg<T extends OrderArgSelf> {\n [K: string]: WindowArgDeclaration<T> | Expression;\n}\n\n// SQL window options to specify partitionBy and order of the window\nexport interface WindowArgDeclaration<T extends OrderArgSelf = OrderArgSelf> {\n partitionBy?: SelectableOrExpression<T> | SelectableOrExpressions<T>;\n order?: OrderArg<T>;\n}\n\n// add new windows to a query\ntype WindowResult<T, W extends RecordUnknown> = T & {\n windows: { [K in keyof W]: true };\n};\n\nexport type OrderArgSelf = PickQueryMetaResult;\n\nexport type OrderArg<T extends OrderArgSelf> =\n | OrderArgKey<T>\n | OrderArgTsQuery<T>\n | {\n [K in OrderArgKey<T> | OrderArgTsQuery<T>]?: K extends OrderArgTsQuery<T>\n ? OrderTsQueryConfig\n : SortDir;\n }\n | Expression;\n\nexport type OrderArgs<T extends OrderArgSelf> = OrderArg<T>[];\n\ntype OrderArgTsQuery<T extends OrderArgSelf> =\n | string\n | undefined extends T['meta']['tsQuery']\n ? never\n : Exclude<T['meta']['tsQuery'], undefined>;\n\ntype OrderArgKey<T extends OrderArgSelf> =\n | keyof T['meta']['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\nexport type GroupArgs<T extends PickQueryResult> = (\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 | Expression\n)[];\n\ninterface QueryHelper<\n T extends PickQueryMetaShape,\n Args extends unknown[],\n Result,\n> {\n <\n Q extends {\n returnType: QueryReturnType;\n meta: QueryMetaBase & {\n selectable: Omit<\n T['meta']['selectable'],\n `${AliasOrTable<T>}.${Extract<keyof T['shape'], string>}`\n >;\n };\n result: QueryColumns;\n windows: EmptyObject;\n withData: WithDataBase;\n },\n >(\n q: Q,\n ...args: Args\n ): Result extends Query ? MergeQuery<Q, Result> : Result;\n\n result: Result;\n}\n\n// Get result of query helper, for https://github.com/romeerez/orchid-orm/issues/215\nexport type QueryHelperResult<\n T extends QueryHelper<Query, unknown[], unknown>,\n> = T['result'];\n\ntype NarrowTypeResult<T extends PickQueryMetaResultReturnType, Narrow> = {\n [K in keyof T['result']]: K extends keyof Narrow\n ? {\n [P in keyof T['result'][K]]: P extends 'outputType'\n ? Narrow[K] extends T['result'][K]['outputType']\n ? Narrow[K]\n : `narrowType() error: passed type does not exist in '${K &\n string}'s type union`\n : T['result'][K][P];\n }\n : T['result'][K];\n};\n\nexport interface QueryMethods<ColumnTypes>\n extends AsMethods,\n AggregateMethods,\n Select,\n FromMethods,\n Join,\n WithMethods,\n Union,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n SqlMethod<ColumnTypes>,\n TransformMethods,\n QueryMap,\n ScopeMethods,\n SoftDeleteMethods,\n ExpressionMethods {}\n\nexport type WrapQueryArg = FromQuerySelf;\n\nexport const _queryAll = <T extends Query>(q: T): SetQueryReturnsAll<T> => {\n q.q.returnType = 'all';\n q.q.all = true;\n return q as never;\n};\n\nexport const _queryTake = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsOne<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'oneOrThrow';\n return q as never;\n};\n\nexport const _queryTakeOptional = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsOneOptional<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'one';\n return q as never;\n};\n\nexport const _queryExec = <T extends Query>(q: T) => {\n q.q.returnType = 'void';\n return q as never;\n};\n\nexport const _queryFindBy = <T extends QueryBase>(\n q: T,\n args: WhereArgs<T>,\n): SetQueryReturnsOne<WhereResult<T>> => {\n return _queryTake(_queryWhere(q, args));\n};\n\nexport const _queryFindByOptional = <T extends QueryBase>(\n q: T,\n args: WhereArgs<T>,\n): SetQueryReturnsOneOptional<WhereResult<T>> => {\n return _queryTakeOptional(_queryWhere(q, args));\n};\n\nexport const _queryRows = <T extends Query>(q: T): SetQueryReturnsRows<T> => {\n q.q.returnType = 'rows';\n return q as never;\n};\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 PickQueryResult>(this: T): SetQueryReturnsAll<T> {\n return _queryAll((this as unknown as Query).clone()) as never;\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 PickQueryResult>(this: T): SetQueryReturnsOne<T> {\n return _queryTake((this as unknown as Query).clone()) as never;\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 PickQueryResult>(\n this: T,\n ): SetQueryReturnsOneOptional<T> {\n return _queryTakeOptional((this as unknown as Query).clone()) as never;\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 PickQueryResult>(this: T): SetQueryReturnsRows<T> {\n return _queryRows((this as unknown as Query).clone()) as never;\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 PickQueryMeta, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n const q = (this as unknown as Query).clone();\n q.q.returnType = 'pluck';\n (q.q as SelectQueryData).select = [select as SelectItem];\n addParserForSelectItem(q as never, q.q.as || q.table, 'pluck', select);\n return q as never;\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>(this: T): SetQueryReturnsVoid<T> {\n return _queryExec((this as unknown as Query).clone()) as never;\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: ToSQLQuery, 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 SQL expressions to place it to `DISTINCT ON (...)`:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // Distinct on the name and raw SQL\n * db.table.distinct('name', sql`raw sql`).select('id', 'name');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n distinct<T extends PickQueryMeta>(\n this: T,\n ...columns: SelectableOrExpressions<T>\n ): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'distinct',\n columns as string[],\n ) as never;\n }\n\n /**\n * Finds a single record by the primary key (id), throws [NotFoundError](/guide/error-handling.html) if not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType = await db.table.find(1);\n * ```\n *\n * @param value - primary key value to find by\n */\n find<T extends PickQueryShapeResultSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n const q = (this as unknown as Query).clone();\n\n if (value === null || value === undefined) {\n throw new OrchidOrmInternalError(\n q,\n `${value} is not allowed in the find method`,\n );\n }\n\n return _queryTake(\n _queryWhere(q, [\n {\n [q.internal.singlePrimaryKey]: value,\n } as never,\n ]),\n ) as never;\n }\n\n /**\n * Finds a single record with a given SQL, throws {@link NotFoundError} if not found:\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySql<T extends PickQueryResult>(\n this: T,\n ...args: SQLQueryArgs\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n const q = (this as unknown as Query).clone();\n return _queryTake(_queryWhereSql(q, args)) as never;\n }\n\n /**\n * Finds a single record by the primary key (id), returns `undefined` when not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.find(123);\n * ```\n *\n * @param value - primary key value to find by, or a raw SQL\n */\n findOptional<T extends PickQueryShapeResultSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryTakeOptional((this as unknown as Query).find(value)) as never;\n }\n\n /**\n * Finds a single record with a given SQL.\n * Returns `undefined` when not found.\n *\n * ```ts\n * await db.user.find`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySqlOptional<T extends PickQueryResult>(\n this: T,\n ...args: SQLQueryArgs\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryTakeOptional(\n (this as unknown as Query).findBySql(...args),\n ) as never;\n }\n\n /**\n * Finds a single unique record, throws [NotFoundError](/guide/error-handling.html) if not found.\n * It accepts values of primary keys or unique indexes defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).take()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findBy({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys and unique indexes in the table\n */\n findBy<T extends PickQueryResultUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): SetQueryReturnsOne<T> & QueryMetaHasWhere {\n return _queryFindBy((this as unknown as Query).clone(), [\n uniqueColumnValues,\n ] as never) as never;\n }\n\n /**\n * Finds a single unique record, returns `undefined` if not found.\n * It accepts values of primary keys or unique indexes defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).takeOptional()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findByOptional({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys and unique indexes in the table\n */\n findByOptional<T extends PickQueryResultUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): SetQueryReturnsOneOptional<T> & QueryMetaHasWhere {\n return _queryFindByOptional((this as unknown as Query).clone(), [\n uniqueColumnValues,\n ] as never) as never;\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>(this: T, schema: string): T {\n const q = (this as unknown as Query).clone();\n q.q.schema = schema;\n return q as T;\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 = db.product\n * .select('category')\n * .selectSum('price', { as: 'sumPrice' })\n * .group('category');\n * ```\n *\n * Also, it's possible to group by a selected value:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const results = db.product\n * .select({\n * month: sql`extract(month from \"createdAt\")`.type((t) =>\n * // month is returned as string, parse it to int\n * t.string().parse(parseInt),\n * ),\n * })\n * .selectSum('price', { as: 'sumPrice' })\n * // group by month extracted from \"createdAt\"\n * .group('month');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n group<T extends PickQueryResult>(this: T, ...columns: GroupArgs<T>): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'group',\n columns,\n ) as never;\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 OrderArgSelf, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return pushQueryValue(\n (this as unknown as Query).clone(),\n 'window',\n arg,\n ) as never;\n }\n\n wrap<\n T extends PickQueryTableMetaResult,\n Q extends WrapQueryArg,\n As extends string = 't',\n >(this: T, query: Q, as?: As): SetQueryTableAlias<Q, As> {\n return queryWrap(this, (query as unknown as Query).clone(), as) as never;\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 or an object.\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 *\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) or an object with column names and sort directions.\n */\n order<T extends OrderArgSelf>(this: T, ...args: OrderArgs<T>): T {\n return pushQueryArray(\n (this as unknown as Query).clone(),\n 'order',\n args,\n ) as never;\n }\n\n /**\n * Order by SQL expression\n *\n * Order by raw SQL expression.\n *\n * ```ts\n * db.table.orderSql`raw sql`;\n * ```\n *\n * @param args - SQL expression\n */\n orderSql<T>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValue(\n (this as unknown as Query).clone(),\n 'order',\n sqlQueryArgsToExpression(args),\n ) as never;\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>(this: T, arg: number | undefined): T {\n const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).limit = arg;\n return q as T;\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 const q = (this as unknown as Query).clone();\n (q.q as SelectQueryData).offset = arg;\n return q as T;\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 PickQueryMeta>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): SetQueryReturnsVoidKind<T, 'truncate'> {\n const query = (this as unknown as Query).clone();\n const q = query.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 _queryExec(query) as never;\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 * When it's being used in sub-selects, it will return empty arrays, `undefined`'s, or `0` for count,\n * or it will throw if the sub-query require a result:\n *\n * ```ts\n * await db.user.select({\n * // returns empty array\n * pets: (q) => q.pets.none(),\n * // returns `undefined`\n * firstPet: (q) => q.pets.none().takeOptional(),\n * // throws NotFound error\n * requriedFirstPet: (q) => q.pets.none().take(),\n * // returns `undefined`\n * firstPetName: (q) => q.pets.none().getOptional('name'),\n * // throws NotFound error\n * requiredFirstPetName: (q) => q.pets.none().get('name'),\n * // returns empty array\n * petsNames: (q) => q.pets.none().pluck('name'),\n * // returns 0\n * petsCount: (q) => q.pets.none().count(),\n * });\n * ```\n *\n * When the `none` query is being used for joins that require match, the host query will return an empty result:\n *\n * ```ts\n * // all the following queries will resolve into empty arrays\n *\n * await db.user.select({\n * pets: (q) => q.pets.join().none(),\n * });\n *\n * await db.user.join((q) => q.pets.none());\n *\n * await db.user.join('pets', (q) => q.none());\n * ```\n *\n * When it's being used in `leftJoin` or `fullJoin`, it implicitly adds `ON false` into the join's SQL.\n *\n * ```ts\n * // this query can return user records\n * await db.user.leftJoin('pets', (q) => q.none());\n *\n * // this query won't return user records, because of the added where condition\n * await db.user.leftJoin('pets', (q) => q.none()).where({ 'pets.name': 'Kitty' });\n * ```\n */\n none<T>(this: T): T {\n return _queryNone(this);\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<\n T extends PickQueryMetaResultReturnTypeWithDataWindowsTable<\n string | undefined\n >,\n Arg extends PickQueryMetaResultReturnTypeWithDataWindowsTable<T['table']>,\n Result,\n >(\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 never;\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 * To get the result type of query helper, use `QueryHelperResult` type:\n *\n * ```ts\n * import { QueryHelperResult } from 'orchid-orm';\n *\n * const selectHelper = db.table.makeHelper((q) => q.select('id', 'name'));\n *\n * // This type is identical to `db.table.select('id', 'name')`\n * type SelectQuery = QueryHelperResult<typeof selectHelper>;\n *\n * // Await to get result, the type is `{ id: number, name: string }[]`\n * type Result = Awaited<QueryHelperResult<typeof selectHelper>>;\n * ```\n *\n * @param fn - helper function\n */\n makeHelper<T extends PickQueryMetaShape, Args extends unknown[], Result>(\n this: T,\n fn: (q: T, ...args: Args) => Result,\n ): QueryHelper<T, Args, Result> {\n return ((query: T, ...args: Args) => {\n const q = (query as unknown as Query).clone();\n q.q.as = undefined;\n return fn(q as never, ...args);\n }) as never;\n }\n\n /**\n * Narrows a part of the query output type.\n * Use with caution, type-safety isn't guaranteed with it.\n * This is similar so using `as` keyword from TypeScript, except that it applies only to a part of the result.\n *\n * The syntax `()<{ ... }>()` is enforced by internal limitations.\n *\n * ```ts\n * const rows = db.table\n * // filter out records where the `nullableColumn` is null\n * .where({ nullableColumn: { not: null } });\n * // narrows only a specified column, the rest of result is unchanged\n * .narrowType()<{ nullableColumn: string }>()\n *\n * // the column had type `string | null`, now it is `string`\n * rows[0].nullableColumn\n *\n * // imagine that table has a enum column kind with variants 'first' | 'second'\n * // and a boolean `approved`\n * db.table\n * .where({ kind: 'first', approved: true })\n * // after applying such `where`, it's safe to narrow the type to receive the literal values\n * .narrowType()<{ kind: 'first', approved: true }>();\n * ```\n */\n narrowType<T extends PickQueryMetaResultReturnType>(\n this: T,\n ): <Narrow>() => {\n [K in keyof T]: K extends 'result'\n ? NarrowTypeResult<T, Narrow>\n : K extends 'then'\n ? QueryThen<GetQueryResult<T, NarrowTypeResult<T, Narrow>>>\n : T[K];\n } {\n return () => this as never;\n }\n}\n\napplyMixins(QueryMethods, [\n QueryBase,\n AsMethods,\n AggregateMethods,\n Select,\n FromMethods,\n Join,\n OnMethods,\n WithMethods,\n Union,\n JsonMethods,\n Create,\n Update,\n Delete,\n Transaction,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n QueryHooks,\n QueryUpsertOrCreate,\n QueryGet,\n MergeQueryMethods,\n SqlMethod,\n TransformMethods,\n QueryMap,\n ScopeMethods,\n SoftDeleteMethods,\n ExpressionMethods,\n]);\n","import {\n ColumnNameOfTable,\n EmptyObject,\n Expression,\n ForeignKeyTable,\n MaybeArray,\n QueryColumn,\n QueryColumns,\n RawSQLBase,\n} from 'orchid-core';\nimport { SearchWeight } from './sql';\nimport { sqlFn, SqlFn } from './sql/rawSql';\nimport OptionsArg = TableData.Index.OptionsArg;\n\nexport interface TableData {\n primaryKey?: TableData.PrimaryKey;\n indexes?: TableData.Index[];\n constraints?: TableData.Constraint[];\n}\n\nexport namespace TableData {\n // Used in migrations to also drop related entities if is set to CASCADE\n export type DropMode = 'CASCADE' | 'RESTRICT';\n\n export interface PrimaryKey {\n columns: string[];\n name?: string;\n }\n\n export interface ColumnIndex {\n options: Index.ColumnArg & Index.Options;\n name?: string;\n }\n\n export interface Index {\n columns: Index.ColumnOrExpressionOptions[];\n options: Index.Options;\n name?: string;\n }\n\n export interface Constraint {\n name?: string;\n check?: Check;\n identity?: Identity;\n references?: References;\n dropMode?: TableData.DropMode;\n }\n\n export type Check = RawSQLBase;\n\n export interface ColumnReferences {\n fnOrTable: TableData.References.FnOrTable;\n foreignColumns: string[];\n options?: References.Options;\n }\n\n export interface References extends ColumnReferences {\n columns: string[];\n }\n\n export interface Identity extends SequenceBaseOptions {\n always?: boolean;\n }\n\n interface SequenceBaseOptions {\n increment?: number;\n start?: number;\n min?: number;\n max?: number;\n cache?: number;\n cycle?: boolean;\n }\n\n export interface SequenceOptions extends SequenceBaseOptions {\n dataType?: 'smallint' | 'integer' | 'bigint';\n ownedBy?: string;\n }\n\n export namespace Index {\n // config for a single column or an expression in the index\n export interface ColumnOptions {\n collate?: string;\n opclass?: string;\n order?: string;\n // weight for a column in a search index\n weight?: SearchWeight;\n }\n\n export interface UniqueOptionsArg {\n nullsNotDistinct?: boolean;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: 'CASCADE' | 'RESTRICT';\n }\n\n export interface OptionsArg extends UniqueOptionsArg {\n unique?: boolean;\n }\n\n export interface TsVectorArg extends OptionsArg, TsVectorOptions {}\n\n // all possible index options, excluding column/expression options\n export type Options = TsVectorArg;\n\n export interface UniqueColumnArg extends ColumnOptions, UniqueOptionsArg {\n expression?: string;\n }\n\n // argument of column's index method, may have an expression\n export interface ColumnArg extends UniqueColumnArg {\n unique?: boolean;\n }\n\n interface TsVectorOptions {\n // set the language for the tsVector, 'english' is a default\n language?: string;\n // set the column with language for the tsVector\n languageColumn?: string;\n // create a tsVector index\n tsVector?: boolean;\n }\n\n export interface TsVectorColumnArg extends ColumnArg, TsVectorOptions {}\n\n // for a table index that has an expression in the list\n export interface ExpressionOptions extends ColumnOptions {\n expression: string;\n }\n\n // for a table index that has a column in the list\n export interface ColumnOptionsForColumn<Column extends PropertyKey>\n extends ColumnOptions {\n column: Column;\n }\n\n // for a table index, it can have either a column or an expression in its list\n export type ColumnOrExpressionOptions<Column extends PropertyKey = string> =\n ColumnOptionsForColumn<Column> | ExpressionOptions;\n }\n\n export namespace References {\n export type FnOrTable = (() => ForeignKeyTable) | string;\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 */\n export type Match = '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 */\n export type Action =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\n // Used in migrations to make foreign key SQL\n export interface Options {\n name?: string;\n match?: Match;\n onUpdate?: Action;\n onDelete?: Action;\n dropMode?: TableData.DropMode;\n }\n }\n}\n\nexport type TableDataInput = {\n primaryKey?: TableData.PrimaryKey;\n index?: TableData.Index;\n constraint?: TableData.Constraint;\n};\n\nexport interface TableDataItem {\n columns: unknown;\n name: unknown;\n}\n\nexport interface UniqueTableDataItem<\n Shape extends QueryColumns = QueryColumns,\n> {\n columns: (keyof Shape)[];\n name: string;\n}\n\nexport interface TableDataMethods<Key extends PropertyKey> {\n primaryKey<Columns extends [Key, ...Key[]], Name extends string>(\n columns: Columns,\n name?: Name,\n ): {\n columns: Columns;\n name: string extends Name ? never : Name;\n };\n\n unique<\n Columns extends [\n Key | TableData.Index.ColumnOrExpressionOptions<Key>,\n ...(Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ],\n Name extends string,\n >(\n columns: Columns,\n ...args:\n | [options?: TableData.Index.UniqueOptionsArg]\n | [name?: Name, options?: TableData.Index.UniqueOptionsArg]\n ): {\n columns: Columns extends (\n | Key\n | TableData.Index.ColumnOptionsForColumn<Key>\n )[]\n ? {\n [I in keyof Columns]: 'column' extends keyof Columns[I]\n ? Columns[I]['column']\n : Columns[I];\n }\n : never;\n name: string extends Name ? never : Name;\n };\n\n index(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ...args:\n | [options?: TableData.Index.OptionsArg]\n | [name?: string, options?: TableData.Index.OptionsArg]\n ): TableDataItem;\n\n searchIndex(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ...args:\n | [options?: TableData.Index.TsVectorArg]\n | [name?: string, options?: TableData.Index.TsVectorArg]\n ): TableDataItem;\n\n foreignKey<\n ForeignTable extends (() => ForeignKeyTable) | string,\n ForeignColumns extends ForeignTable extends () => ForeignKeyTable\n ? [\n ColumnNameOfTable<ReturnType<ForeignTable>>,\n ...ColumnNameOfTable<ReturnType<ForeignTable>>[],\n ]\n : [string, ...string[]],\n >(\n columns: [string, ...string[]],\n fnOrTable: ForeignTable,\n foreignColumns: ForeignColumns,\n options?: TableData.References.Options,\n ): TableDataItem;\n\n check(check: RawSQLBase, name?: string): TableDataItem;\n\n sql: SqlFn;\n}\n\nexport type TableDataItemsUniqueColumns<\n Shape extends QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? ItemUniqueColumns<Shape, T>\n : T extends UniqueTableDataItem<Shape>[]\n ? {\n [Item in T[number] as PropertyKey]: ItemUniqueColumns<Shape, Item>;\n }[PropertyKey]\n : never;\n\ntype ItemUniqueColumns<\n Shape extends QueryColumns,\n T extends UniqueTableDataItem<Shape>,\n> = {\n [Column in T['columns'][number]]: UniqueQueryTypeOrExpression<\n Shape[Column]['queryType']\n >;\n};\n\nexport type TableDataItemsUniqueColumnTuples<\n Shape extends QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? T['columns']\n : T extends UniqueTableDataItem<Shape>[]\n ? T[number]['columns']\n : never;\n\nexport type UniqueQueryTypeOrExpression<T> =\n | T\n | Expression<QueryColumn<T, EmptyObject>>;\n\nexport type TableDataItemsUniqueConstraints<\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem\n ? T['name']\n : T extends UniqueTableDataItem[]\n ? T[number]['name']\n : never;\n\nexport type TableDataFn<Shape, Data extends MaybeArray<TableDataItem>> = (\n t: TableDataMethods<keyof Shape>,\n) => Data;\n\nconst makeIndex = (\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n first?: string | TableData.Index.OptionsArg,\n second?: TableData.Index.OptionsArg,\n): {\n index: {\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[];\n options: TableData.Index.Options;\n unique?: boolean;\n name?: string;\n };\n} => {\n if (typeof first === 'string') {\n const options: OptionsArg = second ?? {};\n return {\n index: { columns, options, name: first },\n };\n } else {\n const options: OptionsArg = first ?? {};\n return {\n index: { columns, options },\n };\n }\n};\n\nexport const tableDataMethods: TableDataMethods<string> = {\n primaryKey(columns, name) {\n return { primaryKey: { columns, name } } as never;\n },\n unique(columns, ...[first, second]) {\n const input = makeIndex(columns, first, second);\n input.index.options.unique = true;\n return input as never;\n },\n index: makeIndex as never,\n searchIndex(columns, ...[first, second]) {\n const input = makeIndex(columns, first, second);\n input.index.options.using ??= 'gin';\n input.index.options.tsVector = true;\n return input as never;\n },\n foreignKey(columns, fnOrTable, foreignColumns, options) {\n return {\n constraint: {\n name: options?.name,\n references: { columns, fnOrTable, foreignColumns, options },\n },\n } as never;\n },\n check(check, name) {\n return { constraint: { check, name } } as never;\n },\n sql: sqlFn,\n};\n\nexport const parseTableData = (\n dataFn?: TableDataFn<unknown, any>,\n): TableData => {\n const tableData: TableData = {};\n if (dataFn) {\n const input = dataFn(tableDataMethods);\n if (Array.isArray(input)) {\n for (const item of input) {\n parseTableDataInput(tableData, item);\n }\n } else {\n parseTableDataInput(tableData, input);\n }\n }\n return tableData;\n};\n\nexport const parseTableDataInput = (\n tableData: TableData,\n item: TableDataInput,\n) => {\n if (item.primaryKey) {\n tableData.primaryKey = item.primaryKey;\n } else if (item.index) {\n const index = item.index as TableData.Index;\n for (let i = index.columns.length - 1; i >= 0; i--) {\n if (typeof index.columns[i] === 'string') {\n index.columns[i] = {\n column: index.columns[i] as unknown as string,\n };\n }\n }\n (tableData.indexes ??= []).push(item.index);\n } else if (item.constraint) {\n (tableData.constraints ??= []).push(item.constraint);\n if (item.constraint.references?.options?.dropMode) {\n item.constraint.dropMode = item.constraint.references.options.dropMode;\n }\n }\n};\n","import {\n DbDomainArg,\n DbExtension,\n Query,\n QueryInternal,\n SelectableFromShape,\n} from './query';\nimport {\n handleResult,\n logParamToLogObject,\n QueryLogOptions,\n QueryMethods,\n} from '../queryMethods';\nimport { QueryData, QueryScopes, SelectQueryData, ToSQLOptions } from '../sql';\nimport {\n Adapter,\n AdapterOptions,\n QueryArraysResult,\n QueryResult,\n} from '../adapter';\nimport {\n DefaultColumnTypes,\n getColumnTypes,\n makeColumnTypes,\n} from '../columns';\nimport { QueryError, QueryErrorName } from '../errors';\nimport {\n applyMixins,\n ColumnSchemaConfig,\n ColumnShapeOutput,\n ColumnsParsers,\n ColumnTypeBase,\n CoreQueryScopes,\n DbBase,\n DefaultSelectColumns,\n EmptyObject,\n emptyObject,\n isRawSQL,\n MaybeArray,\n pushOrNewArray,\n QueryCatch,\n QueryColumns,\n QueryColumnsInit,\n QueryResultRow,\n QueryThen,\n RecordString,\n RecordUnknown,\n snakeCaseKey,\n Sql,\n SQLQueryArgs,\n TemplateLiteralArgs,\n toSnakeCase,\n TransactionState,\n} from 'orchid-core';\nimport { inspect } from 'node:util';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { templateLiteralToSQL } from '../sql/rawSql';\nimport { RelationsBase } from '../relations';\nimport { ScopeArgumentQuery } from '../queryMethods/scope';\nimport { QueryBase } from './queryBase';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../columns/defaultSchemaConfig';\nimport { enableSoftDelete, SoftDeleteOption } from '../queryMethods/softDelete';\nimport {\n parseTableData,\n TableData,\n TableDataFn,\n TableDataItem,\n TableDataItemsUniqueColumnTuples,\n TableDataItemsUniqueColumns,\n TableDataItemsUniqueConstraints,\n UniqueQueryTypeOrExpression,\n} from '../tableData';\n\nexport type ShapeColumnPrimaryKeys<Shape extends QueryColumnsInit> = {\n [K in {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? K\n : never;\n }[keyof Shape]]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n};\n\nexport type ShapeUniqueColumns<Shape extends QueryColumnsInit> = {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? {\n [C in K]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n }\n : never;\n}[keyof Shape];\n\nexport type UniqueConstraints<Shape extends QueryColumnsInit> =\n | {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? string extends Shape[K]['data']['primaryKey']\n ? never\n : Shape[K]['data']['primaryKey']\n : Shape[K]['data']['unique'] extends string\n ? string extends Shape[K]['data']['unique']\n ? never\n : Shape[K]['data']['unique']\n : never;\n }[keyof Shape];\n\nexport type NoPrimaryKeyOption = 'error' | 'warning' | 'ignore';\n\n// Options that are also available in `orchidORM` of the ORM\nexport interface DbSharedOptions extends QueryLogOptions {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n extensions?: (string | RecordString)[];\n domains?: {\n [K: string]: DbDomainArg<DefaultColumnTypes<DefaultSchemaConfig>>;\n };\n}\n\nexport type DbOptions<SchemaConfig extends ColumnSchemaConfig, ColumnTypes> = (\n | { adapter: Adapter }\n | Omit<AdapterOptions, 'log'>\n) &\n DbSharedOptions & {\n schemaConfig?: SchemaConfig;\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?:\n | ColumnTypes\n | ((t: DefaultColumnTypes<SchemaConfig>) => ColumnTypes);\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\n// Options of `createDb`.\nexport interface DbTableOptions<\n Table extends string | undefined,\n Shape extends QueryColumns,\n> extends QueryLogOptions {\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 /**\n * See {@link ScopeMethods}\n */\n scopes?: DbTableOptionScopes<Table, Shape>;\n /**\n * See {@link SoftDeleteMethods}\n */\n softDelete?: SoftDeleteOption<Shape>;\n // table comment, for migrations generator\n comment?: string;\n}\n\n/**\n * See {@link ScopeMethods}\n */\nexport type DbTableOptionScopes<\n Table extends string | undefined,\n Shape extends QueryColumns,\n Keys extends string = string,\n> = { [K in Keys]: (q: ScopeArgumentQuery<Table, Shape>) => QueryBase };\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 QueryColumnsInit> = {\n [K in DefaultSelectColumns<Shape>[number]]: Shape[K]['outputType'];\n}[];\n\nexport interface Db<\n Table extends string | undefined = undefined,\n Shape extends QueryColumnsInit = QueryColumnsInit,\n PrimaryKeys = never,\n // union of records { column name: query input type }\n UniqueColumns = never,\n // union of tuples of column names\n UniqueColumnTuples = never,\n // union of primary keys and unique index names\n UniqueConstraints = never,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n ShapeWithComputed extends QueryColumnsInit = Shape,\n Scopes extends CoreQueryScopes | undefined = EmptyObject,\n> extends DbBase<Adapter, Table, Shape, ColumnTypes, ShapeWithComputed>,\n QueryMethods<ColumnTypes>,\n QueryBase {\n result: Pick<Shape, DefaultSelectColumns<Shape>[number]>; // Pick is optimal\n queryBuilder: Db;\n returnType: Query['returnType'];\n then: QueryThen<QueryDefaultReturnData<Shape>>;\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 as unknown extends Shape[K]['data']['default']\n ? never\n : K]: true;\n };\n scopes: { [K in keyof Scopes]: true };\n selectable: SelectableFromShape<ShapeWithComputed, Table>;\n };\n internal: QueryInternal<\n {\n [K in keyof PrimaryKeys]: (\n keyof PrimaryKeys extends K ? never : keyof PrimaryKeys\n ) extends never\n ? PrimaryKeys[K]\n : never;\n }[keyof PrimaryKeys],\n PrimaryKeys | UniqueColumns,\n | {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? K\n : never;\n }[keyof Shape]\n | keyof PrimaryKeys,\n UniqueColumnTuples,\n UniqueConstraints\n >;\n catch: QueryCatch;\n}\n\nexport const anyShape = {} as QueryColumnsInit;\n\nexport class Db<\n Table extends string | undefined = undefined,\n Shape extends QueryColumnsInit = QueryColumnsInit,\n PrimaryKeys = never,\n UniqueColumns = never,\n UniqueColumnTuples = never,\n UniqueConstraints = never,\n Relations extends RelationsBase = EmptyObject,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n ShapeWithComputed extends QueryColumnsInit = 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<Table, ShapeWithComputed>,\n tableData: TableData = emptyObject,\n ) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const { softDelete } = options;\n const scopes = (\n options.scopes || softDelete ? {} : emptyObject\n ) as QueryScopes;\n\n this.internal = {\n transactionStorage,\n scopes,\n snakeCase: options.snakeCase,\n noPrimaryKey: options.noPrimaryKey === 'ignore',\n comment: options.comment,\n tableData,\n } as QueryInternal;\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] as unknown as ColumnTypeBase;\n column.data.key = key;\n\n if (column.parseFn) {\n hasParsers = true;\n parsers[key] = column.parseFn;\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 const { modifyQuery: mq } = column.data;\n if (mq) {\n modifyQuery = pushOrNewArray(modifyQuery, (q: Query) => mq(q, column));\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] as unknown as ColumnTypeBase;\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 QueryColumnsInit,\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 schema: options?.schema,\n } as QueryData;\n\n let shapeHasPrimaryKey: boolean | undefined;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n shapeHasPrimaryKey = true;\n\n if (this.internal.singlePrimaryKey) {\n this.internal.singlePrimaryKey = undefined as never;\n break;\n }\n\n this.internal.singlePrimaryKey = key as never;\n }\n }\n\n if (\n !shapeHasPrimaryKey &&\n !tableData.primaryKey &&\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 if (modifyQuery) {\n for (const cb of modifyQuery) {\n cb(this);\n }\n }\n\n this.error = class extends QueryError {\n constructor(message?: string) {\n super(self, message);\n }\n };\n\n if (options.scopes) {\n for (const key in options.scopes) {\n const q = options.scopes[key](this).q as SelectQueryData;\n\n (scopes as RecordUnknown)[key] = {\n and: q.and,\n or: q.or,\n };\n }\n\n if (scopes.default) {\n this.q.scopes = { default: scopes.default };\n }\n }\n\n if (softDelete) {\n enableSoftDelete(this, table, shape, softDelete, scopes);\n }\n }\n\n [inspect.custom]() {\n return `Query<${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;\n\n// Function to build a new table instance.\nexport type DbTableConstructor<ColumnTypes> = <\n Table extends string,\n Shape extends QueryColumnsInit,\n Data extends MaybeArray<TableDataItem>,\n Options extends DbTableOptions<Table, Shape>,\n>(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n tableData?: TableDataFn<Shape, Data>,\n options?: Options,\n) => Db<\n Table,\n Shape,\n keyof ShapeColumnPrimaryKeys<Shape> extends never\n ? never\n : ShapeColumnPrimaryKeys<Shape>,\n ShapeUniqueColumns<Shape> | TableDataItemsUniqueColumns<Shape, Data>,\n TableDataItemsUniqueColumnTuples<Shape, Data>,\n UniqueConstraints<Shape> | TableDataItemsUniqueConstraints<Data>,\n EmptyObject,\n ColumnTypes,\n Shape,\n MapTableScopesOption<Options['scopes'], Options['softDelete']>\n>;\n\nexport type MapTableScopesOption<\n Scopes extends CoreQueryScopes | undefined,\n SoftDelete extends true | PropertyKey | undefined,\n> = {\n [K in\n | keyof Scopes\n | (SoftDelete extends true | PropertyKey ? 'nonDeleted' : never)]: unknown;\n};\n\nexport interface DbResult<ColumnTypes>\n extends Db<\n string,\n never,\n never,\n never,\n never,\n never,\n EmptyObject,\n ColumnTypes\n >,\n DbTableConstructor<ColumnTypes> {\n adapter: Adapter;\n close: Adapter['close'];\n}\n{\n}\n\n/**\n * If you'd like to use the query builder of OrchidORM as a standalone tool, install `pqb` package and use `createDb` to initialize it.\n *\n * As `Orchid ORM` focuses on ORM usage, docs examples mostly demonstrates how to work with ORM-defined tables,\n * but everything that's not related to table relations should also work with `pqb` query builder on its own.\n *\n * It is accepting the same options as `orchidORM` + options of `createBaseTable`:\n *\n * ```ts\n * import { createDb } from 'orchid-orm';\n *\n * import { zodSchemaConfig } from 'orchid-orm-schema-to-zod';\n * // or\n * import { SchemaConfig } from 'orchid-orm-valibot';\n *\n * const db = createDb({\n * // db connection options\n * databaseURL: process.env.DATABASE_URL,\n * log: true,\n *\n * // columns in db are in snake case:\n * snakeCase: true,\n *\n * // override default SQL for timestamp, see `nowSQL` above\n * nowSQL: `now() AT TIME ZONE 'UTC'`,\n *\n * // optional, but recommended: makes zod schemas for your tables\n * schemaConfig: zodSchemaConfig,\n * // or\n * schemaConfig: valibotSchemaConfig,\n *\n * // override column types:\n * columnTypes: (t) => ({\n * // by default timestamp is returned as a string, override to a number\n * timestamp: () => t.timestamp().asNumber(),\n * }),\n * });\n * ```\n *\n * After `db` is defined, construct queryable tables in such way:\n *\n * ```ts\n * export const User = db('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * password: t.varchar(100),\n * age: t.integer().nullable(),\n * ...t.timestamps(),\n * }));\n * ```\n *\n * Now the `User` can be used for making type-safe queries:\n *\n * ```ts\n * const users = await User.select('id', 'name') // only known columns are allowed\n * .where({ age: { gte: 20 } }) // gte is available only on the numeric field, and the only number is allowed\n * .order({ createdAt: 'DESC' }) // type safe as well\n * .limit(10);\n *\n * // users array has a proper type of Array<{ id: number, name: string }>\n * ```\n *\n * The optional third argument is for table options:\n *\n * ```ts\n * const Table = db('table', (t) => ({ ...columns }), {\n * // provide this value if the table belongs to a specific database schema:\n * schema: 'customTableSchema',\n * // override `log` option of `createDb`:\n * log: true, // boolean or object described `createdDb` section\n * logger: { ... }, // override logger\n * noPrimaryKey: 'ignore', // override noPrimaryKey\n * snakeCase: true, // override snakeCase\n * })\n * ```\n */\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n logger,\n snakeCase,\n nowSQL,\n schemaConfig = defaultSchemaConfig as unknown as SchemaConfig,\n columnTypes: ctOrFn = makeColumnTypes(schemaConfig) as unknown as ColumnTypes,\n ...options\n}: DbOptions<SchemaConfig, 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 ? (\n ctOrFn as unknown as (\n t: DefaultColumnTypes<SchemaConfig>,\n ) => ColumnTypes\n )(makeColumnTypes(schemaConfig))\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 = _initQueryBuilder(\n adapter,\n ct,\n transactionStorage,\n commonOptions,\n options,\n );\n\n const tableConstructor: DbTableConstructor<ColumnTypes> = (\n table,\n shape,\n dataFn,\n options,\n ) =>\n new Db(\n adapter,\n qb as never,\n table,\n typeof shape === 'function'\n ? getColumnTypes(ct, shape, nowSQL, options?.language)\n : shape,\n ct,\n transactionStorage,\n { ...commonOptions, ...options },\n parseTableData(dataFn),\n ) as never;\n\n const db = Object.assign(tableConstructor, qb, {\n adapter,\n 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 RecordUnknown)[name] =\n Db.prototype[name as keyof typeof Db.prototype];\n }\n\n return db as never;\n};\n\nexport const _initQueryBuilder = (\n adapter: Adapter,\n columnTypes: unknown,\n transactionStorage: AsyncLocalStorage<TransactionState>,\n commonOptions: DbTableOptions<undefined, QueryColumns>,\n options: DbSharedOptions,\n): Db => {\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n transactionStorage,\n commonOptions,\n );\n\n if (options.extensions) {\n const arr: DbExtension[] = [];\n for (const x of options.extensions) {\n if (typeof x === 'string') {\n arr.push({ name: x });\n } else {\n for (const key in x) {\n arr.push({ name: key, version: x[key] });\n }\n }\n }\n qb.internal.extensions = arr;\n }\n\n qb.internal.domains = options.domains;\n\n return (qb.queryBuilder = qb as never);\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`.\ninterface 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`.\ninterface 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 {\n ColumnTypeBase,\n Expression,\n PickQueryTableMetaShape,\n QueryColumns,\n} from 'orchid-core';\n\n// Type of argument for computed columns, each value is a function returning an Expression.\nexport interface ComputedColumnsBase<T extends PickQueryTableMetaShape> {\n [K: string]: (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 PickQueryTableMetaShape,\n Computed extends ComputedColumnsBase<T>,\n Shape extends QueryColumns = {\n [K in keyof Computed]: ReturnType<Computed[K]>['result']['value'];\n },\n> = {\n [K in keyof T]: K extends 'shape'\n ? T['shape'] & Shape\n : K extends 'meta'\n ? T['meta'] & {\n selectable: SelectableFromShape<Shape, T['table']>;\n }\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 PickQueryTableMetaShape,\n Computed extends ComputedColumnsBase<T>,\n>(q: T, computed: Computed): QueryWithComputed<T, Computed> {\n const { shape } = q as unknown as Query;\n for (const key in computed) {\n const expr = computed[key](q);\n (shape as QueryColumns)[key] = expr.result.value as never;\n (expr.result.value as ColumnTypeBase).data.computed = expr;\n }\n\n return q as never;\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { ColumnInfoQueryData } from '../sql';\nimport { PickQueryMetaShape, QueryColumn, 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 GetColumnInfo} object or a Record with keys for column names and ColumnInfo objects as values.\n **/\nexport type SetQueryReturnsColumnInfo<\n T extends PickQueryMetaShape,\n Column extends keyof T['shape'] | undefined,\n Result = Column extends keyof T['shape']\n ? GetColumnInfo\n : { [K in keyof T['shape']]: GetColumnInfo },\n> =\n // Omit is optimal\n Omit<SetQueryKind<T, 'columnInfo'>, 'result' | 'returnType' | 'then'> & {\n result: { value: QueryColumn<Result> };\n returnType: 'value';\n then: QueryThen<Result>;\n };\n\n// column info pulled from a database\nexport type GetColumnInfo = {\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): GetColumnInfo => {\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\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 * import { getColumnInfo } from 'orchid-orm';\n *\n * // columnInfo has type Record<string, ColumnInfo>, where string is name of columns\n * const columnInfo = await getColumnInfo(db.table);\n *\n * // singleColumnInfo has the type ColumnInfo\n * const singleColumnInfo = await getColumnInfo(db.table, 'name');\n * ```\n *\n * @param column - optional: select info for only a single column if provided, or for all table columns if not\n */\nexport function getColumnInfo<\n T extends PickQueryMetaShape,\n Column extends keyof T['shape'] | undefined = undefined,\n>(query: T, column?: Column): SetQueryReturnsColumnInfo<T, Column> {\n const q = (query as unknown as Query).clone();\n q.q.type = 'columnInfo';\n q.q.returnType = 'all';\n\n if (column) {\n (q.q as ColumnInfoQueryData).column = column as string;\n }\n\n q.q.handleResult = (_, _t, result) => {\n if (column) {\n return rowToColumnInfo(result.rows[0]);\n } else {\n const info: { [K: string]: GetColumnInfo } = {};\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 q as unknown as SetQueryReturnsColumnInfo<T, Column>;\n}\n","import { Query, SetQueryKind } from '../query/query';\nimport { CopyOptions } from '../sql';\nimport { PickQueryMeta, PickQueryMetaShape, PickQueryShape } from 'orchid-core';\n\n// argument of the `copy` function can accept various options\ntype CopyArg<T extends PickQueryShape> = CopyOptions<keyof T['shape']>;\n\n// Result type for the `copy` method, simply setting a query kind.\ntype CopyResult<T extends PickQueryMeta> = SetQueryKind<T, 'copy'>;\n\n/**\n * `copyTableData` is a function 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 * import { copyTableData } from 'orchid-orm';\n *\n * await copyTableData(db.table, {\n * columns: ['id', 'title', 'description'],\n * from: 'path-to-file',\n * });\n * ```\n *\n * @param arg - object with copy options\n */\nexport function copyTableData<T extends PickQueryMetaShape>(\n query: T,\n arg: CopyArg<T>,\n): CopyResult<T> {\n const q = (query as unknown as Query).clone();\n Object.assign(q.q, {\n type: 'copy',\n copy: arg,\n });\n return q as never;\n}\n"],"names":["Expression","RawSQLBase","i","emptyObject","ExpressionTypeMethod","isTemplateLiteralArgs","args","ColumnTypeBase","setColumnData","pushColumnData","__spreadValues","__spreadProps","quoteObjectKey","toArray","singleQuote","addCode","hasOptions","singleQuoteArray","objectHasValues","columnDefaultArgumentToCode","columnErrorMessagesToCode","getValueKey","quoteValue","addValue","isExpression","joinTruthy","numberDataToCode","stringDataToCode","getDefaultLanguage","dateDataToCode","col","pushOrNewArrayToObject","query","table","value","returnArg","noop","require","shape","arrayDataToCode","commitSql","rollbackSql","emptyArray","result","fn","resolve","reject","trx","callWithThis","applyTransforms","setParserToQuery","q","key","isRawSQL","_a","sql","pushOrNewArray","quotedColumns","quotedAs","setDefaultNowFn","setDefaultLanguage","setCurrentColumnName","makeTimestampsHelpers","types","__objRest","setAdapterConnectRetry","performQuery","values","handleResult","isObjectEmpty","ValExpression","applyMixins","toSnakeCase","options","inspect","_b","snakeCaseKey","AsyncLocalStorage"],"mappings":"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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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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EO,MAAM,KAAM,CAAA;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;AAAA;AAAA;AAAA;AA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"}
|