metal-orm 1.0.57 → 1.0.58
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/README.md +22 -15
- package/dist/index.cjs +640 -83
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +113 -45
- package/dist/index.d.ts +113 -45
- package/dist/index.js +639 -83
- package/dist/index.js.map +1 -1
- package/package.json +69 -69
- package/src/decorators/bootstrap.ts +39 -3
- package/src/orm/entity-meta.ts +6 -3
- package/src/orm/entity.ts +81 -14
- package/src/orm/execute.ts +87 -20
- package/src/orm/lazy-batch.ts +237 -54
- package/src/orm/relations/belongs-to.ts +2 -2
- package/src/orm/relations/has-many.ts +23 -9
- package/src/orm/relations/has-one.ts +2 -2
- package/src/orm/relations/many-to-many.ts +27 -13
- package/src/orm/save-graph-types.ts +2 -2
- package/src/orm/save-graph.ts +18 -18
- package/src/query-builder/relation-conditions.ts +80 -59
- package/src/query-builder/relation-service.ts +399 -95
- package/src/query-builder/relation-types.ts +2 -2
- package/src/query-builder/select.ts +58 -40
- package/src/schema/types.ts +106 -89
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/ddl/schema-plan-executor.ts","../src/schema/table.ts","../src/schema/column-types.ts","../src/schema/relation.ts","../src/core/ast/expression-nodes.ts","../src/core/ast/expression-builders.ts","../src/core/ast/window-functions.ts","../src/core/sql/sql.ts","../src/core/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/core/ast/adapters.ts","../src/core/ast/builders.ts","../src/core/functions/function-registry.ts","../src/core/functions/definitions/helpers.ts","../src/core/functions/definitions/aggregate.ts","../src/core/functions/definitions/string.ts","../src/core/functions/definitions/datetime.ts","../src/core/functions/definitions/numeric.ts","../src/core/functions/definitions/control-flow.ts","../src/core/functions/definitions/json.ts","../src/core/functions/group-concat-helpers.ts","../src/core/functions/standard-strategy.ts","../src/core/functions/standard-table-strategy.ts","../src/core/dialect/abstract.ts","../src/core/dialect/base/function-table-formatter.ts","../src/core/dialect/base/pagination-strategy.ts","../src/core/dialect/base/cte-compiler.ts","../src/core/dialect/base/returning-strategy.ts","../src/core/dialect/base/join-compiler.ts","../src/core/dialect/base/groupby-compiler.ts","../src/core/dialect/base/orderby-compiler.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/postgres/functions.ts","../src/core/dialect/postgres/table-functions.ts","../src/core/dialect/postgres/index.ts","../src/core/dialect/mysql/functions.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/sqlite/functions.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/mssql/functions.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/dialect-factory.ts","../src/query-builder/select-query-state.ts","../src/core/ast/join-node.ts","../src/query-builder/hydration-manager.ts","../src/query-builder/relation-alias.ts","../src/query-builder/relation-utils.ts","../src/query-builder/hydration-planner.ts","../src/query-builder/raw-column-parser.ts","../src/query-builder/query-ast-service.ts","../src/query-builder/relation-projection-helper.ts","../src/query-builder/relation-conditions.ts","../src/core/ast/join-metadata.ts","../src/query-builder/relation-service.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/query-builder/select-query-builder-deps.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.ts","../src/orm/relations/has-one.ts","../src/orm/relations/belongs-to.ts","../src/orm/relations/many-to-many.ts","../src/orm/lazy-batch.ts","../src/orm/entity.ts","../src/orm/execute.ts","../src/query-builder/query-resolution.ts","../src/query-builder/select.ts","../src/schema/table-guards.ts","../src/orm/entity-metadata.ts","../src/decorators/bootstrap.ts","../src/query-builder/select-helpers.ts","../src/query-builder/insert-query-state.ts","../src/query-builder/insert.ts","../src/query-builder/update-query-state.ts","../src/query-builder/update.ts","../src/query-builder/delete-query-state.ts","../src/query-builder/delete.ts","../src/core/ddl/sql-writing.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/naming-strategy.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/catalogs/postgres.ts","../src/core/ddl/introspect/run-select.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/catalogs/mysql.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/catalogs/mssql.ts","../src/core/functions/text.ts","../src/core/ddl/introspect/functions/mssql.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/introspect/registry.ts","../src/core/ddl/schema-introspect.ts","../src/core/functions/numeric.ts","../src/core/functions/datetime.ts","../src/core/functions/control-flow.ts","../src/core/functions/json.ts","../src/core/functions/array.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/naming-strategy.ts","../src/codegen/typescript.ts","../src/orm/identity-map.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/domain-event-bus.ts","../src/orm/relation-change-processor.ts","../src/orm/query-logger.ts","../src/orm/transaction-runner.ts","../src/orm/save-graph.ts","../src/orm/orm-session.ts","../src/orm/interceptor-pipeline.ts","../src/orm/orm.ts","../src/orm/jsonify.ts","../src/decorators/decorator-metadata.ts","../src/decorators/entity.ts","../src/decorators/column-decorator.ts","../src/decorators/relations.ts","../src/core/execution/db-executor.ts","../src/core/execution/pooling/pool.ts","../src/core/execution/executors/postgres-executor.ts","../src/core/execution/executors/mysql-executor.ts","../src/core/execution/executors/sqlite-executor.ts","../src/core/execution/executors/mssql-executor.ts","../src/orm/pooled-executor-factory.ts"],"sourcesContent":["import { DbExecutor } from '../execution/db-executor.js';\nimport type { SchemaPlan, SynchronizeOptions } from './schema-diff.js';\n\n/**\n * Executes a schema plan by running the SQL statements.\n * @param plan - The schema plan to execute.\n * @param executor - The database executor.\n * @param options - Options for synchronization.\n */\nexport const executeSchemaPlan = async (\n plan: SchemaPlan,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<void> => {\n for (const change of plan.changes) {\n if (!change.statements.length) continue;\n if (!change.safe && !options.allowDestructive) continue;\n for (const stmt of change.statements) {\n if (!stmt.trim()) continue;\n await executor.executeSql(stmt);\n }\n }\n};\n","import type { ColumnDef } from './column-types.js';\r\nimport type { RelationDef } from './relation.js';\r\n\r\nexport interface IndexColumn {\r\n column: string;\r\n order?: 'ASC' | 'DESC';\r\n nulls?: 'FIRST' | 'LAST';\r\n}\r\n\r\nexport interface IndexDef {\r\n name?: string;\r\n columns: (string | IndexColumn)[];\r\n unique?: boolean;\r\n where?: string;\r\n}\r\n\r\nexport interface CheckConstraint {\r\n name?: string;\r\n expression: string;\r\n}\r\n\r\nexport interface TableOptions {\r\n schema?: string;\r\n primaryKey?: string[];\r\n indexes?: IndexDef[];\r\n checks?: CheckConstraint[];\r\n comment?: string;\r\n engine?: string;\r\n charset?: string;\r\n collation?: string;\r\n}\r\n\r\nexport interface TableHooks {\r\n beforeInsert?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterInsert?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n beforeUpdate?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterUpdate?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n beforeDelete?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Definition of a database table with its columns and relationships\r\n * @typeParam T - Type of the columns record\r\n */\r\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\r\n /** Name of the table */\r\n name: string;\r\n /** Optional schema/catalog name */\r\n schema?: string;\r\n /** Record of column definitions keyed by column name */\r\n columns: T;\r\n /** Record of relationship definitions keyed by relation name */\r\n relations: Record<string, RelationDef>;\r\n /** Optional lifecycle hooks */\r\n hooks?: TableHooks;\r\n /** Composite primary key definition (falls back to column.primary flags) */\r\n primaryKey?: string[];\r\n /** Secondary indexes */\r\n indexes?: IndexDef[];\r\n /** Table-level check constraints */\r\n checks?: CheckConstraint[];\r\n /** Table comment/description */\r\n comment?: string;\r\n /** Dialect-specific options */\r\n engine?: string;\r\n charset?: string;\r\n collation?: string;\r\n}\r\n\r\n/**\r\n * Creates a table definition with columns and relationships\r\n * @typeParam T - Type of the columns record\r\n * @param name - Name of the table\r\n * @param columns - Record of column definitions\r\n * @param relations - Record of relationship definitions (optional)\r\n * @returns Complete table definition with runtime-filled column metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * const usersTable = defineTable('users', {\r\n * id: col.primaryKey(col.int()),\r\n * name: col.varchar(255),\r\n * email: col.varchar(255)\r\n * });\r\n * ```\r\n */\r\nexport const defineTable = <T extends Record<string, ColumnDef>>(\r\n name: string,\r\n columns: T,\r\n relations: Record<string, RelationDef> = {},\r\n hooks?: TableHooks,\r\n options: TableOptions = {}\r\n): TableDef<T> => {\r\n // Runtime mutability to assign names to column definitions for convenience\r\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\r\n const colDef = { ...def, name: key, table: name };\r\n (acc as Record<string, unknown>)[key] = colDef;\r\n return acc;\r\n }, {} as T);\r\n\r\n return {\r\n name,\r\n schema: options.schema,\r\n columns: colsWithNames,\r\n relations,\r\n hooks,\r\n primaryKey: options.primaryKey,\r\n indexes: options.indexes,\r\n checks: options.checks,\r\n comment: options.comment,\r\n engine: options.engine,\r\n charset: options.charset,\r\n collation: options.collation\r\n };\r\n};\r\n\r\ntype DirectColumnKeys<T extends TableDef> =\r\n Exclude<keyof T[\"columns\"] & string, keyof T | \"$\">;\r\n\r\nexport type TableRef<T extends TableDef> =\r\n T &\r\n { [K in DirectColumnKeys<T>]: T[\"columns\"][K] } & {\r\n /**\r\n * Escape hatch for collisions:\r\n * - tref.name => table name (string)\r\n * - tref.$.name => column def for \"name\"\r\n */\r\n $: T[\"columns\"];\r\n };\r\n\r\nconst TABLE_REF_CACHE: WeakMap<object, unknown> = new WeakMap();\r\n\r\nconst withColumnProps = <T extends TableDef>(table: T): TableRef<T> => {\r\n const cached = TABLE_REF_CACHE.get(table);\r\n if (cached) return cached as TableRef<T>;\r\n\r\n const proxy = new Proxy(table as object, {\r\n get(target, prop, receiver) {\r\n const t = target as TableDef;\r\n if (prop === \"$\") return t.columns;\r\n\r\n // Prefer real table fields first (prevents collision surprises)\r\n if (Reflect.has(target, prop)) return Reflect.get(target, prop, receiver);\r\n\r\n // Fall back to columns bag\r\n if (typeof prop === \"string\" && prop in t.columns) return t.columns[prop];\r\n\r\n return undefined;\r\n },\r\n\r\n has(target, prop) {\r\n const t = target as TableDef;\r\n return (\r\n prop === \"$\" ||\r\n Reflect.has(target, prop) ||\r\n (typeof prop === \"string\" && prop in t.columns)\r\n );\r\n },\r\n\r\n ownKeys(target) {\r\n const t = target as TableDef;\r\n const base = Reflect.ownKeys(target);\r\n const cols = Object.keys(t.columns);\r\n\r\n for (const k of cols) {\r\n if (!base.includes(k)) base.push(k);\r\n }\r\n if (!base.includes(\"$\")) base.push(\"$\");\r\n return base;\r\n },\r\n\r\n getOwnPropertyDescriptor(target, prop) {\r\n if (prop === \"$\") {\r\n return {\r\n configurable: true,\r\n enumerable: false,\r\n get() {\r\n return (target as TableDef).columns;\r\n },\r\n };\r\n }\r\n\r\n if (\r\n typeof prop === \"string\" &&\r\n prop in (target as TableDef).columns &&\r\n !Reflect.has(target, prop)\r\n ) {\r\n return {\r\n configurable: true,\r\n enumerable: true,\r\n value: (target as TableDef).columns[prop],\r\n writable: false,\r\n };\r\n }\r\n\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n }) as TableRef<T>;\r\n\r\n TABLE_REF_CACHE.set(table, proxy);\r\n return proxy;\r\n};\r\n\r\n/**\r\n * Public API: opt-in ergonomic table reference.\r\n * Usage:\r\n * const t = tableRef(todos);\r\n * qb.where(eq(t.done, false)).orderBy(t.id, \"ASC\");\r\n * Collisions:\r\n * t.name is the table name (real field)\r\n * t.$.name is the \"name\" column (escape hatch)\r\n */\r\nexport const tableRef = <T extends TableDef>(table: T): TableRef<T> => withColumnProps(table);\r\n\r\n/**\r\n * Public API: dynamic column lookup by string key.\r\n *\r\n * Useful when the column name is only known at runtime, or when a column name\r\n * collides with a real table field (e.g. \"name\").\r\n *\r\n * @example\r\n * ```ts\r\n * const t = tableRef(todos);\r\n * const key = runtimeKey();\r\n * where(eq(getColumn(t, key), 123));\r\n * // or: t.$.name (escape hatch)\r\n * ```\r\n */\r\nexport function getColumn<T extends TableDef, K extends keyof T['columns'] & string>(table: T, key: K): T['columns'][K];\r\nexport function getColumn<T extends TableDef>(table: T, key: string): ColumnDef;\r\nexport function getColumn<T extends TableDef>(table: T, key: string): ColumnDef {\r\n const col = table.columns[key] as ColumnDef | undefined;\r\n if (!col) {\r\n const tableName = table.name || '<unknown>';\r\n throw new Error(`Column '${key}' does not exist on table '${tableName}'`);\r\n }\r\n return col;\r\n}\r\n","/**\r\n * Canonical, dialect-agnostic column data types.\r\n * Keep this intentionally small; dialect-specific names should be expressed via `dialectTypes`.\r\n */\r\nexport const STANDARD_COLUMN_TYPES = [\r\n 'INT',\r\n 'INTEGER',\r\n 'BIGINT',\r\n 'VARCHAR',\r\n 'TEXT',\r\n 'JSON',\r\n 'ENUM',\r\n 'DECIMAL',\r\n 'FLOAT',\r\n 'DOUBLE',\r\n 'UUID',\r\n 'BINARY',\r\n 'VARBINARY',\r\n 'BLOB',\r\n 'DATE',\r\n 'DATETIME',\r\n 'TIMESTAMP',\r\n 'TIMESTAMPTZ',\r\n 'BOOLEAN'\r\n] as const;\r\n\r\n/** Known logical types the ORM understands. */\r\nexport type StandardColumnType = (typeof STANDARD_COLUMN_TYPES)[number];\r\n\r\n/**\r\n * Column type value.\r\n * We allow arbitrary strings so new/dialect-specific types don't require touching this module.\r\n */\r\nexport type ColumnType = StandardColumnType | (string & {});\r\n\r\nconst STANDARD_TYPE_SET = new Set<string>(STANDARD_COLUMN_TYPES.map(t => t.toLowerCase()));\r\n\r\n/**\r\n * Normalizes a column type to its canonical lowercase form when it's one of the known logical types.\r\n * Unknown/custom types are returned untouched to avoid clobbering dialect-specific casing.\r\n */\r\nexport const normalizeColumnType = (type: ColumnType): ColumnType => {\r\n if (typeof type !== 'string') return type;\r\n const lower = type.toLowerCase();\r\n return STANDARD_TYPE_SET.has(lower) ? lower : type;\r\n};\r\n\r\n/**\r\n * Renders a raw SQL type name with optional parameters.\r\n */\r\nexport const renderTypeWithArgs = (sqlType: string, args?: unknown[]): string => {\r\n if (!args || args.length === 0) return sqlType;\r\n return `${sqlType}(${args.join(', ')})`;\r\n};\r\n\r\nexport type ReferentialAction =\r\n | 'NO ACTION'\r\n | 'RESTRICT'\r\n | 'CASCADE'\r\n | 'SET NULL'\r\n | 'SET DEFAULT';\r\n\r\nexport interface RawDefaultValue {\r\n raw: string;\r\n}\r\n\r\nexport type DefaultValue = unknown | RawDefaultValue;\r\n\r\nexport interface ForeignKeyReference {\r\n /** Target table name */\r\n table: string;\r\n /** Target column name */\r\n column: string;\r\n /** Optional constraint name */\r\n name?: string;\r\n /** ON DELETE action */\r\n onDelete?: ReferentialAction;\r\n /** ON UPDATE action */\r\n onUpdate?: ReferentialAction;\r\n /** Whether the constraint is deferrable (Postgres) */\r\n deferrable?: boolean;\r\n}\r\n\r\n/**\r\n * Definition of a database column\r\n */\r\nexport interface ColumnDef<T extends ColumnType = ColumnType, TRuntime = unknown> {\r\n /** Column name (filled at runtime by defineTable) */\r\n name: string;\r\n /** Data type of the column */\r\n type: T;\r\n /** Optional explicit SQL type per dialect (e.g., { postgres: 'bytea' }) */\r\n dialectTypes?: Partial<Record<string, string>>;\r\n /** Optional override for the inferred TypeScript type */\r\n tsType?: TRuntime;\r\n /** Whether this column is a primary key */\r\n primary?: boolean;\r\n /** Whether this column cannot be null */\r\n notNull?: boolean;\r\n /** Whether this column must be unique (or name of the unique constraint) */\r\n unique?: boolean | string;\r\n /** Default value for the column */\r\n default?: DefaultValue;\r\n /** Whether the column auto-increments / identity */\r\n autoIncrement?: boolean;\r\n /** Identity strategy where supported */\r\n generated?: 'always' | 'byDefault';\r\n /** Inline check constraint expression */\r\n check?: string;\r\n /** Foreign key reference */\r\n references?: ForeignKeyReference;\r\n /** Column comment/description */\r\n comment?: string;\r\n /** Additional arguments for the column type (e.g., VARCHAR length) */\r\n args?: unknown[];\r\n /** Table name this column belongs to (filled at runtime by defineTable) */\r\n table?: string;\r\n}\r\n\r\n/**\r\n * Factory for creating column definitions with common data types\r\n */\r\nexport const col = {\r\n /**\r\n * Creates an integer column definition\r\n * @returns ColumnDef with INT type\r\n */\r\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\r\n\r\n /**\r\n * Creates a big integer column definition\r\n */\r\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\r\n\r\n /**\r\n * Creates a variable character column definition\r\n * @param length - Maximum length of the string\n * @returns ColumnDef with VARCHAR type\n */\n varchar: (length: number): ColumnDef<'VARCHAR'> => ({ name: '', type: 'VARCHAR', args: [length] }),\n\n /**\n * Creates a text column definition\n */\n text: (): ColumnDef<'TEXT'> => ({ name: '', type: 'TEXT' }),\n\n /**\n * Creates a fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\r\n type: 'DECIMAL',\r\n args: [precision, scale]\r\n }),\r\n\r\n /**\r\n * Creates a floating point column definition\r\n */\r\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\r\n name: '',\r\n type: 'FLOAT',\r\n args: precision !== undefined ? [precision] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a UUID column definition\r\n */\r\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\r\n\r\n /**\r\n * Creates a binary large object column definition\r\n */\r\n blob: (): ColumnDef<'BLOB'> => ({ name: '', type: 'BLOB' }),\r\n\r\n /**\r\n * Creates a fixed-length binary column definition\r\n */\r\n binary: (length?: number): ColumnDef<'BINARY'> => ({\r\n name: '',\r\n type: 'BINARY',\r\n args: length !== undefined ? [length] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a variable-length binary column definition\r\n */\r\n varbinary: (length?: number): ColumnDef<'VARBINARY'> => ({\r\n name: '',\r\n type: 'VARBINARY',\r\n args: length !== undefined ? [length] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a Postgres bytea column definition\r\n */\r\n bytea: (): ColumnDef<'BYTEA'> => ({\r\n name: '',\r\n type: 'BYTEA'\r\n }),\r\n\r\n /**\r\n * Creates a timestamp column definition\r\n */\r\n timestamp: <TRuntime = string>(): ColumnDef<'TIMESTAMP', TRuntime> => ({ name: '', type: 'TIMESTAMP' }),\r\n\r\n /**\r\n * Creates a timestamptz column definition\r\n */\r\n timestamptz: <TRuntime = string>(): ColumnDef<'TIMESTAMPTZ', TRuntime> => ({ name: '', type: 'TIMESTAMPTZ' }),\r\n\r\n /**\r\n * Creates a date column definition\r\n */\r\n date: <TRuntime = string>(): ColumnDef<'DATE', TRuntime> => ({ name: '', type: 'DATE' }),\r\n\r\n /**\r\n * Creates a datetime column definition\r\n */\r\n datetime: <TRuntime = string>(): ColumnDef<'DATETIME', TRuntime> => ({ name: '', type: 'DATETIME' }),\r\n\r\n /**\r\n * Creates a JSON column definition\r\n * @returns ColumnDef with JSON type\r\n */\r\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\r\n\r\n /**\r\n * Creates a boolean column definition\r\n * @returns ColumnDef with BOOLEAN type\r\n */\r\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\r\n\r\n /**\r\n * Creates an enum column definition\r\n * @param values - Enum values\r\n */\r\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\r\n\r\n /**\r\n * Creates a column definition with a custom SQL type.\r\n * Useful for dialect-specific types without polluting the standard set.\r\n */\r\n custom: (type: string, opts: { dialect?: string; args?: unknown[]; tsType?: unknown } = {}): ColumnDef => ({\r\n name: '',\r\n type,\r\n args: opts.args,\r\n tsType: opts.tsType,\r\n dialectTypes: opts.dialect ? { [opts.dialect]: type } : undefined\r\n }),\r\n\r\n /**\r\n * Marks a column definition as a primary key\r\n * @param def - Column definition to modify\r\n * @returns Modified ColumnDef with primary: true\r\n */\r\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\r\n ({ ...def, primary: true }),\r\n\r\n /**\r\n * Marks a column as NOT NULL\r\n */\r\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\r\n ({ ...def, notNull: true }),\r\n\r\n /**\r\n * Marks a column as UNIQUE\r\n */\r\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n unique: name ?? true\r\n }),\r\n\r\n /**\r\n * Sets a default value for the column\r\n */\r\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n default: value\r\n }),\r\n\r\n /**\r\n * Sets a raw SQL default value for the column\r\n */\r\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n default: { raw: expression }\r\n }),\r\n\r\n /**\r\n * Marks a column as auto-increment / identity\r\n */\r\n autoIncrement: <T extends ColumnType>(\r\n def: ColumnDef<T>,\r\n strategy: ColumnDef['generated'] = 'byDefault'\r\n ): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n autoIncrement: true,\r\n generated: strategy\r\n }),\r\n\r\n /**\r\n * Adds a foreign key reference\r\n */\r\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n references: ref\r\n }),\r\n\r\n /**\r\n * Adds a check constraint to the column\r\n */\r\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n check: expression\r\n })\r\n};\r\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator, BitwiseOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a reference to a SELECT alias (for ORDER BY / GROUP BY).\r\n */\r\nexport interface AliasRefNode {\r\n type: 'AliasRef';\r\n /** Alias name to reference */\r\n name: string;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\r\n type: 'Column';\r\n /** Table name the column belongs to */\r\n table: string;\r\n /** Column name */\r\n name: string;\r\n /** Optional alias for the column */\r\n alias?: string;\r\n /** Optional scope marker (e.g., 'outer' for correlated references) */\r\n scope?: 'outer' | 'default';\r\n}\r\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\r\n type: 'Function';\r\n /** Function name (e.g., COUNT, SUM) */\r\n name: string;\r\n /** Optional canonical function key for dialect-aware rendering */\r\n fn?: string;\r\n /** Function arguments */\r\n args: OperandNode[];\r\n /** Optional alias for the function result */\r\n alias?: string;\r\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\r\n orderBy?: OrderByNode[];\r\n /** Optional separator argument used by GROUP_CONCAT-like functions */\r\n separator?: OperandNode;\r\n /** Optional DISTINCT modifier */\r\n distinct?: boolean;\r\n}\r\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\nexport type InExpressionRight = OperandNode[] | ScalarSubqueryNode;\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CAST expression (CAST(value AS type)).\r\n */\r\nexport interface CastExpressionNode {\r\n type: 'Cast';\r\n /** Expression being cast */\r\n expression: OperandNode;\r\n /** SQL type literal, e.g. \"varchar(255)\" */\r\n castType: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a COLLATE expression (expression COLLATE collationName).\r\n */\r\nexport interface CollateExpressionNode {\r\n type: 'Collate';\r\n /** Expression to be collated */\r\n expression: OperandNode;\r\n /** Collation name */\r\n collation: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing an arithmetic expression (e.g., a + b)\r\n */\r\nexport interface ArithmeticExpressionNode {\r\n type: 'ArithmeticExpression';\r\n left: OperandNode;\r\n operator: '+' | '-' | '*' | '/';\r\n right: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | AliasRefNode\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | CastExpressionNode\r\n | WindowFunctionNode\r\n | ArithmeticExpressionNode\r\n | BitwiseExpressionNode\r\n | CollateExpressionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'AliasRef',\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'Cast',\r\n 'WindowFunction',\r\n 'ArithmeticExpression',\r\n 'BitwiseExpression',\r\n 'Collate'\r\n]);\r\n\r\nconst hasTypeProperty = (value: unknown): value is { type?: string } =>\r\n typeof value === 'object' && value !== null && 'type' in value;\r\n\r\nexport const isOperandNode = (node: unknown): node is OperandNode => {\r\n if (!hasTypeProperty(node)) return false;\r\n return operandTypes.has(node.type as OperandNode['type']);\r\n};\r\n\r\nexport const isFunctionNode = (node: unknown): node is FunctionNode =>\r\n isOperandNode(node) && node.type === 'Function';\r\nexport const isCaseExpressionNode = (node: unknown): node is CaseExpressionNode =>\r\n isOperandNode(node) && node.type === 'CaseExpression';\r\n\r\nexport const isCastExpressionNode = (node: unknown): node is CastExpressionNode =>\r\n isOperandNode(node) && node.type === 'Cast';\r\nexport const isCollateExpressionNode = (node: unknown): node is CollateExpressionNode =>\r\n isOperandNode(node) && node.type === 'Collate';\r\nexport const isWindowFunctionNode = (node: unknown): node is WindowFunctionNode =>\r\n isOperandNode(node) && node.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnRef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(node) || isCastExpressionNode(node) || isWindowFunctionNode(node);\r\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a bitwise expression (e.g., a & b)\r\n */\r\nexport interface BitwiseExpressionNode {\r\n type: 'BitwiseExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Bitwise operator */\r\n operator: BitwiseOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: InExpressionRight;\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode\r\n | ArithmeticExpressionNode\r\n | BitwiseExpressionNode;\r\n","import { SelectQueryNode } from './query.js';\r\nimport { SqlOperator, BitwiseOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\nimport {\r\n ColumnNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n CastExpressionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n InExpressionRight,\r\n ScalarSubqueryNode,\r\n BetweenExpressionNode,\r\n isOperandNode,\r\n AliasRefNode,\r\n ArithmeticExpressionNode,\r\n BitwiseExpressionNode,\r\n CollateExpressionNode\r\n} from './expression-nodes.js';\r\n\r\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Type guard to check if a value is a literal value\r\n */\r\nconst isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\n\r\n/**\r\n * Converts a primitive value to a LiteralNode\r\n */\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\n/**\r\n * Converts a ColumnRef to a ColumnNode\r\n * @throws Error if the ColumnRef doesn't have a table specified\r\n */\r\nconst columnRefToNode = (col: ColumnRef): ColumnNode => {\r\n if (!col.table) {\r\n throw new Error(\r\n `Column \"${col.name}\" requires a table reference. ` +\r\n `Use columnOperand with a fully qualified ColumnRef or ColumnNode.`\r\n );\r\n }\r\n return { type: 'Column', table: col.table, name: col.name };\r\n};\r\n\r\n/**\r\n * Unified conversion function: converts any valid input to an OperandNode\r\n * @param value - Value to convert (OperandNode, ColumnRef, or literal value)\r\n * @returns OperandNode representing the value\r\n */\r\nconst toOperandNode = (value: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n // Already an operand node\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n // Literal value\r\n if (isLiteralValue(value)) {\r\n return toLiteralNode(value);\r\n }\r\n\r\n // Must be ColumnRef\r\n return columnRefToNode(value as ColumnRef);\r\n};\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n return toLiteralNode(value);\r\n};\r\n\r\n/**\r\n * Converts various input types to an OperandNode\r\n */\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => toOperandNode(val);\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nexport type SelectQueryInput = SelectQueryNode | { getAST(): SelectQueryNode };\r\n\r\nconst hasQueryAst = (value: SelectQueryInput): value is { getAST(): SelectQueryNode } =>\r\n typeof (value as { getAST?: unknown }).getAST === 'function';\r\n\r\nconst resolveSelectQueryNode = (query: SelectQueryInput): SelectQueryNode =>\r\n hasQueryAst(query) ? query.getAST() : query;\r\n\r\nconst toScalarSubqueryNode = (query: SelectQueryInput): ScalarSubqueryNode => ({\r\n type: 'ScalarSubquery',\r\n query: resolveSelectQueryNode(query)\r\n});\r\n\r\n/**\r\n * Converts a ColumnRef or ColumnNode to a ColumnNode\r\n * @param col - Column reference or node\r\n * @returns ColumnNode\r\n * @throws Error if ColumnRef doesn't have a table specified\r\n */\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => {\r\n if (isOperandNode(col) && col.type === 'Column') {\r\n return col;\r\n }\r\n return columnRefToNode(col as ColumnRef);\r\n};\r\n\r\n/**\r\n * Marks a column reference as an outer-scope reference for correlated subqueries.\r\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\r\n */\r\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\r\n ...columnOperand(col),\r\n scope: 'outer'\r\n});\r\n\r\n/**\r\n * References a SELECT alias (useful for ORDER BY / GROUP BY).\r\n */\r\nexport const aliasRef = (name: string): AliasRefNode => ({\r\n type: 'AliasRef',\r\n name\r\n});\r\n\r\n/**\r\n * Creates an outer-scoped column reference using a specific table or alias name.\r\n */\r\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toOperandNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toOperandNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnRef,\r\n right: InExpressionRight\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n right\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values.map(v => toOperand(v)));\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values.map(v => toOperand(v)));\r\n\r\nexport const inSubquery = (left: OperandNode | ColumnRef, subquery: SelectQueryInput): InExpressionNode =>\r\n createInExpression('IN', left, toScalarSubqueryNode(subquery));\r\n\r\nexport const notInSubquery = (left: OperandNode | ColumnRef, subquery: SelectQueryInput): InExpressionNode =>\r\n createInExpression('NOT IN', left, toScalarSubqueryNode(subquery));\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\nconst createArithmeticExpression = (\r\n operator: '+' | '-' | '*' | '/',\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => ({\r\n type: 'ArithmeticExpression',\r\n left: toOperand(left),\r\n operator,\r\n right: toOperand(right)\r\n});\r\n\r\nexport const add = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('+', left, right);\r\n\r\nexport const sub = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('-', left, right);\r\n\r\nexport const mul = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('*', left, right);\r\n\r\nexport const div = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('/', left, right);\r\n\r\nconst createBitwiseExpression = (\r\n operator: BitwiseOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => ({\r\n type: 'BitwiseExpression',\r\n left: toOperand(left),\r\n operator,\r\n right: toOperand(right)\r\n});\r\n\r\n/**\r\n * Creates a bitwise AND expression (left & right)\r\n */\r\nexport const bitAnd = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('&', left, right);\r\n\r\n/**\r\n * Creates a bitwise OR expression (left | right)\r\n */\r\nexport const bitOr = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('|', left, right);\r\n\r\n/**\r\n * Creates a bitwise XOR expression (left ^ right)\r\n */\r\nexport const bitXor = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('^', left, right);\r\n\r\n/**\r\n * Creates a bitwise shift left expression (left << right)\r\n */\r\nexport const shiftLeft = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('<<', left, right);\r\n\r\n/**\r\n * Creates a bitwise shift right expression (left >> right)\r\n */\r\nexport const shiftRight = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('>>', left, right);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Builds a CAST expression node for casting values to SQL types.\r\n */\r\nexport const cast = (\r\n expression: OperandNode | ColumnRef | string | number | boolean | null,\r\n castType: string\r\n): CastExpressionNode => ({\r\n type: 'Cast',\r\n expression: toOperand(expression),\r\n castType\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a COLLATE expression (expression COLLATE collationName)\r\n * @param expression - Expression to be collated\r\n * @param collation - Collation name\r\n * @returns COLLATE expression node\r\n */\r\nexport const collate = (\r\n expression: OperandNode | ColumnRef | string | number | boolean | null,\r\n collation: string\r\n): CollateExpressionNode => ({\r\n type: 'Collate',\r\n expression: toOperand(expression),\r\n collation\r\n});\r\n","import { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\nimport { columnOperand } from './expression-builders.js';\nimport { OrderDirection } from '../sql/sql.js';\nimport { OrderByNode } from './query.js';\nimport { ColumnRef } from './types.js';\n\nconst buildWindowFunction = (\n name: string,\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: ColumnNode[],\n orderBy?: OrderByNode[]\n): WindowFunctionNode => {\n const node: WindowFunctionNode = {\n type: 'WindowFunction',\n name,\n args\n };\n\n if (partitionBy && partitionBy.length) {\n node.partitionBy = partitionBy;\n }\n\n if (orderBy && orderBy.length) {\n node.orderBy = orderBy;\n }\n\n return node;\n};\n\n/**\n * Creates a ROW_NUMBER window function\n * @returns Window function node for ROW_NUMBER\n */\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\n\n/**\n * Creates a RANK window function\n * @returns Window function node for RANK\n */\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\n\n/**\n * Creates a DENSE_RANK window function\n * @returns Window function node for DENSE_RANK\n */\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\n\n/**\n * Creates an NTILE window function\n * @param n - Number of buckets\n * @returns Window function node for NTILE\n */\nexport const ntile = (n: number): WindowFunctionNode =>\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\n\n/**\n * Creates a LAG window function\n * @param col - Column to lag\n * @param offset - Offset (defaults to 1)\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LAG\n */\nexport const lag = (\n col: ColumnRef | ColumnNode,\n offset: number = 1,\n defaultValue?: LiteralNode['value']\n): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\n args.push({ type: 'Literal', value: defaultValue });\n }\n return buildWindowFunction('LAG', args);\n};\n\n/**\n * Creates a LEAD window function\n * @param col - Column to lead\n * @param offset - Offset (defaults to 1)\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LEAD\n */\nexport const lead = (\n col: ColumnRef | ColumnNode,\n offset: number = 1,\n defaultValue?: LiteralNode['value']\n): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\n args.push({ type: 'Literal', value: defaultValue });\n }\n return buildWindowFunction('LEAD', args);\n};\n\n/**\n * Creates a FIRST_VALUE window function\n * @param col - Column to get first value from\n * @returns Window function node for FIRST_VALUE\n */\nexport const firstValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\n\n/**\n * Creates a LAST_VALUE window function\n * @param col - Column to get last value from\n * @returns Window function node for LAST_VALUE\n */\nexport const lastValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\n\n/**\n * Creates a custom window function\n * @param name - Window function name\n * @param args - Function arguments\n * @param partitionBy - Optional PARTITION BY columns\n * @param orderBy - Optional ORDER BY clauses\n * @returns Window function node\n */\nexport const windowFunction = (\n name: string,\n args: (ColumnRef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: (ColumnRef | ColumnNode)[],\n orderBy?: { column: ColumnRef | ColumnNode; direction: OrderDirection }[]\n): WindowFunctionNode => {\n const nodeArgs = args.map(arg => {\n if (typeof (arg as LiteralNode).value !== 'undefined') {\n return arg as LiteralNode;\n }\n if ('path' in arg) {\n return arg as JsonPathNode;\n }\n return columnOperand(arg as ColumnRef | ColumnNode);\n });\n\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\n type: 'OrderBy',\n term: columnOperand(o.column),\n direction: o.direction\n }));\n\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\n};\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\r\n /** Equality operator */\r\n EQUALS: '=',\r\n /** Not equals operator */\r\n NOT_EQUALS: '!=',\r\n /** Greater than operator */\r\n GREATER_THAN: '>',\r\n /** Greater than or equal operator */\r\n GREATER_OR_EQUAL: '>=',\r\n /** Less than operator */\r\n LESS_THAN: '<',\r\n /** Less than or equal operator */\r\n LESS_OR_EQUAL: '<=',\r\n /** LIKE pattern matching operator */\r\n LIKE: 'LIKE',\r\n /** NOT LIKE pattern matching operator */\r\n NOT_LIKE: 'NOT LIKE',\r\n /** IN membership operator */\r\n IN: 'IN',\r\n /** NOT IN membership operator */\r\n NOT_IN: 'NOT IN',\r\n /** BETWEEN range operator */\r\n BETWEEN: 'BETWEEN',\r\n /** NOT BETWEEN range operator */\r\n NOT_BETWEEN: 'NOT BETWEEN',\r\n /** IS NULL null check operator */\r\n IS_NULL: 'IS NULL',\r\n /** IS NOT NULL null check operator */\r\n IS_NOT_NULL: 'IS NOT NULL',\r\n /** Logical AND operator */\r\n AND: 'AND',\r\n /** Logical OR operator */\r\n OR: 'OR',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL bitwise operators\r\n */\r\nexport const BITWISE_OPERATORS = {\r\n /** Bitwise AND */\r\n AND: '&',\r\n /** Bitwise OR */\r\n OR: '|',\r\n /** Bitwise XOR */\r\n XOR: '^',\r\n /** Bitwise Shift Left */\r\n SHIFT_LEFT: '<<',\r\n /** Bitwise Shift Right */\r\n SHIFT_RIGHT: '>>'\r\n} as const;\r\n\r\n/**\r\n * Type representing supported bitwise operators\r\n */\r\nexport type BitwiseOperator = (typeof BITWISE_OPERATORS)[keyof typeof BITWISE_OPERATORS];\r\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\n/**\n * Creates a COUNT function expression\n * @param col - Column to count\n * @returns Function node with COUNT\n */\nexport const count = buildAggregate('COUNT');\n\n/**\n * Creates a SUM function expression\n * @param col - Column to sum\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\n/**\n * Creates an AVG function expression\n * @param col - Column to average\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\n/**\n * Creates a COUNT(*) function expression.\n * @returns Function node with COUNT(*)\n */\nexport const countAll = (): FunctionNode => ({\n type: 'Function',\n name: 'COUNT',\n args: []\n});\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n term: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n\n/**\n * Creates a STDDEV function expression\n * @param col - Column to calculate standard deviation for\n * @returns Function node with STDDEV\n */\nexport const stddev = buildAggregate('STDDEV');\n\n/**\n * Creates a VARIANCE function expression\n * @param col - Column to calculate variance for\n * @returns Function node with VARIANCE\n */\nexport const variance = buildAggregate('VARIANCE');\n","import {\n BinaryExpressionNode,\n LogicalExpressionNode,\n NullExpressionNode,\n InExpressionNode,\n ExistsExpressionNode,\n BetweenExpressionNode,\n ExpressionNode,\n OperandNode,\n ArithmeticExpressionNode,\n ColumnNode,\n LiteralNode,\n FunctionNode,\n JsonPathNode,\n ScalarSubqueryNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode,\n CollateExpressionNode,\n AliasRefNode,\n BitwiseExpressionNode\n} from './expression-nodes.js';\n\n/**\n * Visitor for expression nodes\n */\nexport interface ExpressionVisitor<R> {\n visitBinaryExpression?(node: BinaryExpressionNode): R;\n visitLogicalExpression?(node: LogicalExpressionNode): R;\n visitNullExpression?(node: NullExpressionNode): R;\n visitInExpression?(node: InExpressionNode): R;\n visitExistsExpression?(node: ExistsExpressionNode): R;\n visitBetweenExpression?(node: BetweenExpressionNode): R;\n visitArithmeticExpression?(node: ArithmeticExpressionNode): R;\n visitBitwiseExpression?(node: BitwiseExpressionNode): R;\n otherwise?(node: ExpressionNode): R;\n}\n\n/**\n * Visitor for operand nodes\n */\nexport interface OperandVisitor<R> {\n visitColumn?(node: ColumnNode): R;\n visitLiteral?(node: LiteralNode): R;\n visitFunction?(node: FunctionNode): R;\n visitJsonPath?(node: JsonPathNode): R;\n visitScalarSubquery?(node: ScalarSubqueryNode): R;\n visitCaseExpression?(node: CaseExpressionNode): R;\n visitCast?(node: CastExpressionNode): R;\n visitWindowFunction?(node: WindowFunctionNode): R;\n visitCollate?(node: CollateExpressionNode): R;\n visitAliasRef?(node: AliasRefNode): R;\n otherwise?(node: OperandNode): R;\n}\n\ntype ExpressionDispatch = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>) => R;\ntype OperandDispatch = <R>(node: OperandNode, visitor: OperandVisitor<R>) => R;\n\n/**\n * Registry class for managing dispatchers in an immutable way\n */\nclass DispatcherRegistry<T> {\n private readonly dispatchers: ReadonlyMap<string, T>;\n\n constructor(dispatchers: Map<string, T> = new Map()) {\n this.dispatchers = dispatchers;\n }\n\n /**\n * Registers a new dispatcher and returns a new registry instance\n */\n register(type: string, dispatcher: T): DispatcherRegistry<T> {\n const newMap = new Map(this.dispatchers);\n newMap.set(type, dispatcher);\n return new DispatcherRegistry(newMap);\n }\n\n /**\n * Gets a dispatcher for the given type\n */\n get(type: string): T | undefined {\n return this.dispatchers.get(type);\n }\n\n /**\n * Returns a new empty registry\n */\n clear(): DispatcherRegistry<T> {\n return new DispatcherRegistry();\n }\n}\n\nlet expressionRegistry = new DispatcherRegistry<ExpressionDispatch>();\nlet operandRegistry = new DispatcherRegistry<OperandDispatch>();\n\n/**\n * Registers a dispatcher for a custom expression node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerExpressionDispatcher = (type: string, dispatcher: ExpressionDispatch): void => {\n expressionRegistry = expressionRegistry.register(type, dispatcher);\n};\n\n/**\n * Registers a dispatcher for a custom operand node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerOperandDispatcher = (type: string, dispatcher: OperandDispatch): void => {\n operandRegistry = operandRegistry.register(type, dispatcher);\n};\n\n/**\n * Clears all registered dispatchers. Primarily for tests.\n */\nexport const clearExpressionDispatchers = (): void => {\n expressionRegistry = expressionRegistry.clear();\n};\n\nexport const clearOperandDispatchers = (): void => {\n operandRegistry = operandRegistry.clear();\n};\n\nconst getNodeType = (node: { type?: string } | null | undefined): string | undefined =>\n typeof node === 'object' && node !== null && typeof node.type === 'string' ? node.type : undefined;\n\nconst unsupportedExpression = (node: ExpressionNode): never => {\n throw new Error(`Unsupported expression type \"${getNodeType(node) ?? 'unknown'}\"`);\n};\n\nconst unsupportedOperand = (node: OperandNode): never => {\n throw new Error(`Unsupported operand type \"${getNodeType(node) ?? 'unknown'}\"`);\n};\n/**\n * Dispatches an expression node to the visitor\n * @param node - Expression node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\n const dynamic = expressionRegistry.get(node.type);\n if (dynamic) return dynamic(node, visitor);\n\n switch (node.type) {\n case 'BinaryExpression':\n if (visitor.visitBinaryExpression) return visitor.visitBinaryExpression(node);\n break;\n case 'LogicalExpression':\n if (visitor.visitLogicalExpression) return visitor.visitLogicalExpression(node);\n break;\n case 'NullExpression':\n if (visitor.visitNullExpression) return visitor.visitNullExpression(node);\n break;\n case 'InExpression':\n if (visitor.visitInExpression) return visitor.visitInExpression(node);\n break;\n case 'ExistsExpression':\n if (visitor.visitExistsExpression) return visitor.visitExistsExpression(node);\n break;\n case 'BetweenExpression':\n if (visitor.visitBetweenExpression) return visitor.visitBetweenExpression(node);\n break;\n case 'ArithmeticExpression':\n if (visitor.visitArithmeticExpression) return visitor.visitArithmeticExpression(node);\n break;\n case 'BitwiseExpression':\n if (visitor.visitBitwiseExpression) return visitor.visitBitwiseExpression(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedExpression(node);\n};\n\n/**\n * Dispatches an operand node to the visitor\n * @param node - Operand node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\n const dynamic = operandRegistry.get(node.type);\n if (dynamic) return dynamic(node, visitor);\n\n switch (node.type) {\n case 'Column':\n if (visitor.visitColumn) return visitor.visitColumn(node);\n break;\n case 'Literal':\n if (visitor.visitLiteral) return visitor.visitLiteral(node);\n break;\n case 'Function':\n if (visitor.visitFunction) return visitor.visitFunction(node);\n break;\n case 'JsonPath':\n if (visitor.visitJsonPath) return visitor.visitJsonPath(node);\n break;\n case 'ScalarSubquery':\n if (visitor.visitScalarSubquery) return visitor.visitScalarSubquery(node);\n break;\n case 'CaseExpression':\n if (visitor.visitCaseExpression) return visitor.visitCaseExpression(node);\n break;\n case 'WindowFunction':\n if (visitor.visitWindowFunction) return visitor.visitWindowFunction(node);\n break;\n case 'AliasRef':\n if (visitor.visitAliasRef) return visitor.visitAliasRef(node);\n break;\n case 'Cast':\n if (visitor.visitCast) return visitor.visitCast(node);\n break;\n case 'Collate':\n if (visitor.visitCollate) return visitor.visitCollate(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedOperand(node);\n};\n","import { ColumnDef } from '../../schema/column-types.js';\nimport { TableDef } from '../../schema/table.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Type guard to check if an object has an alias property\n */\nconst hasAlias = (obj: unknown): obj is { alias?: string } =>\n typeof obj === 'object' && obj !== null && 'alias' in obj;\n\n/**\n * Adapts a schema ColumnDef to an AST-friendly ColumnRef.\n */\nexport const toColumnRef = (col: ColumnRef | ColumnDef): ColumnRef => ({\n name: col.name,\n table: col.table,\n alias: hasAlias(col) ? col.alias : undefined\n});\n\n/**\n * Adapts a schema TableDef to an AST-friendly TableRef.\n */\nexport const toTableRef = (table: TableRef | TableDef): TableRef => ({\n name: table.name,\n schema: table.schema,\n alias: hasAlias(table) ? table.alias : undefined\n});\n\r\n","import { ColumnNode, OperandNode } from './expression-nodes.js';\r\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\r\nimport { ColumnRef, TableRef } from './types.js';\r\n\r\n/**\r\n * Type guard to check if a column is already a ColumnNode\r\n */\r\nconst isColumnNode = (col: ColumnRef | ColumnNode): col is ColumnNode =>\r\n 'type' in col && col.type === 'Column';\r\n\r\n/**\r\n * Resolves the appropriate table name for a column reference\r\n * @param def - Column reference definition\r\n * @param table - Table reference providing context\r\n * @returns The resolved table name to use\r\n */\r\nconst resolveTableName = (def: ColumnRef, table: TableRef): string => {\r\n // If column doesn't specify a table, use the table's alias or name\r\n if (!def.table) {\r\n return table.alias || table.name;\r\n }\r\n\r\n // If column specifies the base table name and table has an alias, use the alias\r\n if (table.alias && def.table === table.name) {\r\n return table.alias;\r\n }\r\n\r\n // Otherwise use the table specified in the column definition\r\n return def.table;\r\n};\r\n\r\n/**\r\n * Builds or normalizes a column AST node from a column definition or existing node\r\n * @param table - Table definition providing a default table name\r\n * @param column - Column definition or existing column node\r\n */\r\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\r\n if (isColumnNode(column)) {\r\n return column;\r\n }\r\n\r\n const def = column as ColumnRef;\r\n const baseTable = resolveTableName(def, table);\r\n\r\n return {\r\n type: 'Column',\r\n table: baseTable,\r\n name: def.name\r\n };\r\n};\r\n\r\n/**\r\n * Builds column AST nodes for a list of column names\r\n * @param table - Table definition providing the table name\r\n * @param names - Column names\r\n */\r\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: table.alias || table.name,\r\n name\r\n }));\r\n\r\n/**\r\n * Builds a table AST node for the provided table definition\r\n * @param table - Table definition\r\n */\r\nexport const createTableNode = (table: TableRef): TableNode => ({\r\n type: 'Table',\r\n name: table.name,\r\n schema: (table as unknown as { schema?: string }).schema\r\n});\r\n\r\n/**\r\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\r\n */\r\nexport const fnTable = (\n name: string,\n args: OperandNode[] = [],\n alias?: string,\n opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\n): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n// Dialect-aware table function (portable intent key, not a real SQL function name).\nexport const tvf = (\n key: string,\n args: OperandNode[] = [],\n alias?: string,\n opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\n): FunctionTableNode => ({\n type: 'FunctionTable',\n key,\n name: key,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\r\n alias: string,\r\n columnAliases?: string[]\r\n): DerivedTableNode => ({\r\n type: 'DerivedTable',\r\n query,\r\n alias,\r\n columnAliases\r\n});\r\n","import type { FunctionRenderer } from './types.js';\n\n/**\n * Definition for a SQL function renderer.\n */\nexport interface FunctionDefinition {\n name: string;\n renderer: FunctionRenderer;\n}\n\n/**\n * Registry that keeps track of function renderers and exposes them by name.\n */\nexport class FunctionRegistry {\n private readonly renderers: Map<string, FunctionRenderer> = new Map();\n\n /**\n * Registers or overrides a renderer for the given function name.\n */\n add(name: string, renderer: FunctionRenderer): void {\n this.renderers.set(name, renderer);\n }\n\n /**\n * Registers a batch of definitions.\n */\n register(definitions: Iterable<FunctionDefinition>): void {\n for (const definition of definitions) {\n this.add(definition.name, definition.renderer);\n }\n }\n\n /**\n * Merges another registry into this one, allowing overrides from the other source.\n */\n merge(other: FunctionRegistry): void {\n for (const [name, renderer] of other.renderers.entries()) {\n this.renderers.set(name, renderer);\n }\n }\n\n /**\n * Retrieves a renderer by function name.\n */\n get(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n}\n","import type { FunctionRenderer } from '../types.js';\n\n/**\n * Simple renderer for functions that take one argument.\n */\nexport function unaryRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs[0]})`;\n}\n\n/**\n * Simple renderer for functions that take two arguments.\n */\nexport function binaryRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs[0]}, ${compiledArgs[1]})`;\n}\n\n/**\n * Renders functions that simply join all provided arguments.\n */\nexport function variadicRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs.join(', ')})`;\n}\n\n/**\n * Renders parameterless functions that always include parentheses.\n */\nexport function noArgsRenderer(name: string): FunctionRenderer {\n return () => `${name}()`;\n}\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { unaryRenderer } from './helpers.js';\n\nexport const aggregateFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'COUNT',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length ? `COUNT(${compiledArgs.join(', ')})` : 'COUNT(*)'\n },\n { name: 'SUM', renderer: unaryRenderer('SUM') },\n { name: 'AVG', renderer: unaryRenderer('AVG') },\n { name: 'MIN', renderer: unaryRenderer('MIN') },\n { name: 'MAX', renderer: unaryRenderer('MAX') },\n { name: 'STDDEV', renderer: unaryRenderer('STDDEV') },\n { name: 'VARIANCE', renderer: unaryRenderer('VARIANCE') }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { binaryRenderer, unaryRenderer, variadicRenderer } from './helpers.js';\n\nexport const stringFunctionDefinitions: FunctionDefinition[] = [\n { name: 'UPPER', renderer: unaryRenderer('UPPER') },\n { name: 'LOWER', renderer: unaryRenderer('LOWER') },\n { name: 'LENGTH', renderer: unaryRenderer('LENGTH') },\n { name: 'CHAR_LENGTH', renderer: unaryRenderer('CHAR_LENGTH') },\n { name: 'CHARACTER_LENGTH', renderer: unaryRenderer('CHARACTER_LENGTH') },\n { name: 'TRIM', renderer: unaryRenderer('TRIM') },\n { name: 'LTRIM', renderer: unaryRenderer('LTRIM') },\n { name: 'RTRIM', renderer: unaryRenderer('RTRIM') },\n { name: 'SUBSTRING', renderer: variadicRenderer('SUBSTRING') },\n { name: 'SUBSTR', renderer: variadicRenderer('SUBSTR') },\n { name: 'CONCAT', renderer: variadicRenderer('CONCAT') },\n { name: 'CONCAT_WS', renderer: variadicRenderer('CONCAT_WS') },\n { name: 'ASCII', renderer: unaryRenderer('ASCII') },\n { name: 'CHAR', renderer: variadicRenderer('CHAR') },\n {\n name: 'POSITION',\n renderer: ({ compiledArgs }) => `POSITION(${compiledArgs[0]} IN ${compiledArgs[1]})`\n },\n { name: 'REPLACE', renderer: ({ compiledArgs }) => `REPLACE(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'REPEAT', renderer: binaryRenderer('REPEAT') },\n { name: 'LPAD', renderer: ({ compiledArgs }) => `LPAD(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'RPAD', renderer: ({ compiledArgs }) => `RPAD(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'LEFT', renderer: binaryRenderer('LEFT') },\n { name: 'RIGHT', renderer: binaryRenderer('RIGHT') },\n { name: 'INSTR', renderer: binaryRenderer('INSTR') },\n {\n name: 'LOCATE',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 3\n ? `LOCATE(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})`\n : `LOCATE(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n { name: 'SPACE', renderer: unaryRenderer('SPACE') },\n { name: 'REVERSE', renderer: unaryRenderer('REVERSE') },\n { name: 'INITCAP', renderer: unaryRenderer('INITCAP') },\n { name: 'MD5', renderer: unaryRenderer('MD5') },\n { name: 'SHA1', renderer: unaryRenderer('SHA1') },\n { name: 'SHA2', renderer: ({ compiledArgs }) => `SHA2(${compiledArgs[0]}, ${compiledArgs[1]})` }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { noArgsRenderer } from './helpers.js';\n\nexport const dateTimeFunctionDefinitions: FunctionDefinition[] = [\n { name: 'NOW', renderer: noArgsRenderer('NOW') },\n { name: 'CURRENT_DATE', renderer: () => 'CURRENT_DATE' },\n { name: 'CURRENT_TIME', renderer: () => 'CURRENT_TIME' },\n {\n name: 'EXTRACT',\n renderer: ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`\n },\n { name: 'YEAR', renderer: ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})` },\n { name: 'MONTH', renderer: ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})` },\n { name: 'DAY', renderer: ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})` },\n { name: 'HOUR', renderer: ({ compiledArgs }) => `EXTRACT(HOUR FROM ${compiledArgs[0]})` },\n { name: 'MINUTE', renderer: ({ compiledArgs }) => `EXTRACT(MINUTE FROM ${compiledArgs[0]})` },\n { name: 'SECOND', renderer: ({ compiledArgs }) => `EXTRACT(SECOND FROM ${compiledArgs[0]})` },\n { name: 'QUARTER', renderer: ({ compiledArgs }) => `EXTRACT(QUARTER FROM ${compiledArgs[0]})` },\n { name: 'DATE_ADD', renderer: ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})` },\n { name: 'DATE_SUB', renderer: ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})` },\n { name: 'DATE_DIFF', renderer: ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})` },\n { name: 'DATE_FORMAT', renderer: ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})` },\n { name: 'UNIX_TIMESTAMP', renderer: noArgsRenderer('UNIX_TIMESTAMP') },\n { name: 'FROM_UNIXTIME', renderer: ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})` },\n { name: 'END_OF_MONTH', renderer: ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})` },\n { name: 'DAY_OF_WEEK', renderer: ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})` },\n { name: 'WEEK_OF_YEAR', renderer: ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})` },\n { name: 'DATE_TRUNC', renderer: ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})` },\n {\n name: 'AGE',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 1 ? `AGE(${compiledArgs[0]})` : `AGE(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n { name: 'LOCALTIME', renderer: () => 'LOCALTIME' },\n { name: 'LOCALTIMESTAMP', renderer: () => 'LOCALTIMESTAMP' }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { binaryRenderer, noArgsRenderer, unaryRenderer } from './helpers.js';\n\nexport const numericFunctionDefinitions: FunctionDefinition[] = [\n { name: 'ABS', renderer: unaryRenderer('ABS') },\n { name: 'BIT_LENGTH', renderer: unaryRenderer('BIT_LENGTH') },\n { name: 'OCTET_LENGTH', renderer: unaryRenderer('OCTET_LENGTH') },\n { name: 'CHR', renderer: unaryRenderer('CHR') },\n { name: 'LOG2', renderer: unaryRenderer('LOG2') },\n { name: 'CBRT', renderer: unaryRenderer('CBRT') },\n { name: 'ACOS', renderer: unaryRenderer('ACOS') },\n { name: 'ASIN', renderer: unaryRenderer('ASIN') },\n { name: 'ATAN', renderer: unaryRenderer('ATAN') },\n { name: 'ATAN2', renderer: binaryRenderer('ATAN2') },\n { name: 'CEIL', renderer: unaryRenderer('CEIL') },\n { name: 'CEILING', renderer: unaryRenderer('CEILING') },\n { name: 'COS', renderer: unaryRenderer('COS') },\n { name: 'COT', renderer: unaryRenderer('COT') },\n { name: 'DEGREES', renderer: unaryRenderer('DEGREES') },\n { name: 'EXP', renderer: unaryRenderer('EXP') },\n { name: 'FLOOR', renderer: unaryRenderer('FLOOR') },\n { name: 'LN', renderer: unaryRenderer('LN') },\n {\n name: 'LOG',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `LOG(${compiledArgs[0]}, ${compiledArgs[1]})` : `LOG(${compiledArgs[0]})`\n },\n { name: 'LOG10', renderer: unaryRenderer('LOG10') },\n { name: 'LOG_BASE', renderer: binaryRenderer('LOG') },\n { name: 'MOD', renderer: binaryRenderer('MOD') },\n { name: 'PI', renderer: noArgsRenderer('PI') },\n { name: 'POWER', renderer: binaryRenderer('POWER') },\n { name: 'POW', renderer: binaryRenderer('POW') },\n { name: 'RADIANS', renderer: unaryRenderer('RADIANS') },\n { name: 'RANDOM', renderer: noArgsRenderer('RANDOM') },\n { name: 'RAND', renderer: noArgsRenderer('RAND') },\n {\n name: 'ROUND',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `ROUND(${compiledArgs[0]}, ${compiledArgs[1]})` : `ROUND(${compiledArgs[0]})`\n },\n { name: 'SIGN', renderer: unaryRenderer('SIGN') },\n { name: 'SIN', renderer: unaryRenderer('SIN') },\n { name: 'SQRT', renderer: unaryRenderer('SQRT') },\n { name: 'TAN', renderer: unaryRenderer('TAN') },\n {\n name: 'TRUNC',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})` : `TRUNC(${compiledArgs[0]})`\n },\n {\n name: 'TRUNCATE',\n renderer: ({ compiledArgs }) => `TRUNCATE(${compiledArgs[0]}, ${compiledArgs[1]})`\n }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\n\nexport const controlFlowFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'COALESCE',\n renderer: ({ compiledArgs }) => `COALESCE(${compiledArgs.join(', ')})`\n },\n {\n name: 'NULLIF',\n renderer: ({ compiledArgs }) => `NULLIF(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n {\n name: 'GREATEST',\n renderer: ({ compiledArgs }) => `GREATEST(${compiledArgs.join(', ')})`\n },\n {\n name: 'LEAST',\n renderer: ({ compiledArgs }) => `LEAST(${compiledArgs.join(', ')})`\n },\n {\n name: 'IFNULL',\n renderer: ({ compiledArgs }) => `IFNULL(${compiledArgs[0]}, ${compiledArgs[1]})`\n }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\n\nexport const jsonFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'JSON_LENGTH',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length === 0 || compiledArgs.length > 2) {\n throw new Error('JSON_LENGTH expects 1 or 2 arguments');\n }\n return `JSON_LENGTH(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'JSON_SET',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length < 3 || (compiledArgs.length - 1) % 2 !== 0) {\n throw new Error('JSON_SET expects a JSON document followed by one or more path/value pairs');\n }\n return `JSON_SET(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'JSON_ARRAYAGG',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) {\n throw new Error('JSON_ARRAYAGG expects exactly one argument');\n }\n return `JSON_ARRAYAGG(${compiledArgs[0]})`;\n }\n },\n {\n name: 'JSON_CONTAINS',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length < 2 || compiledArgs.length > 3) {\n throw new Error('JSON_CONTAINS expects two or three arguments');\n }\n return `JSON_CONTAINS(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'ARRAY_APPEND',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) {\n throw new Error('ARRAY_APPEND expects exactly two arguments');\n }\n return `ARRAY_APPEND(${compiledArgs[0]}, ${compiledArgs[1]})`;\n }\n }\n];\n","import type { FunctionRenderContext } from './types.js';\nimport { isOperandNode, type LiteralNode, type OperandNode } from '../ast/expression.js';\n\n/** Default separator used when GROUP_CONCAT has no explicit separator. */\nexport const DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n};\n\n/**\n * Builds an ORDER BY clause for functions that support ordering (e.g. GROUP_CONCAT).\n */\nexport function buildGroupConcatOrderBy(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => {\n const term = isOperandNode(order.term)\n ? ctx.compileOperand(order.term)\n : (() => {\n throw new Error('ORDER BY expressions inside functions must be operands');\n })();\n const collation = order.collation ? ` COLLATE ${order.collation}` : '';\n const nulls = order.nulls ? ` NULLS ${order.nulls}` : '';\n return `${term} ${order.direction}${collation}${nulls}`;\n });\n return `ORDER BY ${parts.join(', ')}`;\n}\n\n/**\n * Formats the SEPARATOR clause for GROUP_CONCAT.\n */\nexport function formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n}\n\n/**\n * Returns the operand used as the separator for GROUP_CONCAT.\n */\nexport function getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? DEFAULT_GROUP_CONCAT_SEPARATOR;\n}\n\n/**\n * Renders the default GROUP_CONCAT statement.\n */\nexport function renderStandardGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = buildGroupConcatOrderBy(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n}\n","\nimport { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport type { LiteralNode, OperandNode } from '../ast/expression.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport type { FunctionDefinition } from './function-registry.js';\nimport { aggregateFunctionDefinitions } from './definitions/aggregate.js';\nimport { stringFunctionDefinitions } from './definitions/string.js';\nimport { dateTimeFunctionDefinitions } from './definitions/datetime.js';\nimport { numericFunctionDefinitions } from './definitions/numeric.js';\nimport { controlFlowFunctionDefinitions } from './definitions/control-flow.js';\nimport { jsonFunctionDefinitions } from './definitions/json.js';\nimport {\n renderStandardGroupConcat,\n buildGroupConcatOrderBy as buildGroupConcatOrderByClause,\n formatGroupConcatSeparator as formatGroupConcatSeparatorClause,\n getGroupConcatSeparatorOperand as resolveGroupConcatSeparatorOperand,\n DEFAULT_GROUP_CONCAT_SEPARATOR as DEFAULT_GROUP_CONCAT_SEPARATOR_LITERAL\n} from './group-concat-helpers.js';\n\n/**\n * Standard implementation of FunctionStrategy for ANSI SQL functions.\n */\nexport class StandardFunctionStrategy implements FunctionStrategy {\n protected readonly registry: FunctionRegistry;\n\n /**\n * Creates a new StandardFunctionStrategy and registers standard functions.\n */\n constructor(registry?: FunctionRegistry) {\n this.registry = registry ?? new FunctionRegistry();\n this.registerStandard();\n }\n\n protected registerStandard(): void {\n this.registerDefinitions(aggregateFunctionDefinitions);\n this.registerDefinitions(stringFunctionDefinitions);\n this.registerDefinitions(dateTimeFunctionDefinitions);\n this.registerDefinitions(numericFunctionDefinitions);\n this.registerDefinitions(controlFlowFunctionDefinitions);\n this.registerDefinitions(jsonFunctionDefinitions);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\n\n protected registerDefinitions(definitions: FunctionDefinition[]): void {\n this.registry.register(definitions);\n }\n\n /**\n * Registers a renderer for a function name.\n * @param name - The function name.\n * @param renderer - The renderer function.\n */\n protected add(name: string, renderer: FunctionRenderer): void {\n this.registry.add(name, renderer);\n }\n\n /**\n * @inheritDoc\n */\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.registry.get(name);\n }\n\n /**\n * Renders the GROUP_CONCAT function with optional ORDER BY and SEPARATOR.\n * @param ctx - The function render context.\n * @returns The rendered SQL string.\n */\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n return renderStandardGroupConcat(ctx);\n }\n\n /**\n * Builds the ORDER BY clause for functions like GROUP_CONCAT.\n * @param ctx - The function render context.\n * @returns The ORDER BY SQL clause or empty string.\n */\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n return buildGroupConcatOrderByClause(ctx);\n }\n\n /**\n * Formats the SEPARATOR clause for GROUP_CONCAT.\n * @param ctx - The function render context.\n * @returns The SEPARATOR SQL clause or empty string.\n */\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n return formatGroupConcatSeparatorClause(ctx);\n }\n\n /**\n * Gets the separator operand for GROUP_CONCAT, defaulting to comma.\n * @param ctx - The function render context.\n * @returns The separator operand.\n */\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return resolveGroupConcatSeparatorOperand(ctx);\n }\n\n /** Default separator for GROUP_CONCAT, a comma. */\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = DEFAULT_GROUP_CONCAT_SEPARATOR_LITERAL;\n}\n","import type { TableFunctionRenderer, TableFunctionStrategy } from './table-types.js';\n\nexport class StandardTableFunctionStrategy implements TableFunctionStrategy {\n protected renderers: Map<string, TableFunctionRenderer> = new Map();\n\n protected add(key: string, renderer: TableFunctionRenderer) {\n this.renderers.set(key, renderer);\n }\n\n getRenderer(key: string): TableFunctionRenderer | undefined {\n return this.renderers.get(key);\n }\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode,\r\n OrderingTerm\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n CastExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode,\r\n ArithmeticExpressionNode,\r\n BitwiseExpressionNode,\r\n CollateExpressionNode,\r\n AliasRefNode,\r\n isOperandNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.js';\nimport type { TableFunctionStrategy } from '../functions/table-types.js';\nimport { StandardTableFunctionStrategy } from '../functions/standard-table-strategy.js';\n\r\n/**\r\n * Context for SQL compilation with parameter management\r\n */\r\nexport interface CompilerContext {\r\n /** Array of parameters */\r\n params: unknown[];\r\n /** Function to add a parameter and get its placeholder */\r\n addParameter(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Result of SQL compilation\r\n */\r\nexport interface CompiledQuery {\r\n /** Generated SQL string */\r\n sql: string;\r\n /** Parameters for the query */\r\n params: unknown[];\r\n}\r\n\r\nexport interface SelectCompiler {\r\n compileSelect(ast: SelectQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface InsertCompiler {\r\n compileInsert(ast: InsertQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface UpdateCompiler {\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface DeleteCompiler {\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery;\r\n}\r\n\r\n/**\r\n * Abstract base class for SQL dialect implementations\r\n */\r\nexport abstract class Dialect\r\n implements SelectCompiler, InsertCompiler, UpdateCompiler, DeleteCompiler {\r\n /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n _ctx: CompilerContext\r\n ): string {\r\n void _ctx;\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(_index: number): string {\r\n void _index;\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(_kind: SetOperationKind): boolean {\r\n void _kind;\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\n protected readonly functionStrategy: FunctionStrategy;\n protected readonly tableFunctionStrategy: TableFunctionStrategy;\n\n protected constructor(functionStrategy?: FunctionStrategy, tableFunctionStrategy?: TableFunctionStrategy) {\n this.expressionCompilers = new Map();\n this.operandCompilers = new Map();\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\n this.tableFunctionStrategy = tableFunctionStrategy || new StandardTableFunctionStrategy();\n this.registerDefaultOperandCompilers();\n this.registerDefaultExpressionCompilers();\n }\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy, tableFunctionStrategy?: TableFunctionStrategy): Dialect {\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy, tableFunctionStrategy);\n }\n\r\n /**\r\n * Registers an expression compiler for a specific node type\r\n * @param type - Expression node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerExpressionCompiler<T extends ExpressionNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.expressionCompilers.set(type, compiler as (node: ExpressionNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Registers an operand compiler for a specific node type\r\n * @param type - Operand node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerOperandCompiler<T extends OperandNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.operandCompilers.set(type, compiler as (node: OperandNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Compiles an expression node\r\n * @param node - Expression node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL expression\r\n */\r\n protected compileExpression(node: ExpressionNode, ctx: CompilerContext): string {\r\n const compiler = this.expressionCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported expression node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an operand node\r\n * @param node - Operand node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL operand\r\n */\r\n protected compileOperand(node: OperandNode, ctx: CompilerContext): string {\r\n const compiler = this.operandCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported operand node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an ordering term (operand, expression, or alias reference).\r\n */\r\n protected compileOrderingTerm(term: OrderingTerm, ctx: CompilerContext): string {\r\n if (isOperandNode(term)) {\r\n return this.compileOperand(term, ctx);\r\n }\r\n // At this point, term must be an ExpressionNode\r\n const expr = this.compileExpression(term as ExpressionNode, ctx);\r\n return `(${expr})`;\r\n }\r\n\r\n private registerDefaultExpressionCompilers(): void {\r\n this.registerExpressionCompiler('BinaryExpression', (binary: BinaryExpressionNode, ctx) => {\r\n const left = this.compileOperand(binary.left, ctx);\r\n const right = this.compileOperand(binary.right, ctx);\r\n const base = `${left} ${binary.operator} ${right}`;\r\n if (binary.escape) {\r\n const escapeOperand = this.compileOperand(binary.escape, ctx);\r\n return `${base} ESCAPE ${escapeOperand}`;\r\n }\r\n return base;\r\n });\r\n\r\n this.registerExpressionCompiler('LogicalExpression', (logical: LogicalExpressionNode, ctx) => {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.compileExpression(op, ctx);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return parts.join(` ${logical.operator} `);\r\n });\r\n\r\n this.registerExpressionCompiler('NullExpression', (nullExpr: NullExpressionNode, ctx) => {\r\n const left = this.compileOperand(nullExpr.left, ctx);\r\n return `${left} ${nullExpr.operator}`;\r\n });\r\n\r\n this.registerExpressionCompiler('InExpression', (inExpr: InExpressionNode, ctx) => {\r\n const left = this.compileOperand(inExpr.left, ctx);\r\n if (Array.isArray(inExpr.right)) {\r\n const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\r\n }\r\n const subquerySql = this.compileSelectAst(inExpr.right.query, ctx).trim().replace(/;$/, '');\r\n return `${left} ${inExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('ExistsExpression', (existsExpr: ExistsExpressionNode, ctx) => {\r\n const subquerySql = this.compileSelectForExists(existsExpr.subquery, ctx);\r\n return `${existsExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('BetweenExpression', (betweenExpr: BetweenExpressionNode, ctx) => {\r\n const left = this.compileOperand(betweenExpr.left, ctx);\r\n const lower = this.compileOperand(betweenExpr.lower, ctx);\r\n const upper = this.compileOperand(betweenExpr.upper, ctx);\r\n return `${left} ${betweenExpr.operator} ${lower} AND ${upper}`;\r\n });\r\n\r\n this.registerExpressionCompiler('ArithmeticExpression', (arith: ArithmeticExpressionNode, ctx) => {\r\n const left = this.compileOperand(arith.left, ctx);\r\n const right = this.compileOperand(arith.right, ctx);\r\n return `${left} ${arith.operator} ${right}`;\r\n });\r\n\r\n this.registerExpressionCompiler('BitwiseExpression', (bitwise: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(bitwise.left, ctx);\r\n const right = this.compileOperand(bitwise.right, ctx);\r\n return `${left} ${bitwise.operator} ${right}`;\r\n });\r\n }\r\n\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('AliasRef', (alias: AliasRefNode, _ctx) => {\r\n void _ctx;\r\n return this.quoteIdentifier(alias.name);\r\n });\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n void _ctx;\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) =>\r\n this.compileFunctionOperand(fnNode, ctx)\r\n );\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => {\r\n void _ctx;\r\n return this.compileJsonPath(path);\r\n });\r\n\r\n this.registerOperandCompiler('ScalarSubquery', (node: ScalarSubqueryNode, ctx) => {\r\n const sql = this.compileSelectAst(node.query, ctx).trim().replace(/;$/, '');\r\n return `(${sql})`;\r\n });\r\n\r\n this.registerOperandCompiler('CaseExpression', (node: CaseExpressionNode, ctx) => {\r\n const parts = ['CASE'];\r\n for (const { when, then } of node.conditions) {\r\n parts.push(`WHEN ${this.compileExpression(when, ctx)} THEN ${this.compileOperand(then, ctx)}`);\r\n }\r\n if (node.else) {\r\n parts.push(`ELSE ${this.compileOperand(node.else, ctx)}`);\r\n }\r\n parts.push('END');\r\n return parts.join(' ');\r\n });\r\n\r\n this.registerOperandCompiler('Cast', (node: CastExpressionNode, ctx) => {\r\n const value = this.compileOperand(node.expression, ctx);\r\n return `CAST(${value} AS ${node.castType})`;\r\n });\r\n\r\n this.registerOperandCompiler('WindowFunction', (node: WindowFunctionNode, ctx) => {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause = 'PARTITION BY ' + node.partitionBy.map(col =>\r\n `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`\r\n ).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause = 'ORDER BY ' + node.orderBy.map(o => {\r\n const term = this.compileOrderingTerm(o.term, ctx);\r\n const collation = o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n }).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n });\r\n this.registerOperandCompiler('ArithmeticExpression', (node: ArithmeticExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n return `(${left} ${node.operator} ${right})`;\r\n });\r\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n return `(${left} ${node.operator} ${right})`;\r\n });\r\n this.registerOperandCompiler('Collate', (node: CollateExpressionNode, ctx) => {\r\n const expr = this.compileOperand(node.expression, ctx);\r\n return `${expr} COLLATE ${node.collation}`;\r\n });\r\n }\r\n\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(_node: JsonPathNode): string {\r\n void _node;\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n\r\n /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\r\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\r\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\r\n if (renderer) {\r\n return renderer({\r\n node: fnNode,\r\n compiledArgs,\r\n compileOperand: operand => this.compileOperand(operand, ctx)\r\n });\r\n }\r\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\r\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { OperandNode } from '../../ast/expression.js';\nimport { FunctionTableNode } from '../../ast/query.js';\nimport { SqlDialectBase } from './sql-dialect.js';\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args);\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: OperandNode) => {\r\n if (ctx && dialect) {\r\n return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string): string {\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\n return `${schemaPart}${fn.name}(${args})${ordinality}`;\n }\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n void _ctx;\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { JoinNode } from '../../ast/join.js';\r\nimport { TableSourceNode } from '../../ast/query.js';\r\nimport { ExpressionNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n static compileJoins(\r\n joins: JoinNode[] | undefined,\r\n ctx: CompilerContext,\r\n compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,\r\n compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string\r\n ): string {\r\n if (!joins || joins.length === 0) return '';\r\n const parts = joins.map(j => {\r\n const table = compileFrom(j.table, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';\r\n\r\ntype TermRenderer = (term: OrderingTerm) => string;\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param renderTerm - Function to render a grouping term.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy.map(renderTerm).join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { OrderByNode, SelectQueryNode } from '../../ast/query.js';\r\n\r\ntype NullsRenderer = (order: OrderByNode) => string | undefined;\r\ntype CollationRenderer = (order: OrderByNode) => string | undefined;\r\ntype TermRenderer = (term: OrderByNode['term']) => string;\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param renderTerm - Function to render an ordering term.\r\n * @param renderNulls - Optional function to render NULLS FIRST/LAST.\r\n * @param renderCollation - Optional function to render COLLATE clause.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(\r\n ast: SelectQueryNode,\r\n renderTerm: TermRenderer,\r\n renderNulls?: NullsRenderer,\r\n renderCollation?: CollationRenderer\r\n ): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy.map(o => {\r\n const term = renderTerm(o.term);\r\n const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n }).join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\nimport {\n SelectQueryNode,\n InsertQueryNode,\n UpdateQueryNode,\n DeleteQueryNode,\n InsertSourceNode,\n TableSourceNode,\n DerivedTableNode,\n FunctionTableNode,\n OrderByNode,\n TableNode\n} from '../../ast/query.js';\nimport { ColumnNode, OperandNode } from '../../ast/expression.js';\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\nimport { CteCompiler } from './cte-compiler.js';\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\nimport { JoinCompiler } from './join-compiler.js';\nimport { GroupByCompiler } from './groupby-compiler.js';\nimport { OrderByCompiler } from './orderby-compiler.js';\n\n\n/**\n * Base class for SQL dialects.\n * Provides a common framework for compiling AST nodes into SQL strings.\n * Specific dialects should extend this class and implement dialect-specific logic.\n */\nexport abstract class SqlDialectBase extends Dialect {\n abstract quoteIdentifier(id: string): string;\n\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\n\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\n const ctes = CteCompiler.compileCtes(\n ast,\n ctx,\n this.quoteIdentifier.bind(this),\n this.compileSelectAst.bind(this),\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\n this.stripTrailingSemicolon.bind(this)\n );\n const baseAst: SelectQueryNode = hasSetOps\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\n : ast;\n const baseSelect = this.compileSelectCore(baseAst, ctx);\n if (!hasSetOps) {\n return `${ctes}${baseSelect}`;\n }\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\n }\n\n private compileSelectWithSetOps(\n ast: SelectQueryNode,\n baseSelect: string,\n ctes: string,\n ctx: CompilerContext\n ): string {\n const compound = ast.setOps!\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\n .join(' ');\n const orderBy = OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\n return `${ctes}${combined}${orderBy}${pagination}`;\n }\n\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\n if (!ast.columns.length) {\n throw new Error('INSERT queries must specify columns.');\n }\n\n const table = this.compileTableName(ast.into);\n const columnList = this.compileInsertColumnList(ast.columns);\n const source = this.compileInsertSource(ast.source, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `INSERT INTO ${table} (${columnList}) ${source}${returning}`;\n }\n\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n return this.returningStrategy.compileReturning(returning, ctx);\n }\n\n private compileInsertSource(source: InsertSourceNode, ctx: CompilerContext): string {\n if (source.type === 'InsertValues') {\n if (!source.rows.length) {\n throw new Error('INSERT ... VALUES requires at least one row.');\n }\n const values = source.rows\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\n .join(', ');\n return `VALUES ${values}`;\n }\n\n const normalized = this.normalizeSelectAst(source.query);\n return this.compileSelectAst(normalized, ctx).trim();\n }\n\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = this.compileSelectColumns(ast, ctx);\n const from = this.compileFrom(ast.from, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n const whereClause = this.compileWhere(ast.where, ctx);\n const groupBy = GroupByCompiler.compileGroupBy(ast, term => this.compileOrderingTerm(term, ctx));\n const having = this.compileHaving(ast, ctx);\n const orderBy = OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\n }\n\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\n const target = this.compileTableReference(ast.table);\n const assignments = this.compileUpdateAssignments(ast.set, ast.table, ctx);\n const fromClause = this.compileUpdateFromClause(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `UPDATE ${target} SET ${assignments}${fromClause}${whereClause}${returning}`;\n }\n\n private compileUpdateAssignments(\n assignments: { column: ColumnNode; value: OperandNode }[],\n table: TableNode,\n ctx: CompilerContext\n ): string {\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.compileQualifiedColumn(col, table);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\n protected compileQualifiedColumn(column: ColumnNode, table: TableNode): string {\n const baseTableName = table.name;\n const alias = table.alias;\n const columnTable = column.table ?? alias ?? baseTableName;\n const tableQualifier =\n alias && column.table === baseTableName ? alias : columnTable;\n\n if (!tableQualifier) {\n return this.quoteIdentifier(column.name);\n }\n\n return `${this.quoteIdentifier(tableQualifier)}.${this.quoteIdentifier(column.name)}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n const target = this.compileTableReference(ast.from);\n const usingClause = this.compileDeleteUsingClause(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE FROM ${target}${usingClause}${whereClause}${returning}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\n }\n\n protected compileDistinct(ast: SelectQueryNode): string {\n return ast.distinct ? 'DISTINCT ' : '';\n }\n\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\n return ast.columns.map(c => {\n const expr = this.compileOperand(c, ctx);\n if (c.alias) {\n if (c.alias.includes('(')) return c.alias;\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\n }\n return expr;\n }).join(', ');\n }\n\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n const key = fn.key ?? fn.name;\n\n if (ctx) {\n const renderer = this.tableFunctionStrategy.getRenderer(key);\n if (renderer) {\n const compiledArgs = (fn.args ?? []).map(arg => this.compileOperand(arg, ctx));\n return renderer({\n node: fn,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx),\n quoteIdentifier: this.quoteIdentifier.bind(this)\n });\n }\n\n if (fn.key) {\n throw new Error(`Table function \"${key}\" is not supported by dialect \"${this.dialect}\".`);\n }\n }\n\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string; alias?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\n protected compileTableReference(table: { name: string; schema?: string; alias?: string }): string {\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileUpdateFromClause(ast: UpdateQueryNode, ctx: CompilerContext): string {\n if (!ast.from && (!ast.joins || ast.joins.length === 0)) return '';\n if (!ast.from) {\n throw new Error('UPDATE with JOINs requires an explicit FROM clause.');\n }\n const from = this.compileFrom(ast.from, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n return ` FROM ${from}${joins}`;\n }\n\n private compileDeleteUsingClause(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (!ast.using && (!ast.joins || ast.joins.length === 0)) return '';\n if (!ast.using) {\n throw new Error('DELETE with JOINs requires a USING clause.');\n }\n const usingTable = this.compileFrom(ast.using, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n return ` USING ${usingTable}${joins}`;\n }\n\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.having) return '';\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\n }\n\n protected stripTrailingSemicolon(sql: string): string {\n return sql.trim().replace(/;$/, '');\n }\n\n protected wrapSetOperand(sql: string): string {\n const trimmed = this.stripTrailingSemicolon(sql);\n return `(${trimmed})`;\n }\n\n protected renderOrderByNulls(order: OrderByNode): string | undefined {\n return order.nulls ? ` NULLS ${order.nulls}` : '';\n }\n\n protected renderOrderByCollation(order: OrderByNode): string | undefined {\n return order.collation ? ` COLLATE ${order.collation}` : '';\n }\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * PostgreSQL specific function strategy.\r\n * Implements and overrides SQL function compilation rules for PostgreSQL.\r\n */\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATE_TRUNC('${partClean}', ${date})`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const orderClause = this.buildOrderByExpression(ctx);\r\n const orderSegment = orderClause ? ` ${orderClause}` : '';\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\r\n });\r\n\r\n this.add('CHR', ({ compiledArgs }) => `CHR(${compiledArgs[0]})`);\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `EXTRACT(HOUR FROM ${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `EXTRACT(MINUTE FROM ${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `EXTRACT(SECOND FROM ${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `EXTRACT(QUARTER FROM ${compiledArgs[0]})`);\n\n this.add('JSON_LENGTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('JSON_LENGTH expects 1 argument on PostgreSQL');\n return `jsonb_array_length(${compiledArgs[0]})`;\n });\n\n this.add('JSON_ARRAYAGG', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('JSON_ARRAYAGG expects 1 argument on PostgreSQL');\n return `jsonb_agg(${compiledArgs[0]})`;\n });\n\n this.add('JSON_CONTAINS', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('JSON_CONTAINS expects 2 arguments on PostgreSQL');\n return `(${compiledArgs[0]}::jsonb @> ${compiledArgs[1]}::jsonb)`;\n });\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments on PostgreSQL');\n return `array_append(${compiledArgs[0]}, ${compiledArgs[1]})`;\n });\n\n this.add('JSON_SET', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 3) throw new Error('JSON_SET expects exactly 3 arguments on PostgreSQL');\n const pathNode = node.args[1];\n if (pathNode.type !== 'Literal') {\n throw new Error('PostgreSQL JSON_SET currently supports literal paths only');\n }\n const pathArray = this.formatJsonbPathArray(pathNode);\n return `jsonb_set(${compiledArgs[0]}, ${pathArray}, ${compiledArgs[2]}::jsonb, true)`;\n });\n }\n\n private formatJsonbPathArray(pathNode: LiteralNode): string {\n const rawPath = String(pathNode.value ?? '');\n if (!rawPath.startsWith('$')) {\n throw new Error('PostgreSQL JSON_SET paths must start with \"$\"');\n }\n const trimmed = rawPath === '$' ? '' : rawPath.startsWith('$.') ? rawPath.slice(2) : rawPath.slice(1);\n if (!trimmed) {\n throw new Error('PostgreSQL JSON_SET requires a non-root path');\n }\n if (trimmed.includes('[') || trimmed.includes(']')) {\n throw new Error('PostgreSQL JSON_SET currently only supports simple dot-separated paths');\n }\n const segments = trimmed\n .split('.')\n .map(segment => segment.replace(/^['\"]?/, '').replace(/['\"]?$/, '').trim())\n .filter(Boolean);\n if (!segments.length) {\n throw new Error('PostgreSQL JSON_SET requires at least one path segment');\n }\n const escapedSegments = segments.map(segment => `'${segment.replace(/'/g, \"''\")}'`);\n return `ARRAY[${escapedSegments.join(', ')}]`;\n }\n}\n","import { StandardTableFunctionStrategy } from '../../functions/standard-table-strategy.js';\n\nexport class PostgresTableFunctionStrategy extends StandardTableFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\n private registerOverrides() {\n this.add('ARRAY_UNNEST', ({ node, compiledArgs, quoteIdentifier }) => {\n const lateral = node.lateral ?? true;\n const withOrd = node.withOrdinality ?? false;\n const base = `unnest(${compiledArgs.join(', ')})${withOrd ? ' WITH ORDINALITY' : ''}`;\n\n if (node.columnAliases?.length && !node.alias) {\n throw new Error('tvf(ARRAY_UNNEST) with columnAliases requires an alias.');\n }\n\n const alias = node.alias ? ` AS ${quoteIdentifier(node.alias)}` : '';\n const cols = node.columnAliases?.length\n ? `(${node.columnAliases.map(quoteIdentifier).join(', ')})`\n : '';\n\n return `${lateral ? 'LATERAL ' : ''}${base}${alias}${cols}`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode, BitwiseExpressionNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\nimport { PostgresFunctionStrategy } from './functions.js';\nimport { PostgresTableFunctionStrategy } from './table-functions.js';\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy(), new PostgresTableFunctionStrategy());\n this.registerExpressionCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n const op = node.operator === '^' ? '#' : node.operator;\r\n return `${left} ${op} ${right}`;\r\n });\r\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n const op = node.operator === '^' ? '#' : node.operator;\r\n return `(${left} ${op} ${right})`;\r\n });\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n void ctx;\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * MySQL/MariaDB specific function strategy.\r\n * Implements and overrides SQL function compilation rules for MySQL.\r\n */\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `HOUR(${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `MINUTE(${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `SECOND(${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `QUARTER(${compiledArgs[0]})`);\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments (array, value)');\n return `JSON_ARRAY_APPEND(${compiledArgs[0]}, '$', ${compiledArgs[1]})`;\n });\n }\n}\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * SQLite specific function strategy.\r\n * Implements and overrides SQL function compilation rules for SQLite.\r\n */\r\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n return `GROUP_CONCAT(${arg}, ${separator})`;\r\n });\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `CAST(strftime('%H', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('MINUTE', ({ compiledArgs }) => `CAST(strftime('%M', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('SECOND', ({ compiledArgs }) => `CAST(strftime('%S', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('QUARTER', ({ compiledArgs }) => `((CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER) + 2) / 3)`);\n\n this.add('JSON_LENGTH', ({ compiledArgs }) => {\n if (compiledArgs.length === 0 || compiledArgs.length > 2) {\n throw new Error('JSON_LENGTH expects 1 or 2 arguments on SQLite');\n }\n return `json_array_length(${compiledArgs.join(', ')})`;\n });\n\n this.add('JSON_ARRAYAGG', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) {\n throw new Error('JSON_ARRAYAGG expects 1 argument on SQLite');\n }\n return `json_group_array(${compiledArgs[0]})`;\n });\n\n this.add('JSON_CONTAINS', () => {\n throw new Error('JSON_CONTAINS is not supported on SQLite');\n });\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments (array, value)');\n return `json_array_append(${compiledArgs[0]}, '$', ${compiledArgs[1]})`;\n });\n\n this.add('CHR', ({ compiledArgs }) => `CHAR(${compiledArgs[0]})`);\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode, BitwiseExpressionNode } from '../../ast/expression.js';\nimport { TableNode } from '../../ast/query.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\nimport { SqliteFunctionStrategy } from './functions.js';\n\n/**\n * SQLite dialect implementation\n */\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n this.registerExpressionCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\n const left = this.compileOperand(node.left, ctx);\n const right = this.compileOperand(node.right, ctx);\n if (node.operator === '^') {\n return `(${left} | ${right}) & ~(${left} & ${right})`;\n }\n return `${left} ${node.operator} ${right}`;\n });\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\n const left = this.compileOperand(node.left, ctx);\n const right = this.compileOperand(node.right, ctx);\n if (node.operator === '^') {\n return `((${left} | ${right}) & ~(${left} & ${right}))`;\n }\n return `(${left} ${node.operator} ${right})`;\n });\n }\n\n /**\n * Quotes an identifier using SQLite double-quote syntax\n * @param id - Identifier to quote\n * @returns Quoted identifier\n */\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n /**\n * Compiles JSON path expression using SQLite syntax\n * @param node - JSON path node\n * @returns SQLite JSON path expression\n */\n protected compileJsonPath(node: JsonPathNode): string {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // SQLite uses json_extract(col, '$.path')\n return `json_extract(${col}, '${node.path}')`;\n }\n\n protected compileQualifiedColumn(column: ColumnNode, _table: TableNode): string {\n void _table;\n return this.quoteIdentifier(column.name);\n }\n\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n void ctx;\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\n supportsReturning(): boolean {\n return true;\n }\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * Microsoft SQL Server specific function strategy.\r\n * Implements and overrides SQL function compilation rules for MSSQL.\r\n */\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `DATEPART(wk, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQL Server 2022+ has DATETRUNC\r\n return `DATETRUNC(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n const orderClause = this.buildOrderByExpression(ctx);\r\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\r\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\r\n });\r\n\r\n this.add('LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('CHAR_LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('CHARACTER_LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('POSITION', ({ compiledArgs }) => `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('LOCATE', ({ compiledArgs }) => compiledArgs.length === 3 ? `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` : `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('INSTR', ({ compiledArgs }) => `CHARINDEX(${compiledArgs[1]}, ${compiledArgs[0]})`);\r\n this.add('CHR', ({ compiledArgs }) => `CHAR(${compiledArgs[0]})`);\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `DATEPART(hour, ${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `DATEPART(minute, ${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `DATEPART(second, ${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `DATEPART(quarter, ${compiledArgs[0]})`);\n\n this.add('JSON_SET', ({ compiledArgs }) => {\n if (compiledArgs.length !== 3) throw new Error('JSON_SET expects 3 arguments on SQL Server');\n return `JSON_MODIFY(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})`;\n });\n\n this.add('JSON_LENGTH', () => {\n throw new Error('JSON_LENGTH is not supported on SQL Server');\n });\n\n this.add('JSON_ARRAYAGG', () => {\n throw new Error('JSON_ARRAYAGG is not supported on SQL Server');\n });\n\n this.add('JSON_CONTAINS', () => {\n throw new Error('JSON_CONTAINS is not supported on SQL Server');\n });\n\n this.add('ARRAY_APPEND', () => {\n throw new Error('ARRAY_APPEND is not supported on SQL Server');\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\nimport {\n SelectQueryNode,\n DeleteQueryNode\n} from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { OrderByCompiler } from '../base/orderby-compiler.js';\nimport { JoinCompiler } from '../base/join-compiler.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * Microsoft SQL Server dialect implementation\n */\nexport class SqlServerDialect extends SqlDialectBase {\n protected readonly dialect = 'mssql';\n /**\n * Creates a new SqlServerDialect instance\n */\n public constructor() {\n super(new MssqlFunctionStrategy());\n }\n\n /**\n * Quotes an identifier using SQL Server bracket syntax\n * @param id - Identifier to quote\n * @returns Quoted identifier\n */\n quoteIdentifier(id: string): string {\n return `[${id}]`;\n }\n\n /**\n * Compiles JSON path expression using SQL Server syntax\n * @param node - JSON path node\n * @returns SQL Server JSON path expression\n */\n protected compileJsonPath(node: JsonPathNode): string {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // SQL Server uses JSON_VALUE(col, '$.path')\n return `JSON_VALUE(${col}, '${node.path}')`;\n }\n\n /**\n * Formats parameter placeholders using SQL Server named parameter syntax\n * @param index - Parameter index\n * @returns Named parameter placeholder\n */\n protected formatPlaceholder(index: number): string {\n return `@p${index}`;\n }\n\n /**\n * Compiles SELECT query AST to SQL Server SQL\n * @param ast - Query AST\n * @param ctx - Compiler context\n * @returns SQL Server SQL string\n */\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\n const ctes = this.compileCtes(ast, ctx);\n\n const baseAst: SelectQueryNode = hasSetOps\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\n : ast;\n\n const baseSelect = this.compileSelectCoreForMssql(baseAst, ctx);\n\n if (!hasSetOps) {\n return `${ctes}${baseSelect}`;\n }\n\n const compound = ast.setOps!\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\n .join(' ');\n\n const orderBy = this.compileOrderBy(ast, ctx);\n const pagination = this.compilePagination(ast, orderBy);\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\n const tail = pagination || orderBy;\n return `${ctes}${combined}${tail}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (ast.using) {\n throw new Error('DELETE ... USING is not supported in the MSSQL dialect; use join() instead.');\n }\n\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\n\n const alias = ast.from.alias ?? ast.from.name;\n const target = this.compileTableReference(ast.from);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE ${this.quoteIdentifier(alias)} FROM ${target}${joins}${whereClause}${returning}`;\n }\n\n private compileSelectCoreForMssql(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = ast.columns.map(c => {\n // Default to full operand compilation for all projection node types (Function, Column, Cast, Case, Window, etc)\n const expr = c.type === 'Column'\n ? `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`\n : this.compileOperand(c as unknown as import('../../ast/expression.js').OperandNode, ctx);\n\n if (c.alias) {\n if (c.alias.includes('(')) return c.alias;\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\n }\n return expr;\n }).join(', ');\n\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileFrom(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileFrom(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\n\n const groupBy = ast.groupBy && ast.groupBy.length > 0\n ? ' GROUP BY ' + ast.groupBy.map(term => this.compileOrderingTerm(term, ctx)).join(', ')\n : '';\n\n const having = ast.having\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\n : '';\n\n const orderBy = this.compileOrderBy(ast, ctx);\n const pagination = this.compilePagination(ast, orderBy);\n\n if (pagination) {\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\n }\n\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\n }\n\n private compileOrderBy(ast: SelectQueryNode, ctx: CompilerContext): string {\n return OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n }\n\n private compilePagination(ast: SelectQueryNode, orderBy: string): string {\n const hasLimit = ast.limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n if (!hasLimit && !hasOffset) return '';\n\n const off = ast.offset ?? 0;\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.ctes || ast.ctes.length === 0) return '';\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\n const defs = ast.ctes.map(cte => {\n const name = this.quoteIdentifier(cte.name);\n const cols = cte.columns ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})` : '';\n const query = this.compileSelectAst(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\n return `${name}${cols} AS (${query})`;\n }).join(', ');\n return `WITH ${defs} `;\n }\n\n}\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport {\n SelectQueryNode,\n CommonTableExpressionNode,\n OrderByNode,\n SetOperationNode,\n TableSourceNode,\n OrderingTerm\n} from '../core/ast/query.js';\nimport { createTableNode } from '../core/ast/builders.js';\nimport {\n ColumnNode,\n ExpressionNode,\n FunctionNode,\n ScalarSubqueryNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode\n} from '../core/ast/expression.js';\nimport { JoinNode } from '../core/ast/join.js';\n\n/**\n * Node types that can be used in query projections\n */\nexport type ProjectionNode =\n | ColumnNode\n | FunctionNode\n | ScalarSubqueryNode\n | CaseExpressionNode\n | CastExpressionNode\n | WindowFunctionNode;\n\n/**\n * Manages the state of a SELECT query being built\n */\nexport class SelectQueryState {\n /**\n * Table definition for the query\n */\n public readonly table: TableDef;\n /**\n * Abstract Syntax Tree (AST) representation of the query\n */\n public readonly ast: SelectQueryNode;\n\n /**\n * Creates a new SelectQueryState instance\n * @param table - Table definition\n * @param ast - Optional existing AST\n */\n constructor(table: TableDef, ast?: SelectQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'SelectQuery',\n from: createTableNode(table),\n columns: [],\n joins: []\n };\n }\n\n /**\n * Creates a new SelectQueryState with updated AST\n * @param nextAst - Updated AST\n * @returns New SelectQueryState instance\n */\n private clone(nextAst: SelectQueryNode): SelectQueryState {\n return new SelectQueryState(this.table, nextAst);\n }\n\n /**\n * Adds columns to the query\n * @param newCols - Columns to add\n * @returns New SelectQueryState with added columns\n */\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n columns: [...(this.ast.columns ?? []), ...newCols]\n });\n }\n\n /**\n * Adds a join to the query\n * @param join - Join node to add\n * @returns New SelectQueryState with added join\n */\n withJoin(join: JoinNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\n /**\n * Adds a WHERE clause to the query\n * @param predicate - WHERE predicate expression\n * @returns New SelectQueryState with WHERE clause\n */\n withWhere(predicate: ExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n where: predicate\n });\n }\n\n /**\n * Adds a HAVING clause to the query\n * @param predicate - HAVING predicate expression\n * @returns New SelectQueryState with HAVING clause\n */\n withHaving(predicate: ExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n having: predicate\n });\n }\n\n /**\n * Adds GROUP BY columns to the query\n * @param columns - Terms to group by\n * @returns New SelectQueryState with GROUP BY clause\n */\n withGroupBy(columns: OrderingTerm[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\n });\n }\n\n /**\n * Adds ORDER BY clauses to the query\n * @param orderBy - ORDER BY nodes\n * @returns New SelectQueryState with ORDER BY clause\n */\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\n });\n }\n\n /**\n * Adds DISTINCT columns to the query\n * @param columns - Columns to make distinct\n * @returns New SelectQueryState with DISTINCT clause\n */\n withDistinct(columns: ColumnNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n distinct: [...(this.ast.distinct ?? []), ...columns]\n });\n }\n\n /**\n * Adds a LIMIT clause to the query\n * @param limit - Maximum number of rows to return\n * @returns New SelectQueryState with LIMIT clause\n */\n withLimit(limit: number): SelectQueryState {\n return this.clone({\n ...this.ast,\n limit\n });\n }\n\n /**\n * Adds an OFFSET clause to the query\n * @param offset - Number of rows to skip\n * @returns New SelectQueryState with OFFSET clause\n */\n withOffset(offset: number): SelectQueryState {\n return this.clone({\n ...this.ast,\n offset\n });\n }\n\n /**\n * Adds a Common Table Expression (CTE) to the query\n * @param cte - CTE node to add\n * @returns New SelectQueryState with CTE\n */\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n ctes: [...(this.ast.ctes ?? []), cte]\n });\n }\n\n /**\n * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query\n * @param op - Set operation node to add\n * @returns New SelectQueryState with set operation\n */\n withSetOperation(op: SetOperationNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n setOps: [...(this.ast.setOps ?? []), op]\n });\n }\n}\n","import { JoinNode } from './join.js';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? (parseQualifiedTableRef(tableName) as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n\n/**\n * Parses a simple qualified reference like `schema.table` into a structured TableNode.\n *\n * Notes:\n * - We intentionally only support a single dot here.\n * - For multi-part qualification (server/db/schema/table), callers should pass a TableNode.\n */\nconst parseQualifiedTableRef = (ref: string): TableNode => {\n const parts = ref.split('.');\n if (parts.length === 2) {\n const [schema, name] = parts;\n return { type: 'Table', schema, name };\n }\n return { type: 'Table', name: ref };\n};\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\n/**\n * Manages hydration planning for query results\n */\nexport class HydrationManager {\n /**\n * Creates a new HydrationManager instance\n * @param table - Table definition\n * @param planner - Hydration planner\n */\n constructor(\n private readonly table: TableDef,\n private readonly planner: HydrationPlanner\n ) { }\n\n /**\n * Creates a new HydrationManager with updated planner\n * @param nextPlanner - Updated hydration planner\n * @returns New HydrationManager instance\n */\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\n return new HydrationManager(this.table, nextPlanner);\n }\n\n /**\n * Handles column selection for hydration planning\n * @param state - Current query state\n * @param newColumns - Newly selected columns\n * @returns Updated HydrationManager with captured columns\n */\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\n const updated = this.planner.captureRootColumns(newColumns);\n return this.clone(updated);\n }\n\n /**\n * Handles relation inclusion for hydration planning\n * @param state - Current query state\n * @param relation - Relation definition\n * @param relationName - Name of the relation\n * @param aliasPrefix - Alias prefix for the relation\n * @param targetColumns - Target columns to include\n * @returns Updated HydrationManager with included relation\n */\n onRelationIncluded(\n state: SelectQueryState,\n relation: RelationDef,\n relationName: string,\n aliasPrefix: string,\n targetColumns: string[],\n pivot?: { aliasPrefix: string; columns: string[] }\n ): HydrationManager {\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\n return this.clone(next);\n }\n\n /**\n * Applies hydration plan to the AST\n * @param ast - Query AST to modify\n * @returns AST with hydration metadata\n */\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\n // Hydration is not applied to compound set queries since row identity is ambiguous.\n if (ast.setOps && ast.setOps.length > 0) {\n return ast;\n }\n\n const plan = this.planner.getPlan();\n if (!plan) return ast;\n\n const needsPaginationGuard = this.requiresParentPagination(ast, plan);\n const rewritten = needsPaginationGuard ? this.wrapForParentPagination(ast, plan) : ast;\n return this.attachHydrationMeta(rewritten, plan);\n }\n\n /**\n * Gets the current hydration plan\n * @returns Hydration plan or undefined if none exists\n */\n getPlan(): HydrationPlan | undefined {\n return this.planner.getPlan();\n }\n\n /**\n * Attaches hydration metadata to a query AST node.\n */\n private attachHydrationMeta(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n return {\n ...ast,\n meta: {\n ...(ast.meta || {}),\n hydration: plan\n }\n };\n }\n\n /**\n * Determines whether the query needs pagination rewriting to keep LIMIT/OFFSET\n * applied to parent rows when eager-loading multiplicative relations.\n */\n private requiresParentPagination(ast: SelectQueryNode, plan: HydrationPlan): boolean {\n const hasPagination = ast.limit !== undefined || ast.offset !== undefined;\n return hasPagination && this.hasMultiplyingRelations(plan);\n }\n\n /**\n * Checks if the hydration plan contains relations that multiply rows\n * @param plan - Hydration plan to check\n * @returns True if plan has HasMany or BelongsToMany relations\n */\n private hasMultiplyingRelations(plan: HydrationPlan): boolean {\n return plan.relations.some(\n rel => rel.type === RelationKinds.HasMany || rel.type === RelationKinds.BelongsToMany\n );\n }\n\n /**\n * Rewrites the query using CTEs so LIMIT/OFFSET target distinct parent rows\n * instead of the joined result set.\n *\n * The strategy:\n * - Hoist the original query (minus limit/offset) into a base CTE.\n * - Select distinct parent ids from that base CTE with the original ordering and pagination.\n * - Join the base CTE against the paged ids to retrieve the joined rows for just that page.\n */\n private wrapForParentPagination(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n const projectionNames = this.getProjectionNames(ast.columns);\n if (!projectionNames) {\n return ast;\n }\n\n const projectionAliases = this.buildProjectionAliasMap(ast.columns);\n const projectionSet = new Set(projectionNames);\n const rootPkAlias = projectionAliases.get(`${plan.rootTable}.${plan.rootPrimaryKey}`) ?? plan.rootPrimaryKey;\n\n const baseCteName = this.nextCteName(ast.ctes, '__metal_pagination_base');\n const baseQuery: SelectQueryNode = {\n ...ast,\n ctes: undefined,\n limit: undefined,\n offset: undefined,\n orderBy: undefined,\n meta: undefined\n };\n\n const baseCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: baseCteName,\n query: baseQuery,\n recursive: false\n };\n\n const orderBy = this.mapOrderBy(ast.orderBy, plan, projectionAliases, baseCteName, projectionSet);\n // When an order-by uses child-table columns we cannot safely rewrite pagination,\n // so preserve the original query to avoid changing semantics.\n if (orderBy === null) {\n return ast;\n }\n\n const pageCteName = this.nextCteName([...(ast.ctes ?? []), baseCte], '__metal_pagination_page');\n const pagingColumns = this.buildPagingColumns(rootPkAlias, orderBy, baseCteName);\n\n const pageCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: pageCteName,\n query: {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: pagingColumns,\n joins: [],\n distinct: [{ type: 'Column', table: baseCteName, name: rootPkAlias }],\n orderBy,\n limit: ast.limit,\n offset: ast.offset\n },\n recursive: false\n };\n\n const joinCondition = eq(\n { type: 'Column', table: baseCteName, name: rootPkAlias },\n { type: 'Column', table: pageCteName, name: rootPkAlias }\n );\n\n const outerColumns: ColumnNode[] = projectionNames.map(name => ({\n type: 'Column',\n table: baseCteName,\n name,\n alias: name\n }));\n\n return {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: outerColumns,\n joins: [createJoinNode(JOIN_KINDS.INNER, pageCteName, joinCondition)],\n orderBy,\n ctes: [...(ast.ctes ?? []), baseCte, pageCte]\n };\n }\n\n /**\n * Generates a unique CTE name by appending a suffix if needed\n * @param existing - Existing CTE nodes\n * @param baseName - Base name for the CTE\n * @returns Unique CTE name\n */\n private nextCteName(existing: CommonTableExpressionNode[] | undefined, baseName: string): string {\n const names = new Set((existing ?? []).map(cte => cte.name));\n let candidate = baseName;\n let suffix = 1;\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `${baseName}_${suffix}`;\n }\n\n return candidate;\n }\n\n /**\n * Extracts projection names from column nodes\n * @param columns - Projection nodes\n * @returns Array of names or undefined if any column lacks name/alias\n */\n private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const node = col as { alias?: string; name?: string };\n const alias = node.alias ?? node.name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\n\n /**\n * Builds a map of column keys to their aliases from projection nodes\n * @param columns - Projection nodes\n * @returns Map of 'table.name' to alias\n */\n private buildProjectionAliasMap(columns: ProjectionNode[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const col of columns) {\n if ((col as ColumnNode).type !== 'Column') continue;\n const node = col as ColumnNode;\n const key = `${node.table}.${node.name}`;\n map.set(key, node.alias ?? node.name);\n }\n return map;\n }\n\n /**\n * Maps order by nodes to use base CTE alias\n * @param orderBy - Original order by nodes\n * @param plan - Hydration plan\n * @param projectionAliases - Map of column aliases\n * @param baseAlias - Base CTE alias\n * @param availableColumns - Set of available column names\n * @returns Mapped order by nodes, null if cannot map\n */\n private mapOrderBy(\n orderBy: OrderByNode[] | undefined,\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode[] | undefined | null {\n if (!orderBy || orderBy.length === 0) {\n return undefined;\n }\n\n const mapped: OrderByNode[] = [];\n\n for (const ob of orderBy) {\n const mappedTerm = this.mapOrderingTerm(ob.term, plan, projectionAliases, baseAlias, availableColumns);\n if (!mappedTerm) return null;\n\n mapped.push({ ...ob, term: mappedTerm });\n }\n\n return mapped;\n }\n\n /**\n * Maps a single ordering term to use base CTE alias\n * @param term - Ordering term to map\n * @param plan - Hydration plan\n * @param projectionAliases - Map of column aliases\n * @param baseAlias - Base CTE alias\n * @param availableColumns - Set of available column names\n * @returns Mapped term or null if cannot map\n */\n private mapOrderingTerm(\n term: OrderByNode['term'],\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode['term'] | null {\n if (term.type === 'Column') {\n const col = term as ColumnNode;\n if (col.table !== plan.rootTable) return null;\n const alias = projectionAliases.get(`${col.table}.${col.name}`) ?? col.name;\n if (!availableColumns.has(alias)) return null;\n return { type: 'Column', table: baseAlias, name: alias };\n }\n\n if (term.type === 'AliasRef') {\n const aliasName = term.name;\n if (!availableColumns.has(aliasName)) return null;\n return { type: 'Column', table: baseAlias, name: aliasName };\n }\n\n return null;\n }\n\n /**\n * Builds column nodes for paging CTE\n * @param primaryKey - Primary key name\n * @param orderBy - Order by nodes\n * @param tableAlias - Table alias for columns\n * @returns Array of column nodes for paging\n */\n private buildPagingColumns(primaryKey: string, orderBy: OrderByNode[] | undefined, tableAlias: string): ColumnNode[] {\n const columns: ColumnNode[] = [{ type: 'Column', table: tableAlias, name: primaryKey, alias: primaryKey }];\n\n if (!orderBy) return columns;\n\n for (const ob of orderBy) {\n const term = ob.term as ColumnNode;\n if (!columns.some(col => col.name === term.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: term.name,\n alias: term.name\n });\n }\n }\n\n return columns;\n }\n}\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n * @param relationName - The name of the relation\n * @param columnName - The name of the column within the relation\n * @returns A relation alias string in the format \"relationName__columnName\"\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n * @param alias - The relation alias string to parse\n * @returns Parsed relation alias parts or null if not a valid relation alias\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n * @param alias - The alias string to check\n * @returns True if the alias follows the relation alias pattern\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n * @param rel - The BelongsToMany relation definition\r\n * @param pivotPk - The primary key column name of the pivot table\r\n * @returns Array of column names that can be included in pivot table selections\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n *\r\n * @param col - Raw column expression string (e.g., \"column\", \"table.column\", \"COUNT(column)\")\r\n * @param tableName - Default table name to use when no table is specified\r\n * @param ctes - Optional array of CTEs for context when parsing column references\r\n * @returns A ColumnNode representing the parsed column expression\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [_fn, rest] = col.split('(');\r\n void _fn;\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport { ColumnDef } from '../schema/column-types.js';\nimport {\n SelectQueryNode,\n CommonTableExpressionNode,\n SetOperationKind,\n SetOperationNode,\n TableSourceNode,\n OrderingTerm\n} from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\nimport {\n AliasRefNode,\n ColumnNode,\n ExpressionNode,\n FunctionNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode,\n ScalarSubqueryNode,\n and,\n isExpressionSelectionNode,\n isOperandNode\n} from '../core/ast/expression.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\nimport { OrderDirection } from '../core/sql/sql.js';\nimport { parseRawColumn } from './raw-column-parser.js';\n\n/**\n * Result of column selection operation\n */\nexport interface ColumnSelectionResult {\n /**\n * Updated query state\n */\n state: SelectQueryState;\n /**\n * Columns that were added\n */\n addedColumns: ProjectionNode[];\n}\n\n/**\n * Service for manipulating query AST (Abstract Syntax Tree)\n */\nexport class QueryAstService {\n /**\n * Creates a new QueryAstService instance\n * @param table - Table definition\n * @param state - Current query state\n */\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) { }\n\n /**\n * Selects columns for the query\n * @param columns - Columns to select (key: alias, value: column definition or expression)\n * @returns Column selection result with updated state and added columns\n */\n select(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\n /**\n * Selects raw column expressions (best-effort parser for simple references/functions)\n * @param cols - Raw column expressions\n * @returns Column selection result with updated state and added columns\n */\n selectRaw(cols: string[]): ColumnSelectionResult {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\n /**\n * Adds a Common Table Expression (CTE) to the query\n * @param name - Name of the CTE\n * @param query - Query for the CTE\n * @param columns - Optional column names for the CTE\n * @param recursive - Whether the CTE is recursive\n * @returns Updated query state with CTE\n */\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\n const cte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name,\n query,\n columns,\n recursive\n };\n\n return this.state.withCte(cte);\n }\n\n /**\n * Adds a set operation (UNION/UNION ALL/INTERSECT/EXCEPT) to the query\n * @param operator - Set operator\n * @param query - Right-hand side query\n * @returns Updated query state with set operation\n */\n withSetOperation(operator: SetOperationKind, query: SelectQueryNode): SelectQueryState {\n const op: SetOperationNode = {\n type: 'SetOperation',\n operator,\n query\n };\n return this.state.withSetOperation(op);\n }\n\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\n /**\n * Selects a subquery as a column\n * @param alias - Alias for the subquery\n * @param query - Subquery to select\n * @returns Updated query state with subquery selection\n */\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\n return this.state.withColumns([node]);\n }\n\n /**\n * Adds a JOIN clause to the query\n * @param join - Join node to add\n * @returns Updated query state with JOIN\n */\n withJoin(join: JoinNode): SelectQueryState {\n return this.state.withJoin(join);\n }\n\n /**\n * Adds a WHERE clause to the query\n * @param expr - Expression for the WHERE clause\n * @returns Updated query state with WHERE clause\n */\n withWhere(expr: ExpressionNode): SelectQueryState {\n const combined = this.combineExpressions(this.state.ast.where, expr);\n return this.state.withWhere(combined);\n }\n\n /**\n * Adds a GROUP BY clause to the query\n * @param col - Column to group by\n * @returns Updated query state with GROUP BY clause\n */\n withGroupBy(col: ColumnDef | OrderingTerm): SelectQueryState {\n const term = this.normalizeOrderingTerm(col);\n return this.state.withGroupBy([term]);\n }\n\n /**\n * Adds a HAVING clause to the query\n * @param expr - Expression for the HAVING clause\n * @returns Updated query state with HAVING clause\n */\n withHaving(expr: ExpressionNode): SelectQueryState {\n const combined = this.combineExpressions(this.state.ast.having, expr);\n return this.state.withHaving(combined);\n }\n\n /**\n * Adds an ORDER BY clause to the query\n * @param col - Column to order by\n * @param direction - Order direction (ASC/DESC)\n * @returns Updated query state with ORDER BY clause\n */\n withOrderBy(\n term: ColumnDef | OrderingTerm,\n direction: OrderDirection,\n nulls?: 'FIRST' | 'LAST',\n collation?: string\n ): SelectQueryState {\n const normalized = this.normalizeOrderingTerm(term);\n return this.state.withOrderBy([{ type: 'OrderBy', term: normalized, direction, nulls, collation }]);\n }\n\n /**\n * Adds a DISTINCT clause to the query\n * @param cols - Columns to make distinct\n * @returns Updated query state with DISTINCT clause\n */\n withDistinct(cols: ColumnNode[]): SelectQueryState {\n return this.state.withDistinct(cols);\n }\n\n /**\n * Adds a LIMIT clause to the query\n * @param limit - Maximum number of rows to return\n * @returns Updated query state with LIMIT clause\n */\n withLimit(limit: number): SelectQueryState {\n return this.state.withLimit(limit);\n }\n\n /**\n * Adds an OFFSET clause to the query\n * @param offset - Number of rows to skip\n * @returns Updated query state with OFFSET clause\n */\n withOffset(offset: number): SelectQueryState {\n return this.state.withOffset(offset);\n }\n\n /**\n * Combines expressions with AND operator\n * @param existing - Existing expression\n * @param next - New expression to combine\n * @returns Combined expression\n */\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\n return existing ? and(existing, next) : next;\n }\n\n /**\n * Normalizes an ordering term to a standard OrderingTerm\n * @param term - Column definition or ordering term to normalize\n * @returns Normalized ordering term\n */\n private normalizeOrderingTerm(term: ColumnDef | OrderingTerm): OrderingTerm {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const termType = (term as { type?: string }).type;\n if (termType === 'Column') {\n return term as ColumnNode;\n }\n if (termType === 'AliasRef') {\n return term as AliasRefNode;\n }\n if (isOperandNode(term)) {\n return term as OrderingTerm;\n }\n if (\n termType === 'BinaryExpression' ||\n termType === 'LogicalExpression' ||\n termType === 'NullExpression' ||\n termType === 'InExpression' ||\n termType === 'ExistsExpression' ||\n termType === 'BetweenExpression' ||\n termType === 'ArithmeticExpression'\n ) {\n return term as ExpressionNode;\n }\n return buildColumnNode(tableRef, term as ColumnDef);\n }\n\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\r\n const rootTable = rootAlias || root.name;\r\n const defaultLocalKey =\r\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\r\n ? findPrimaryKey(root)\r\n : findPrimaryKey(relation.target);\r\n const localKey = relation.localKey || defaultLocalKey;\r\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\r\n case RelationKinds.HasOne:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\r\n { type: 'Column', table: rootTable, name: localKey }\r\n );\r\n case RelationKinds.BelongsTo:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: localKey },\r\n { type: 'Column', table: rootTable, name: relation.foreignKey }\r\n );\r\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n * @param root - The root table definition\r\n * @param relationName - Name of the relation being joined\r\n * @param relation - The BelongsToMany relation definition\r\n * @param joinKind - The type of join to perform\r\n * @param extra - Optional additional conditions for the target join\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Array of join nodes for the pivot and target tables\r\n */\r\nexport const buildBelongsToManyJoins = (\r\n root: TableDef,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n joinKind: JoinKind,\r\n extra?: ExpressionNode,\r\n rootAlias?: string\r\n): JoinNode[] => {\r\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const rootTable = rootAlias || root.name;\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: rootTable, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(\r\n joinKind,\r\n { type: 'Table', name: relation.pivotTable.name, schema: relation.pivotTable.schema },\r\n pivotCondition\r\n );\r\n\r\n let targetCondition: ExpressionNode = eq(\r\n { type: 'Column', table: relation.target.name, name: targetKey },\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\r\n );\r\n\r\n if (extra) {\r\n targetCondition = and(targetCondition, extra);\r\n }\r\n\r\n const targetJoin = createJoinNode(\r\n joinKind,\r\n { type: 'Table', name: relation.target.name, schema: relation.target.schema },\r\n targetCondition,\r\n relationName\r\n );\r\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\r\n root: TableDef,\r\n relation: RelationDef,\r\n extra?: ExpressionNode,\r\n rootAlias?: string\r\n): ExpressionNode => {\r\n const base = baseRelationCondition(root, relation, rootAlias);\r\n return extra ? and(base, extra) : base;\r\n};\r\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\r\n return baseRelationCondition(root, relation, rootAlias);\r\n};\r\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n and\r\n} from '../core/ast/expression.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\r\nimport { makeRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Service for handling relation operations (joins, includes, etc.)\r\n */\r\nexport class RelationService {\r\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): RelationResult {\r\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition);\r\n return { state: nextState, hydration: this.hydration };\r\n }\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\r\n relationName: string,\r\n predicate?: ExpressionNode\r\n ): RelationResult {\r\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\r\n const pk = findPrimaryKey(this.table);\r\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\r\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\r\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\r\n return { state: nextState, hydration: joined.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\r\n\r\n if (!alreadyJoined) {\r\n const joined = this.joinRelation(relationName, options?.joinKind ?? JOIN_KINDS.LEFT, options?.filter);\r\n state = joined.state;\r\n }\r\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\r\n state = projectionResult.state;\r\n hydration = projectionResult.hydration;\r\n\r\n const targetColumns = options?.columns?.length\r\n ? options.columns\r\n : Object.keys(relation.target.columns);\r\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ): Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\r\n relationName: string,\r\n ast: SelectQueryNode,\r\n additionalCorrelation?: ExpressionNode\r\n ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\r\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\r\n if (additionalCorrelation) {\r\n correlation = and(correlation, additionalCorrelation);\r\n }\r\n const whereInSubquery = ast.where\r\n ? and(correlation, ast.where)\r\n : correlation;\r\n\r\n return {\r\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\r\n state: SelectQueryState,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryState {\r\n const relation = this.getRelation(relationName);\r\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\r\n if (relation.type === RelationKinds.BelongsToMany) {\r\n const joins = buildBelongsToManyJoins(\r\n this.table,\r\n relationName,\r\n relation as BelongsToManyRelation,\r\n joinKind,\r\n extraCondition,\r\n rootAlias\r\n );\r\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\r\n }\r\n\r\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition, rootAlias);\r\n const joinNode = createJoinNode(\r\n joinKind,\r\n { type: 'Table', name: relation.target.name, schema: relation.target.schema },\r\n condition,\r\n relationName\r\n );\r\n\r\n return this.astService(state).withJoin(joinNode);\r\n }\r\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n ): RelationResult {\r\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\r\n return {\r\n state: nextState,\r\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\r\n return this.createQueryAstService(this.table, state);\r\n }\r\n\r\n private rootTableName(): string {\r\n const from = this.state.ast.from;\r\n if (from.type === 'Table' && from.alias) return from.alias;\r\n return this.table.name;\r\n }\r\n}\r\n\r\nexport type { RelationResult } from './relation-projection-helper.js';\r\n\r\n","import { ColumnDef } from '../schema/column-types.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n\r\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n /**\r\n * Creates a new column selector\r\n * @param env - Query builder environment\r\n * @returns New column selector\r\n */\r\n createColumnSelector: (env: SelectQueryBuilderEnvironment) => ColumnSelector;\r\n /**\r\n * Creates a new relation manager\r\n * @param env - Query builder environment\r\n * @returns New relation manager\r\n */\r\n createRelationManager: (env: SelectQueryBuilderEnvironment) => RelationManager;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n const createColumnSelector = overrides.createColumnSelector ?? (env => new ColumnSelector(env));\r\n const createRelationManager = overrides.createRelationManager ?? (env => new RelationManager(env));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService,\r\n createColumnSelector,\r\n createRelationManager\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, unknown>[], plan?: HydrationPlan): Record<string, unknown>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<unknown, Record<string, unknown>>();\r\n const relationIndex = new Map<unknown, Record<string, Set<unknown>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, unknown>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: unknown, relationName: string): Set<unknown> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<unknown>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\r\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\r\n const childPk = row[childPkKey];\r\n if (childPk === null || childPk === undefined) continue;\r\n\r\n const seen = getRelationSeenSet(rootId, rel.name);\r\n if (seen.has(childPk)) continue;\r\n seen.add(childPk);\r\n\r\n if (rel.type === RelationKinds.HasOne) {\r\n if (!parent[rel.name]) {\r\n parent[rel.name] = buildChild(row, rel);\r\n }\r\n continue;\r\n }\r\n\r\n const bucket = parent[rel.name] as unknown[];\r\n bucket.push(buildChild(row, rel));\r\n }\r\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, unknown>, plan: HydrationPlan): Record<string, unknown> => {\r\n const base: Record<string, unknown> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\r\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\r\n }\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, unknown>, rel: HydrationRelationPlan): Record<string, unknown> => {\r\n const child: Record<string, unknown> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as { _pivot: unknown })._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, unknown>, rel: HydrationRelationPlan): Record<string, unknown> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, unknown> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<unknown>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, unknown>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, unknown>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, unknown> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value as Record<string, unknown>;\r\n};\r\n\r\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: unknown): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as { [ENTITY_META]: EntityMeta<TTable> })[ENTITY_META];\r\n};\r\n\r\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: unknown): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of HasManyCollection for managing one-to-many relationships.\r\n * @template TChild - The type of child entities in the collection\r\n */\r\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\r\n private loaded = false;\r\n private items: TChild[] = [];\r\n private readonly added = new Set<TChild>();\r\n private readonly removed = new Set<TChild>();\r\n\r\n /**\r\n * Creates a new DefaultHasManyCollection instance.\r\n * @param ctx - The entity context\r\n * @param meta - The entity metadata\r\n * @param root - The root entity\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param rootTable - The root table definition\r\n * @param loader - The loader function for lazy loading\r\n * @param createEntity - Function to create entities from rows\r\n * @param localKey - The local key for the relation\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n /**\r\n * Loads the related entities if not already loaded.\r\n * @returns Promise resolving to the array of child entities\r\n */\r\n async load(): Promise<TChild[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey((this.root as Record<string, unknown>)[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n /**\r\n * Gets the current items in the collection.\r\n * @returns Array of child entities\r\n */\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n /**\r\n * Adds a new child entity to the collection.\r\n * @param data - Partial data for the new entity\r\n * @returns The created entity\r\n */\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n const childRow: Record<string, unknown> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n /**\r\n * Attaches an existing entity to the collection.\r\n * @param entity - The entity to attach\r\n */\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, unknown>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Removes an entity from the collection.\r\n * @param entity - The entity to remove\r\n */\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Clears all entities from the collection.\r\n */\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n }\r\n\r\n /**\r\n * Returns the items for JSON serialization.\r\n * @returns Array of child entities\r\n */\r\n toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, unknown>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a has-one reference.\r\n * Manages a reference to a child entity where the child carries the foreign key.\r\n *\r\n * @template TChild The type of the child entity.\r\n */\r\nexport class DefaultHasOneReference<TChild> implements HasOneReference<TChild> {\r\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the parent entity.\r\n * @param root The parent entity instance.\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the parent entity.\r\n * @param loader Function to load the child entity.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param localKey The local key on the parent entity used for the relation.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a belongs-to reference.\r\n * Manages a reference to a parent entity from a child entity through a foreign key.\r\n *\r\n * @template TParent The type of the parent entity.\r\n */\r\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\r\n private loaded = false;\r\n private current: TParent | null = null;\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the child entity.\r\n * @param root The child entity instance (carrying the foreign key).\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the child entity.\r\n * @param loader Function to load the parent entity.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param targetKey The primary key of the target (parent) table.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TParent,\r\n private readonly targetKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = (this.root as Record<string, unknown>)[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n (this.root as Record<string, unknown>)[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, unknown>);\r\n const pkValue = (entity as Record<string, unknown>)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n (this.root as Record<string, unknown>)[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const fkValue = (this.root as Record<string, unknown>)[this.relation.foreignKey];\r\n if (fkValue === undefined || fkValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a many-to-many collection.\r\n * Manages the relationship between two entities through a pivot table.\r\n * Supports lazy loading, attaching/detaching entities, and syncing by IDs.\r\n *\r\n * @template TTarget The type of the target entities in the collection.\r\n */\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the root entity.\r\n * @param root The root entity instance.\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the root entity.\r\n * @param loader Function to load the collection items.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param localKey The local key used for joining.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n /**\r\n * Loads the collection items if not already loaded.\r\n * @returns A promise that resolves to the array of target entities.\r\n */\r\n async load(): Promise<TTarget[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as { _pivot?: unknown })._pivot) {\r\n (entity as { _pivot?: unknown })._pivot = (row as { _pivot?: unknown })._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n /**\r\n * Returns the currently loaded items.\r\n * @returns Array of target entities.\r\n */\r\n getItems(): TTarget[] {\r\n return this.items;\r\n }\r\n\r\n /**\r\n * Attaches an entity to the collection.\r\n * Registers an 'attach' change in the entity context.\r\n * @param target Entity instance or its primary key value.\r\n */\r\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id != null && this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n if (id == null && this.items.includes(entity)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Detaches an entity from the collection.\r\n * Registers a 'detach' change in the entity context.\r\n * @param target Entity instance or its primary key value.\r\n */\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n /**\r\n * Syncs the collection with a list of IDs.\r\n * Attaches missing IDs and detaches IDs not in the list.\r\n * @param ids Array of primary key values to sync with.\r\n */\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, unknown> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as Record<string, unknown>)[this.targetKey] as string | number | null ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((row as { _pivot?: unknown })._pivot) {\r\n (entity as { _pivot?: unknown })._pivot = (row as { _pivot?: unknown })._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\n/**\r\n * An array of database rows, each represented as a record of string keys to unknown values.\r\n */\r\ntype Rows = Record<string, unknown>[];\r\n\r\n/**\r\n * Represents a single tracked entity from the EntityContext for a table.\r\n */\r\ntype EntityTracker = ReturnType<EntityContext['getEntitiesForTable']>[number];\r\n\r\n/**\r\n * Creates a record of all columns from the given table definition.\r\n * @param table - The table definition to select columns from.\r\n * @returns A record mapping column names to their definitions.\r\n */\r\nconst selectAllColumns = (table: TableDef): Record<string, ColumnDef> =>\r\n Object.entries(table.columns).reduce((acc, [name, def]) => {\r\n acc[name] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n\r\n/**\r\n * Extracts rows from query results into a standardized format.\r\n * @param results - The query results to process.\r\n * @returns An array of rows as records.\r\n */\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, unknown> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\n/**\r\n * Executes a select query and returns the resulting rows.\r\n * @param ctx - The entity context for execution.\r\n * @param qb - The select query builder.\r\n * @returns A promise resolving to the rows from the query.\r\n */\r\nconst executeQuery = async (ctx: EntityContext, qb: SelectQueryBuilder<unknown, TableDef>): Promise<Rows> => {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n return rowsFromResults(results);\r\n};\r\n\r\n/**\r\n * Converts a value to a string key, handling null and undefined as empty string.\r\n * @param value - The value to convert.\r\n * @returns The string representation of the value.\r\n */\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Collects unique keys from the root entities based on the specified key property.\r\n * @param roots - The tracked entities to collect keys from.\r\n * @param key - The property name to use as the key.\r\n * @returns A set of unique key values.\r\n */\r\nconst collectKeysFromRoots = (roots: EntityTracker[], key: string): Set<unknown> => {\r\n const collected = new Set<unknown>();\r\n for (const tracked of roots) {\r\n const value = tracked.entity[key];\r\n if (value !== null && value !== undefined) {\r\n collected.add(value);\r\n }\r\n }\r\n return collected;\r\n};\r\n\r\n/**\r\n * Builds an array of values suitable for an IN list expression from a set of keys.\r\n * @param keys - The set of keys to convert.\r\n * @returns An array of string, number, or LiteralNode values.\r\n */\r\nconst buildInListValues = (keys: Set<unknown>): (string | number | LiteralNode)[] =>\r\n Array.from(keys) as (string | number | LiteralNode)[];\r\n\r\n/**\r\n * Fetches rows from a table where the specified column matches any of the given keys.\r\n * @param ctx - The entity context.\r\n * @param table - The target table.\r\n * @param column - The column to match against.\r\n * @param keys - The set of keys to match.\r\n * @returns A promise resolving to the matching rows.\r\n */\r\nconst fetchRowsForKeys = async (\r\n ctx: EntityContext,\r\n table: TableDef,\r\n column: ColumnDef,\r\n keys: Set<unknown>\r\n): Promise<Rows> => {\r\n const qb = new SelectQueryBuilder(table).select(selectAllColumns(table));\r\n qb.where(inList(column, buildInListValues(keys)));\r\n return executeQuery(ctx, qb);\r\n};\r\n\r\n/**\r\n * Groups rows by the value of a key column, allowing multiple rows per key.\r\n * @param rows - The rows to group.\r\n * @param keyColumn - The column name to group by.\r\n * @returns A map from key strings to arrays of rows.\r\n */\r\nconst groupRowsByMany = (rows: Rows, keyColumn: string): Map<string, Rows> => {\r\n const grouped = new Map<string, Rows>();\r\n for (const row of rows) {\r\n const value = row[keyColumn];\r\n if (value === null || value === undefined) continue;\r\n const key = toKey(value);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n return grouped;\r\n};\r\n\r\n/**\r\n * Groups rows by the value of a key column, keeping only one row per key.\r\n * @param rows - The rows to group.\r\n * @param keyColumn - The column name to group by.\r\n * @returns A map from key strings to single rows.\r\n */\r\nconst groupRowsByUnique = (rows: Rows, keyColumn: string): Map<string, Record<string, unknown>> => {\r\n const lookup = new Map<string, Record<string, unknown>>();\r\n for (const row of rows) {\r\n const value = row[keyColumn];\r\n if (value === null || value === undefined) continue;\r\n const key = toKey(value);\r\n if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n return lookup;\r\n};\r\n\r\n/**\r\n * Loads related entities for a has-many relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The has-many relation definition.\r\n * @returns A promise resolving to a map of root keys to arrays of related rows.\r\n */\r\nexport const loadHasManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = collectKeysFromRoots(roots, localKey);\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, fkColumn, keys);\r\n return groupRowsByMany(rows, relation.foreignKey);\r\n};\r\n\r\n/**\r\n * Loads related entities for a has-one relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The has-one relation definition.\r\n * @returns A promise resolving to a map of root keys to single related rows.\r\n */\r\nexport const loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasOneRelation\r\n): Promise<Map<string, Record<string, unknown>>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = collectKeysFromRoots(roots, localKey);\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, fkColumn, keys);\r\n return groupRowsByUnique(rows, relation.foreignKey);\r\n};\r\n\r\n/**\r\n * Loads related entities for a belongs-to relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The belongs-to relation definition.\r\n * @returns A promise resolving to a map of foreign keys to single related rows.\r\n */\r\nexport const loadBelongsToRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, unknown>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = collectKeysFromRoots(roots, relation.foreignKey);\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, pkColumn, foreignKeys);\r\n return groupRowsByUnique(rows, targetKey);\r\n};\r\n\r\n/**\r\n * Loads related entities for a belongs-to-many relation in batch, including pivot data.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The belongs-to-many relation definition.\r\n * @returns A promise resolving to a map of root keys to arrays of related rows with pivot data.\r\n */\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = collectKeysFromRoots(roots, rootKey);\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotColumn = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotColumn) return new Map();\r\n\r\n const pivotRows = await fetchRowsForKeys(ctx, relation.pivotTable, pivotColumn, rootIds);\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, unknown> }[]>();\r\n const targetIds = new Set<unknown>();\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: { ...pivot }\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetRows = await fetchRowsForKeys(ctx, relation.target, targetPkColumn, targetIds);\r\n const targetMap = groupRowsByUnique(targetRows, targetKey);\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...targetRow,\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance, RelationMap, HasManyCollection, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\n/**\r\n * Type representing an array of database rows.\r\n */\r\ntype Rows = Record<string, unknown>[];\r\n\r\n/**\r\n * Caches relation loader results across entities of the same type.\r\n * @template T - The cache type\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param factory - The factory function to create the cache\r\n * @returns Promise with the cached relation data\r\n */\r\nconst relationLoaderCache = <T extends Map<string, unknown>>(\r\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\n/**\r\n * Creates an entity proxy with lazy loading capabilities.\r\n * @template TTable - The table type\r\n * @template TLazy - The lazy relation keys\r\n * @param ctx - The entity context\r\n * @param table - The table definition\r\n * @param row - The database row\r\n * @param lazyRelations - Optional lazy relations\r\n * @returns The entity instance\r\n */\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, unknown>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): EntityInstance<TTable> => {\r\n const target: Record<string, unknown> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n const handler: ProxyHandler<object> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta as unknown as EntityMeta<TableDef>, relationName as string, receiver);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta as unknown as EntityMeta<TableDef>, prop, receiver);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(receiver);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler) as EntityInstance<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\n/**\r\n * Creates an entity instance from a database row.\r\n * @template TTable - The table type\r\n * @template TResult - The result type\r\n * @param ctx - The entity context\r\n * @param table - The table definition\r\n * @param row - The database row\r\n * @param lazyRelations - Optional lazy relations\r\n * @returns The entity instance\r\n */\r\nexport const createEntityFromRow = <\r\n TTable extends TableDef,\r\n TResult extends EntityInstance<TTable> = EntityInstance<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, unknown>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): TResult => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked as TResult;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity as TResult;\r\n};\r\n\r\n/**\r\n * Converts a value to a string key.\r\n * @param value - The value to convert\r\n * @returns String representation of the value\r\n */\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Populates the hydration cache with relation data from the database row.\r\n * @template TTable - The table type\r\n * @param entity - The entity instance\r\n * @param row - The database row\r\n * @param meta - The entity metadata\r\n */\r\nconst populateHydrationCache = <TTable extends TableDef>(\r\n entity: Record<string, unknown>,\r\n row: Record<string, unknown>,\r\n meta: EntityMeta<TTable>\r\n): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, unknown>>();\r\n cache.set(toKey(rootValue), data as Record<string, unknown>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, unknown>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets a relation wrapper for an entity.\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param owner - The owner entity\r\n * @returns The relation wrapper or undefined\r\n */\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n owner: unknown\r\n): HasManyCollection<unknown> | HasOneReference<unknown> | BelongsToReference<unknown> | ManyToManyCollection<unknown> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<unknown>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation, owner);\r\n if (wrapper) {\r\n meta.relationWrappers.set(relationName, wrapper);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\n/**\r\n * Instantiates the appropriate relation wrapper based on relation type.\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param owner - The owner entity\r\n * @returns The relation wrapper or undefined\r\n */\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n relation: HasManyRelation | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: unknown\r\n): HasManyCollection<unknown> | HasOneReference<unknown> | BelongsToReference<unknown> | ManyToManyCollection<unknown> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\r\nimport { OrmSession } from './orm-session.ts';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityProxy, createEntityFromRow } from './entity.js';\nimport { EntityContext } from './entity-context.js';\nimport { ExecutionContext } from './execution-context.js';\nimport { HydrationContext } from './hydration-context.js';\n\r\ntype Row = Record<string, unknown>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\n\nconst executeWithContexts = async <TTable extends TableDef>(\n execCtx: ExecutionContext,\n entityCtx: EntityContext,\n qb: SelectQueryBuilder<unknown, TTable>\n): Promise<EntityInstance<TTable>[]> => {\n const ast = qb.getAST();\n const compiled = execCtx.dialect.compileSelect(ast);\n const executed = await execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n const rows = flattenResults(executed);\n\n if (ast.setOps && ast.setOps.length > 0) {\n return rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\n }\n\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n};\r\n\r\n/**\r\n * Executes a hydrated query using the ORM session.\r\n * @template TTable - The table type\r\n * @param session - The ORM session\r\n * @param qb - The select query builder\r\n * @returns Promise resolving to array of entity instances\r\n */\r\nexport async function executeHydrated<TTable extends TableDef>(\n session: OrmSession,\n qb: SelectQueryBuilder<unknown, TTable>\n): Promise<EntityInstance<TTable>[]> {\n return executeWithContexts(session.getExecutionContext(), session, qb);\n}\n\r\n/**\r\n * Executes a hydrated query using execution and hydration contexts.\r\n * @template TTable - The table type\r\n * @param _execCtx - The execution context (unused)\r\n * @param hydCtx - The hydration context\r\n * @param qb - The select query builder\r\n * @returns Promise resolving to array of entity instances\r\n */\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\n execCtx: ExecutionContext,\n hydCtx: HydrationContext,\n qb: SelectQueryBuilder<unknown, TTable>\n): Promise<EntityInstance<TTable>[]> {\n const entityCtx = hydCtx.entityContext;\n if (!entityCtx) {\n throw new Error('Hydration context is missing an EntityContext');\n }\n return executeWithContexts(execCtx, entityCtx, qb);\n}\n","import { SelectQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode } from '../core/ast/query.js';\r\nimport { TableDef } from '../schema/table.js';\r\nimport type { SelectQueryBuilder } from './select.js';\r\nimport type { UpdateQueryBuilder } from './update.js';\r\nimport type { DeleteQueryBuilder } from './delete.js';\r\n\r\n/**\r\n * Resolves a SelectQueryBuilder or SelectQueryNode to a SelectQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns SelectQueryNode AST\r\n */\r\nexport function resolveSelectQuery<TSub extends TableDef>(\r\n query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode\r\n): SelectQueryNode {\r\n const candidate = query as { getAST?: () => SelectQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as SelectQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a UpdateQueryBuilder or UpdateQueryNode to a UpdateQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns UpdateQueryNode AST\r\n */\r\nexport function resolveUpdateQuery<T>(\r\n query: UpdateQueryBuilder<T> | UpdateQueryNode\r\n): UpdateQueryNode {\r\n const candidate = query as { getAST?: () => UpdateQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as UpdateQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a DeleteQueryBuilder or DeleteQueryNode to a DeleteQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns DeleteQueryNode AST\r\n */\r\nexport function resolveDeleteQuery<T>(\r\n query: DeleteQueryBuilder<T> | DeleteQueryNode\r\n): DeleteQueryNode {\r\n const candidate = query as { getAST?: () => DeleteQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as DeleteQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a TableDef or TableSourceNode to a TableSourceNode\r\n * @param source - Table definition or source node\r\n * @returns TableSourceNode\r\n */\r\nexport function resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n}\r\n\r\n/**\r\n * Resolves a join target (TableDef, TableSourceNode, or string relation name)\r\n * @param table - Join target\r\n * @returns TableSourceNode or string\r\n */\r\nexport function resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return resolveTableSource(table);\r\n}\r\n\r\n/**\r\n * Type guard to check if a value is a TableSourceNode\r\n * @param source - Value to check\r\n * @returns True if value is a TableSourceNode\r\n */\r\nfunction isTableSourceNode(source: TableDef | TableSourceNode): source is TableSourceNode {\r\n return typeof (source as TableSourceNode).type === 'string';\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { OrderingTerm, SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\r\nimport { HydrationPlan } from '../core/hydration/types.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n and,\r\n exists,\r\n notExists,\r\n OperandNode\r\n} from '../core/ast/expression.js';\r\nimport { derivedTable, fnTable } from '../core/ast/builders.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\n\r\ntype SelectDialectInput = Dialect | DialectKey;\r\n\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport {\r\n resolveSelectQueryBuilderDependencies,\r\n SelectQueryBuilderContext,\r\n SelectQueryBuilderDependencies,\r\n SelectQueryBuilderEnvironment\r\n} from './select-query-builder-deps.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport type { RelationDef } from '../schema/relation.js';\r\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { EntityInstance, RelationMap, RelationTargetTable } from '../schema/types.js';\r\nimport { OrmSession } from '../orm/orm-session.ts';\r\nimport { ExecutionContext } from '../orm/execution-context.js';\r\nimport { HydrationContext } from '../orm/hydration-context.js';\r\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { resolveSelectQuery } from './query-resolution.js';\r\n\r\n\r\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\r\n\r\ntype DeepSelectEntry<TTable extends TableDef> = {\r\n type: 'root';\r\n columns: (keyof TTable['columns'] & string)[];\r\n} | {\r\n type: 'relation';\r\n relationName: keyof TTable['relations'] & string;\r\n columns: string[];\r\n};\r\n\r\ntype DeepSelectConfig<TTable extends TableDef> = DeepSelectEntry<TTable>[];\r\n\r\ntype WhereHasOptions = {\r\n correlate?: ExpressionNode;\r\n};\r\n\r\ntype RelationCallback = <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<unknown, TChildTable>\r\n) => SelectQueryBuilder<unknown, TChildTable>;\r\n\r\n\r\n/**\r\n * Main query builder class for constructing SQL SELECT queries\r\n * @typeParam T - Result type for projections (unused)\r\n * @typeParam TTable - Table definition being queried\r\n */\r\nexport class SelectQueryBuilder<T = unknown, TTable extends TableDef = TableDef> {\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n private readonly context: SelectQueryBuilderContext;\r\n private readonly columnSelector: ColumnSelector;\r\n private readonly relationManager: RelationManager;\r\n private readonly lazyRelations: Set<string>;\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance\r\n * @param table - Table definition to query\r\n * @param state - Optional initial query state\r\n * @param hydration - Optional hydration manager\r\n * @param dependencies - Optional query builder dependencies\r\n */\r\n constructor(\r\n table: TTable,\r\n state?: SelectQueryState,\r\n hydration?: HydrationManager,\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n lazyRelations?: Set<string>\r\n ) {\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n this.env = { table, deps };\r\n const initialState = state ?? deps.createState(table);\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n this.context = {\r\n state: initialState,\r\n hydration: initialHydration\r\n };\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n this.columnSelector = deps.createColumnSelector(this.env);\r\n this.relationManager = deps.createRelationManager(this.env);\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance with updated context and lazy relations\r\n * @param context - Updated query context\r\n * @param lazyRelations - Updated lazy relations set\r\n * @returns New SelectQueryBuilder instance\r\n */\r\n private clone(\r\n context: SelectQueryBuilderContext = this.context,\r\n lazyRelations = new Set(this.lazyRelations)\r\n ): SelectQueryBuilder<T, TTable> {\r\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\r\n }\r\n\r\n /**\r\n * Applies an alias to the root FROM table.\r\n * @param alias - Alias to apply\r\n */\r\n as(alias: string): SelectQueryBuilder<T, TTable> {\r\n const from = this.context.state.ast.from;\r\n if (from.type !== 'Table') {\r\n throw new Error('Cannot alias non-table FROM sources');\r\n }\r\n const nextFrom = { ...from, alias };\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\r\n return this.clone(nextContext);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies correlation expression to the query AST\r\n * @param ast - Query AST to modify\r\n * @param correlation - Correlation expression\r\n * @returns Modified AST with correlation applied\r\n */\r\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\r\n if (!correlation) return ast;\r\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\r\n return {\r\n ...ast,\r\n where: combinedWhere\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new child query builder for a related table\r\n * @param table - Table definition for the child builder\r\n * @returns New SelectQueryBuilder instance for the child table\r\n */\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n }\r\n\r\n /**\r\n * Applies an AST mutation using the query AST service\r\n * @param context - Current query context\r\n * @param mutator - Function that mutates the AST\r\n * @returns Updated query context\r\n */\r\n private applyAst(\r\n context: SelectQueryBuilderContext,\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = mutator(astService);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Applies a join to the query context\r\n * @param context - Current query context\r\n * @param table - Table to join\r\n * @param condition - Join condition\r\n * @param kind - Join kind\r\n * @returns Updated query context with join applied\r\n */\r\n private applyJoin(\r\n context: SelectQueryBuilderContext,\r\n table: TableDef,\r\n condition: BinaryExpressionNode,\r\n kind: JoinKind\r\n ): SelectQueryBuilderContext {\r\n const joinNode = createJoinNode(kind, { type: 'Table', name: table.name, schema: table.schema }, condition);\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Applies a set operation to the query\r\n * @param operator - Set operation kind\r\n * @param query - Query to combine with\r\n * @returns Updated query context with set operation\r\n */\r\n private applySetOperation<TSub extends TableDef>(\r\n operator: SetOperationKind,\r\n query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const subAst = resolveSelectQuery(query);\r\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\r\n }\r\n\r\n\r\n /**\r\n * Selects columns for the query (unified overloaded method).\r\n * Can be called with column names or a projection object.\r\n * @param args - Column names or projection object\r\n * @returns New query builder instance with selected columns\r\n */\r\n select<K extends keyof TTable['columns'] & string>(\r\n ...args: K[]\r\n ): SelectQueryBuilder<T, TTable>;\r\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable>;\r\n select<K extends keyof TTable['columns'] & string>(\r\n ...args: K[] | [Record<string, ColumnSelectionValue>]\r\n ): SelectQueryBuilder<T, TTable> {\r\n // If first arg is an object (not a string), treat as projection map\r\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && typeof args[0] !== 'string') {\r\n const columns = args[0] as Record<string, ColumnSelectionValue>;\r\n return this.clone(this.columnSelector.select(this.context, columns));\r\n }\r\n\r\n // Otherwise, treat as column names\r\n const cols = args as K[];\r\n const selection: Record<string, ColumnDef> = {};\r\n for (const key of cols) {\r\n const col = this.env.table.columns[key];\r\n if (!col) {\r\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\r\n }\r\n selection[key] = col;\r\n }\r\n\r\n return this.clone(this.columnSelector.select(this.context, selection));\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param cols - Column expressions as strings\r\n * @returns New query builder instance with raw column selections\r\n */\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the CTE\r\n */\r\n with<TSub extends TableDef>(name: string, query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the recursive CTE\r\n */\r\n withRecursive<TSub extends TableDef>(name: string, query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Replaces the FROM clause with a derived table (subquery with alias)\r\n * @param subquery - Subquery to use as the FROM source\r\n * @param alias - Alias for the derived table\r\n * @param columnAliases - Optional column alias list\r\n * @returns New query builder instance with updated FROM\r\n */\r\n fromSubquery<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n alias: string,\r\n columnAliases?: string[]\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const fromNode = derivedTable(subAst, alias, columnAliases);\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Replaces the FROM clause with a function table expression.\r\n * @param name - Function name\r\n * @param args - Optional function arguments\r\n * @param alias - Optional alias for the function table\r\n * @param options - Optional function-table metadata (lateral, ordinality, column aliases, schema)\r\n */\r\n fromFunctionTable(\r\n name: string,\r\n args: OperandNode[] = [],\r\n alias?: string,\r\n options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\r\n ): SelectQueryBuilder<T, TTable> {\r\n const functionTable = fnTable(name, args, alias, options);\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(functionTable));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery column\r\n * @param sub - Query builder or query node for the subquery\r\n * @returns New query builder instance with the subquery selection\r\n */\r\n selectSubquery<TSub extends TableDef>(alias: string, sub: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = resolveSelectQuery(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\r\n }\r\n\r\n /**\r\n * Adds a JOIN against a derived table (subquery with alias)\r\n * @param subquery - Subquery to join\r\n * @param alias - Alias for the derived table\r\n * @param condition - Join condition expression\r\n * @param joinKind - Join kind (defaults to INNER)\r\n * @param columnAliases - Optional column alias list for the derived table\r\n * @returns New query builder instance with the derived-table join\r\n */\r\n joinSubquery<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n alias: string,\r\n condition: BinaryExpressionNode,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n columnAliases?: string[]\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\r\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a join against a function table (e.g., `generate_series`) using `fnTable` internally.\r\n * @param name - Function name\r\n * @param args - Optional arguments passed to the function\r\n * @param alias - Alias for the function table so columns can be referenced\r\n * @param condition - Join condition expression\r\n * @param joinKind - Kind of join (defaults to INNER)\r\n * @param options - Optional metadata (lateral, ordinality, column aliases, schema)\r\n */\r\n joinFunctionTable(\r\n name: string,\r\n args: OperandNode[] = [],\r\n alias: string,\r\n condition: BinaryExpressionNode,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\r\n ): SelectQueryBuilder<T, TTable> {\r\n const functionTable = fnTable(name, args, alias, options);\r\n const joinNode = createJoinNode(joinKind, functionTable, condition);\r\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an INNER JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the INNER JOIN\r\n */\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the LEFT JOIN\r\n */\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the RIGHT JOIN\r\n */\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Matches records based on a relationship\r\n * @param relationName - Name of the relationship to match\r\n * @param predicate - Optional predicate expression\r\n * @returns New query builder instance with the relationship match\r\n */\r\n match<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n predicate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Joins a related table\r\n * @param relationName - Name of the relationship to join\r\n * @param joinKind - Type of join (defaults to INNER)\r\n * @param extraCondition - Optional additional join condition\r\n * @returns New query builder instance with the relationship join\r\n */\r\n joinRelation<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes related data in the query results\r\n * @param relationName - Name of the relationship to include\r\n * @param options - Optional include options\r\n * @returns New query builder instance with the relationship inclusion\r\n */\r\n include<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes a relation lazily in the query results\r\n * @param relationName - Name of the relation to include lazily\r\n * @returns New query builder instance with lazy relation inclusion\r\n */\r\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\r\n const nextLazy = new Set(this.lazyRelations);\r\n nextLazy.add(relationName as string);\r\n return this.clone(this.context, nextLazy);\r\n }\r\n\r\n /**\r\n * Selects columns for a related table in a single hop.\r\n */\r\n selectRelationColumns<\r\n K extends keyof TTable['relations'] & string,\r\n TRel extends RelationDef = TTable['relations'][K],\r\n TTarget extends TableDef = RelationTargetTable<TRel>,\r\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\r\n >(relationName: K, ...cols: C[]): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName] as RelationDef | undefined;\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n const target = relation.target;\r\n\r\n for (const col of cols) {\r\n if (!target.columns[col]) {\r\n throw new Error(\r\n `Column '${col}' not found on related table '${target.name}' for relation '${relationName}'`\r\n );\r\n }\r\n }\r\n\r\n return this.include(relationName as string, { columns: cols as string[] });\r\n }\r\n\r\n /**\r\n * Convenience alias for selecting specific columns from a relation.\r\n */\r\n includePick<\r\n K extends keyof TTable['relations'] & string,\r\n TRel extends RelationDef = TTable['relations'][K],\r\n TTarget extends TableDef = RelationTargetTable<TRel>,\r\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\r\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\r\n return this.selectRelationColumns(relationName, ...cols);\r\n }\r\n\r\n\r\n /**\r\n * Selects columns for the root table and relations from an array of entries\r\n * @param config - Configuration array for deep column selection\r\n * @returns New query builder instance with deep column selections\r\n */\r\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let currBuilder: SelectQueryBuilder<T, TTable> = this;\r\n\r\n for (const entry of config) {\r\n if (entry.type === 'root') {\r\n currBuilder = currBuilder.select(...entry.columns);\r\n } else {\r\n currBuilder = currBuilder.selectRelationColumns(entry.relationName, ...(entry.columns as string[]));\r\n }\r\n }\r\n\r\n return currBuilder;\r\n }\r\n\r\n /**\r\n * Gets the list of lazy relations\r\n * @returns Array of lazy relation names\r\n */\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n /**\r\n * Gets the table definition for this query builder\r\n * @returns Table definition\r\n */\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n /**\r\n * Executes the query and returns hydrated results\r\n * @param ctx - ORM session context\r\n * @returns Promise of entity instances\r\n */\r\n async execute(ctx: OrmSession): Promise<EntityInstance<TTable>[]> {\n return executeHydrated(ctx, this);\n }\n\n private withAst(ast: SelectQueryNode): SelectQueryBuilder<T, TTable> {\n const nextState = new SelectQueryState(this.env.table as TTable, ast);\n const nextContext: SelectQueryBuilderContext = {\n ...this.context,\n state: nextState\n };\n return this.clone(nextContext);\n }\n\n async count(session: OrmSession): Promise<number> {\n const unpagedAst: SelectQueryNode = {\n ...this.context.state.ast,\n orderBy: undefined,\n limit: undefined,\n offset: undefined\n };\n\n const subAst = this.withAst(unpagedAst).getAST();\n\n const countQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: derivedTable(subAst, '__metal_count'),\n columns: [{ type: 'Function', name: 'COUNT', args: [], alias: 'total' } as FunctionNode],\n joins: []\n };\n\n const execCtx = session.getExecutionContext();\n const compiled = execCtx.dialect.compileSelect(countQuery);\n const results = await execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n const value = results[0]?.values?.[0]?.[0];\n\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return Number(value);\n if (typeof value === 'string') return Number(value);\n return value === null || value === undefined ? 0 : Number(value);\n }\n\n async executePaged(\n session: OrmSession,\n options: { page: number; pageSize: number }\n ): Promise<{ items: EntityInstance<TTable>[]; totalItems: number }> {\n const { page, pageSize } = options;\n if (!Number.isInteger(page) || page < 1) {\n throw new Error('executePaged: page must be an integer >= 1');\n }\n if (!Number.isInteger(pageSize) || pageSize < 1) {\n throw new Error('executePaged: pageSize must be an integer >= 1');\n }\n\n const offset = (page - 1) * pageSize;\n const [items, totalItems] = await Promise.all([\n this.limit(pageSize).offset(offset).execute(session),\n this.count(session)\n ]);\n\n return { items, totalItems };\n }\n\n /**\n * Executes the query with provided execution and hydration contexts\n * @param execCtx - Execution context\n * @param hydCtx - Hydration context\n * @returns Promise of entity instances\n */\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<EntityInstance<TTable>[]> {\r\n return executeHydratedWithContexts(execCtx, hydCtx, this);\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns New query builder instance with the WHERE condition\r\n */\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param term - Column definition or ordering term to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(term: ColumnDef | OrderingTerm): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(term));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a HAVING condition to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns New query builder instance with the HAVING condition\r\n */\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param term - Column definition or ordering term to order by\r\n * @param directionOrOptions - Order direction or options (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(\r\n term: ColumnDef | OrderingTerm,\r\n directionOrOptions: OrderDirection | { direction?: OrderDirection; nulls?: 'FIRST' | 'LAST'; collation?: string } = ORDER_DIRECTIONS.ASC\r\n ): SelectQueryBuilder<T, TTable> {\r\n const options = typeof directionOrOptions === 'string' ? { direction: directionOrOptions } : directionOrOptions;\r\n const dir = options.direction ?? ORDER_DIRECTIONS.ASC;\r\n\r\n const nextContext = this.applyAst(this.context, service =>\r\n service.withOrderBy(term, dir, options.nulls, options.collation)\r\n );\r\n\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns New query builder instance with the DISTINCT clause\r\n */\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param n - Maximum number of rows to return\r\n * @returns New query builder instance with the LIMIT clause\r\n */\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param n - Number of rows to skip\r\n * @returns New query builder instance with the OFFSET clause\r\n */\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Combines this query with another using UNION\r\n * @param query - Query to union with\r\n * @returns New query builder instance with the set operation\r\n */\r\n union<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('UNION', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using UNION ALL\r\n * @param query - Query to union with\r\n * @returns New query builder instance with the set operation\r\n */\r\n unionAll<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('UNION ALL', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using INTERSECT\r\n * @param query - Query to intersect with\r\n * @returns New query builder instance with the set operation\r\n */\r\n intersect<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('INTERSECT', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using EXCEPT\r\n * @param query - Query to subtract\r\n * @returns New query builder instance with the set operation\r\n */\r\n except<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('EXCEPT', query));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition to the query\r\n * @param subquery - Subquery to check for existence\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n */\r\n whereExists<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n correlate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const correlated = this.applyCorrelation(subAst, correlate);\r\n return this.where(exists(correlated));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n */\r\n whereNotExists<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n correlate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const correlated = this.applyCorrelation(subAst, correlate);\r\n return this.where(notExists(correlated));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship existence check\r\n */\r\n whereHas<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n callbackOrOptions?: RelationCallback | WhereHasOptions,\r\n maybeOptions?: WhereHasOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\r\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\r\n\r\n let subQb = this.createChildBuilder<unknown, typeof relation.target>(relation.target);\r\n\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\r\n\r\n return this.where(exists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship non-existence check\r\n */\r\n whereHasNot<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n callbackOrOptions?: RelationCallback | WhereHasOptions,\r\n maybeOptions?: WhereHasOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\r\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\r\n\r\n let subQb = this.createChildBuilder<unknown, typeof relation.target>(relation.target);\r\n\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\r\n\r\n return this.where(notExists(finalSubAst));\r\n }\r\n\r\n\r\n\r\n /**\r\n * Compiles the query to SQL for a specific dialect\r\n * @param dialect - Database dialect to compile for\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compile(dialect: SelectDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileSelect(this.getAST());\r\n }\r\n\r\n /**\r\n * Converts the query to SQL string for a specific dialect\r\n * @param dialect - Database dialect to generate SQL for\r\n * @returns SQL string representation of the query\r\n */\r\n toSql(dialect: SelectDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Gets the hydration plan for the query\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n return this.context.hydration.getPlan();\r\n }\r\n\r\n /**\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n * @returns Query AST with hydration applied\r\n */\r\n getAST(): SelectQueryNode {\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n }\r\n}\r\n\r\n","import { ColumnDef } from './column-types.js';\r\nimport type { TableDef } from './table.js';\r\n\r\nconst isColumnsRecord = (columns: unknown): columns is Record<string, ColumnDef> => {\r\n return typeof columns === 'object' && columns !== null;\r\n};\r\n\r\nconst isRelationsRecord = (relations: unknown): relations is Record<string, unknown> => {\r\n return typeof relations === 'object' && relations !== null;\r\n};\r\n\r\n/**\r\n * Type guard that checks if a value is a TableDef.\r\n * \r\n * @param value The value to check.\r\n * @returns True if the value follows the TableDef structure.\r\n */\r\nexport const isTableDef = (value: unknown): value is TableDef => {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n\r\n const candidate = value as Partial<TableDef>;\r\n if (typeof candidate.name !== 'string') {\r\n return false;\r\n }\r\n\r\n if (!isColumnsRecord(candidate.columns)) {\r\n return false;\r\n }\r\n\r\n if (!isRelationsRecord(candidate.relations)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n","import { ColumnDef } from '../schema/column-types.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\n/**\n * Constructor type for entities.\n * Supports any constructor signature for maximum flexibility with decorator-based entities.\n * @template T - The entity type\n */\nexport type EntityConstructor<T = object> = new (...args: never[]) => T;\n\n/**\n * Target that can be an entity constructor or table definition.\n */\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\n\n/**\n * Resolver for entity or table target, can be direct or function.\n */\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\n/**\n * Simplified column definition structure used during metadata registration.\n * @template T - Concrete column definition type being extended\n */\nexport type ColumnDefLike<T extends ColumnDef = ColumnDef> = Omit<T, 'name' | 'table'>;\n\n/**\n * Transforms simplified column metadata into full ColumnDef objects during table building.\n * @template TColumns - Mapping of column names to simplified definitions\n */\ntype MaterializeColumns<TColumns extends Record<string, ColumnDefLike>> = {\n [K in keyof TColumns]: ColumnDef<TColumns[K]['type'], TColumns[K]['tsType']> & Omit<\n TColumns[K],\n 'name' | 'table' | 'type' | 'tsType'\n > & { name: string; table: string };\n};\n\n/**\n * Common properties shared by all relation metadata types.\n */\ninterface BaseRelationMetadata {\n /** The property key for the relation */\n propertyKey: string;\n /** The target entity or table */\n target: EntityOrTableTargetResolver;\n /** Optional cascade mode */\n cascade?: CascadeMode;\n}\n\n/**\n * Metadata for has many relations.\n */\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.HasMany;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for has one relations.\n */\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.HasOne;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for belongs to relations.\n */\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.BelongsTo;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for belongs to many relations.\n */\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.BelongsToMany;\n /** The pivot table */\n pivotTable: EntityOrTableTargetResolver;\n /** The pivot foreign key to root */\n pivotForeignKeyToRoot: string;\n /** The pivot foreign key to target */\n pivotForeignKeyToTarget: string;\n /** Optional local key */\n localKey?: string;\n /** Optional target key */\n targetKey?: string;\n /** Optional pivot primary key */\n pivotPrimaryKey?: string;\n /** Optional default pivot columns */\n defaultPivotColumns?: string[];\n}\n\n/**\n * Union type for all relation metadata.\n */\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\n/**\n * Metadata for entities.\n * @template TColumns - The columns type\n */\nexport interface EntityMetadata<TColumns extends Record<string, ColumnDefLike> = Record<string, ColumnDefLike>> {\n /** The entity constructor */\n target: EntityConstructor;\n /** The table name */\n tableName: string;\n /** The columns */\n columns: TColumns;\n /** The relations */\n relations: Record<string, RelationMetadata>;\n /** Optional hooks */\n hooks?: TableHooks;\n /** Optional table definition */\n table?: TableDef<MaterializeColumns<TColumns>>;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\n/**\n * Registers entity metadata.\n * @param meta - The entity metadata to register\n */\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\n/**\n * Ensures entity metadata exists for the target, creating it if necessary.\n * @param target - The entity constructor\n * @returns The entity metadata\n */\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\n/**\n * Gets entity metadata for the target.\n * @param target - The entity constructor\n * @returns The entity metadata or undefined if not found\n */\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\n/**\n * Gets all entity metadata.\n * @returns Array of all entity metadata\n */\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\n/**\n * Clears all entity metadata.\n */\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\n/**\n * Adds column metadata to an entity.\n * @param target - The entity constructor\n * @param propertyKey - The property key\n * @param column - The column definition\n */\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n (meta.columns as Record<string, ColumnDefLike>)[propertyKey] = { ...column };\n};\n\n/**\n * Adds relation metadata to an entity.\n * @param target - The entity constructor\n * @param propertyKey - The property key\n * @param relation - The relation metadata\n */\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\n/**\n * Sets the table name and hooks for an entity.\n * @param target - The entity constructor\n * @param tableName - The table name\n * @param hooks - Optional table hooks\n */\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\n/**\n * Builds a table definition from entity metadata.\n * @template TColumns - The columns type\n * @param meta - The entity metadata\n * @returns The table definition\n */\nexport const buildTableDef = <TColumns extends Record<string, ColumnDefLike>>(meta: EntityMetadata<TColumns>): TableDef<MaterializeColumns<TColumns>> => {\n if (meta.table) {\n return meta.table;\n }\n\n // Build columns using a simpler approach that avoids type assertion\n const columns: Record<string, ColumnDef> = {};\n for (const [key, def] of Object.entries(meta.columns)) {\n columns[key] = {\n ...def,\n name: key,\n table: meta.tableName\n } as ColumnDef;\n }\n\n const table = defineTable(meta.tableName, columns as MaterializeColumns<TColumns>, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport { isTableDef } from '../schema/table-guards.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nimport { tableRef, type TableRef } from '../schema/table.js';\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\n/**\n * Bootstraps all entities by building their table definitions and relations.\n * @returns An array of table definitions for all bootstrapped entities.\n */\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\n/**\n * Gets the table definition for a given entity constructor.\n * Bootstraps entities if necessary.\n * @param ctor - The entity constructor.\n * @returns The table definition or undefined if not found.\n */\nexport const getTableDefFromEntity = <TTable extends TableDef = TableDef>(ctor: EntityConstructor): TTable | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n if (!meta.table) {\n bootstrapEntities();\n }\n return meta.table as TTable;\n};\n\n/**\n * Creates a select query builder for the given entity.\n * @param ctor - The entity constructor.\n * @returns A select query builder for the entity.\n */\nexport const selectFromEntity = <TTable extends TableDef = TableDef>(\n ctor: EntityConstructor\n): SelectQueryBuilder<unknown, TTable> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return new SelectQueryBuilder(table as TTable);\n};\n\n/**\n * Public API: opt-in ergonomic entity reference (decorator-level).\n *\n * Lazily bootstraps entity metadata (via getTableDefFromEntity) and returns a\n * `tableRef(...)`-style proxy so users can write `u.id` instead of `u.columns.id`.\n */\nexport const entityRef = <TTable extends TableDef = TableDef>(\n ctor: EntityConstructor\n): TableRef<TTable> => {\n const table = getTableDefFromEntity<TTable>(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return tableRef(table);\n};\n","import type { TableDef } from '../schema/table.js';\nimport type { ColumnDef } from '../schema/column-types.js';\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\n\n/**\n * Build a typed selection map from a TableDef.\n * @template TTable - The table definition type\n * @template K - The column name keys\n * @param table - The table definition to select columns from\n * @param cols - Column names to include in the selection\n * @returns A typed record mapping column names to their definitions\n * @throws Error if a specified column is not found on the table\n */\nexport function sel<\n TTable extends TableDef,\n K extends keyof TTable['columns'] & string\n>(table: TTable, ...cols: K[]): Record<K, TTable['columns'][K]> {\n const selection = {} as Record<K, TTable['columns'][K]>;\n\n for (const col of cols) {\n const def = table.columns[col] as TTable['columns'][K];\n if (!def) {\n throw new Error(`Column '${col}' not found on table '${table.name}'`);\n }\n selection[col] = def;\n }\n\n return selection;\n}\n\ntype Ctor<T> = { new(...args: unknown[]): T };\n\n/**\n * Build a typed selection map from an entity constructor.\n * @template TEntity - The entity type\n * @template K - The property name keys\n * @param entity - The entity constructor to get table definition from\n * @param props - Property names to include in the selection\n * @returns A record mapping property names to their column definitions\n * @throws Error if no table definition is registered for the entity\n * @throws Error if a specified property is not found as a column\n */\nexport function esel<TEntity extends object, K extends keyof TEntity & string>(\n entity: Ctor<TEntity>,\n ...props: K[]\n): Record<K, ColumnDef> {\n const table = getTableDefFromEntity(entity) as TableDef | undefined;\n if (!table) {\n throw new Error(`No table definition registered for entity '${entity.name}'`);\n }\n\n const selection = {} as Record<K, ColumnDef>;\n\n for (const prop of props) {\n const col = table.columns[prop];\n if (!col) {\n throw new Error(`No column '${prop}' found for entity '${entity.name}'`);\n }\n selection[prop] = col;\n }\n\n return selection;\n}\n\r\n","import { TableDef } from '../schema/table.js';\nimport { InsertQueryNode, SelectQueryNode } from '../core/ast/query.js';\nimport {\n ColumnNode,\n OperandNode,\n isValueOperandInput,\n valueToOperand\n} from '../core/ast/expression.js';\nimport {\n buildColumnNodes,\n createTableNode\n} from '../core/ast/builders.js';\n\ntype InsertRows = Record<string, unknown>[];\n\n/**\n * Maintains immutable state for building INSERT queries\n */\nexport class InsertQueryState {\n public readonly table: TableDef;\n public readonly ast: InsertQueryNode;\n\n /**\n * Creates a new InsertQueryState instance\n * @param table - The table definition for the INSERT query\n * @param ast - Optional initial AST node, defaults to a basic INSERT query\n */\n constructor(table: TableDef, ast?: InsertQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'InsertQuery',\n into: createTableNode(table),\n columns: [],\n source: {\n type: 'InsertValues',\n rows: []\n }\n };\n }\n\n private clone(nextAst: InsertQueryNode): InsertQueryState {\n return new InsertQueryState(this.table, nextAst);\n }\n\n private ensureColumnsFromRow(rows: InsertRows): ColumnNode[] {\n if (this.ast.columns.length) return this.ast.columns;\n return buildColumnNodes(this.table, Object.keys(rows[0]));\n }\n\n private appendValues(rows: OperandNode[][]): OperandNode[][] {\n if (this.ast.source.type === 'InsertValues') {\n return [...this.ast.source.rows, ...rows];\n }\n return rows;\n }\n\n private getTableColumns(): ColumnNode[] {\n const names = Object.keys(this.table.columns);\n if (!names.length) return [];\n return buildColumnNodes(this.table, names);\n }\n\n /**\n * Adds VALUES clause to the INSERT query\n * @param rows - Array of row objects to insert\n * @returns A new InsertQueryState with the VALUES clause added\n * @throws Error if mixing VALUES with SELECT source\n * @throws Error if invalid values are provided\n */\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\n if (!rows.length) return this;\n\n if (this.ast.source.type === 'InsertSelect') {\n throw new Error('Cannot mix INSERT ... VALUES with INSERT ... SELECT source.');\n }\n\n const definedColumns = this.ensureColumnsFromRow(rows);\n\n const newRows: OperandNode[][] = rows.map((row, rowIndex) =>\n definedColumns.map(column => {\n const rawValue = row[column.name];\n\n if (!isValueOperandInput(rawValue)) {\n throw new Error(\n `Invalid insert value for column \"${column.name}\" in row ${rowIndex}: only primitives, null, or OperandNodes are allowed`\n );\n }\n\n return valueToOperand(rawValue);\n })\n );\n\n return this.clone({\n ...this.ast,\n columns: definedColumns,\n source: {\n type: 'InsertValues',\n rows: this.appendValues(newRows)\n }\n });\n }\n\n /**\n * Sets the columns for the INSERT query\n * @param columns - Column nodes to insert into\n * @returns A new InsertQueryState with the specified columns\n */\n withColumns(columns: ColumnNode[]): InsertQueryState {\n if (!columns.length) return this;\n return this.clone({\n ...this.ast,\n columns: [...columns]\n });\n }\n\n /**\n * Adds SELECT source to the INSERT query\n * @param query - The SELECT query to use as source\n * @param columns - Target columns for the INSERT\n * @returns A new InsertQueryState with the SELECT source\n * @throws Error if mixing SELECT with VALUES source\n * @throws Error if no destination columns specified\n */\n withSelect(query: SelectQueryNode, columns: ColumnNode[]): InsertQueryState {\n const targetColumns =\n columns.length\n ? columns\n : this.ast.columns.length\n ? this.ast.columns\n : this.getTableColumns();\n\n if (!targetColumns.length) {\n throw new Error('INSERT ... SELECT requires specifying destination columns.');\n }\n\n if (this.ast.source.type === 'InsertValues' && this.ast.source.rows.length) {\n throw new Error('Cannot mix INSERT ... SELECT with INSERT ... VALUES source.');\n }\n\n return this.clone({\n ...this.ast,\n columns: [...targetColumns],\n source: {\n type: 'InsertSelect',\n query\n }\n });\n }\n\n /**\n * Adds a RETURNING clause to the INSERT query\n * @param columns - Columns to return after insertion\n * @returns A new InsertQueryState with the RETURNING clause added\n */\n withReturning(columns: ColumnNode[]): InsertQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n}\n","import type { SelectQueryBuilder } from './select.js';\r\nimport { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { InsertQueryNode, SelectQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype InsertDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for INSERT queries\r\n */\r\nexport class InsertQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: InsertQueryState;\r\n\r\n /**\r\n * Creates a new InsertQueryBuilder instance\r\n * @param table - The table definition for the INSERT query\r\n * @param state - Optional initial query state, defaults to a new InsertQueryState\r\n */\r\n constructor(table: TableDef, state?: InsertQueryState) {\r\n this.table = table;\r\n this.state = state ?? new InsertQueryState(table);\r\n }\r\n\r\n private clone(state: InsertQueryState): InsertQueryBuilder<T> {\r\n return new InsertQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Adds VALUES to the INSERT query\r\n * @param rowOrRows - Single row object or array of row objects to insert\r\n * @returns A new InsertQueryBuilder with the VALUES clause added\r\n */\r\n values(rowOrRows: Record<string, unknown> | Record<string, unknown>[]): InsertQueryBuilder<T> {\r\n const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];\r\n if (!rows.length) return this;\r\n return this.clone(this.state.withValues(rows));\r\n }\r\n\r\n /**\r\n * Specifies the columns for the INSERT query\r\n * @param columns - Column definitions or nodes to insert into\r\n * @returns A new InsertQueryBuilder with the specified columns\r\n */\r\n columns(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n return this.clone(this.state.withColumns(this.resolveColumnNodes(columns)));\r\n }\r\n\r\n /**\r\n * Sets the source of the INSERT query to a SELECT query\r\n * @template TSource - The source table type\r\n * @param query - The SELECT query or query builder to use as source\r\n * @param columns - Optional target columns for the INSERT\r\n * @returns A new InsertQueryBuilder with the SELECT source\r\n */\r\n fromSelect<TSource extends TableDef>(\r\n query: SelectQueryNode | SelectQueryBuilder<unknown, TSource>,\r\n columns: (ColumnDef | ColumnNode)[] = []\r\n ): InsertQueryBuilder<T> {\r\n const ast = this.resolveSelectQuery(query);\r\n const nodes = columns.length ? this.resolveColumnNodes(columns) : [];\r\n return this.clone(this.state.withSelect(ast, nodes));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the INSERT query\r\n * @param columns - Columns to return after insertion\r\n * @returns A new InsertQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Helpers for column/AST resolution\r\n private resolveColumnNodes(columns: (ColumnDef | ColumnNode)[]): ColumnNode[] {\r\n return columns.map(column => buildColumnNode(this.table, column));\r\n }\r\n\r\n private resolveSelectQuery<TSource extends TableDef>(\r\n query: SelectQueryNode | SelectQueryBuilder<unknown, TSource>\r\n ): SelectQueryNode {\r\n const candidate = query as { getAST?: () => SelectQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as SelectQueryNode);\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n /**\r\n * Compiles the INSERT query\r\n * @param compiler - The INSERT compiler to use\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(compiler: InsertCompiler): CompiledQuery;\r\n /**\r\n * Compiles the INSERT query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: InsertDialectInput): CompiledQuery;\r\n\r\n compile(arg: InsertCompiler | InsertDialectInput): CompiledQuery {\r\n const candidate = arg as { compileInsert?: (ast: InsertQueryNode) => CompiledQuery };\r\n if (typeof candidate.compileInsert === 'function') {\r\n // InsertCompiler path – old behavior\r\n return candidate.compileInsert(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as InsertDialectInput);\r\n return dialect.compileInsert(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the INSERT query\r\n * @param arg - The compiler or dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(arg: InsertCompiler | InsertDialectInput): string {\r\n return this.compile(arg as InsertCompiler).sql;\r\n }\r\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the INSERT query\r\n */\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\n","import { TableDef } from '../schema/table.js';\nimport {\n ColumnNode,\n ExpressionNode,\n OperandNode,\n isOperandNode,\n valueToOperand\n} from '../core/ast/expression.js';\nimport {\n TableSourceNode,\n UpdateQueryNode,\n UpdateAssignmentNode\n} from '../core/ast/query.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { createTableNode } from '../core/ast/builders.js';\n\n/**\n * Literal values that can be used in UPDATE statements\n */\ntype LiteralValue = string | number | boolean | null;\n\n/**\n * Values allowed in UPDATE SET clauses\n */\ntype UpdateValue = OperandNode | LiteralValue;\n\n/**\n * Type guard to check if a value is valid for UPDATE operations\n * @param value - Value to check\n * @returns True if value is a valid update value\n */\nconst isUpdateValue = (value: unknown): value is UpdateValue => {\n if (value === null) return true;\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return true;\n default:\n return isOperandNode(value);\n }\n};\n\n/**\n * Immutable state for UPDATE queries\n */\nexport class UpdateQueryState {\n public readonly table: TableDef;\n public readonly ast: UpdateQueryNode;\n\n /**\n * Creates a new UpdateQueryState instance\n * @param table - Table definition for the update\n * @param ast - Optional existing AST\n */\n constructor(table: TableDef, ast?: UpdateQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'UpdateQuery',\n table: createTableNode(table),\n set: [],\n joins: []\n };\n }\n\n /**\n * Creates a new UpdateQueryState with updated AST\n * @param nextAst - Updated AST\n * @returns New UpdateQueryState instance\n */\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\n return new UpdateQueryState(this.table, nextAst);\n }\n\n /**\n * Sets the columns to update with their new values\n * @param values - Record of column names to values\n * @returns New UpdateQueryState with SET clause\n */\n withSet(values: Record<string, unknown>): UpdateQueryState {\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, rawValue]) => {\n if (!isUpdateValue(rawValue)) {\n throw new Error(\n `Invalid update value for column \"${column}\": only primitives, null, or OperandNodes are allowed`\n );\n }\n\n return {\n column: {\n type: 'Column',\n table: this.table.name,\n name: column\n },\n value: valueToOperand(rawValue)\n };\n });\n\n return this.clone({\n ...this.ast,\n set: assignments\n });\n }\n\n /**\n * Adds a WHERE condition to the update query\n * @param expr - WHERE expression\n * @returns New UpdateQueryState with WHERE clause\n */\n withWhere(expr: ExpressionNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n where: expr\n });\n }\n\n /**\n * Adds a RETURNING clause to the update query\n * @param columns - Columns to return\n * @returns New UpdateQueryState with RETURNING clause\n */\n withReturning(columns: ColumnNode[]): UpdateQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n\n /**\n * Sets the FROM clause for the update query\n * @param from - Table source for FROM\n * @returns New UpdateQueryState with FROM clause\n */\n withFrom(from: TableSourceNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\n /**\n * Adds a JOIN to the update query\n * @param join - Join node to add\n * @returns New UpdateQueryState with JOIN\n */\n withJoin(join: JoinNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Applies an alias to the table being updated\n * @param alias - Alias for the table\n * @returns New UpdateQueryState with table alias\n */\n withTableAlias(alias: string): UpdateQueryState {\n return this.clone({\n ...this.ast,\n table: {\n ...this.ast.table,\n alias\n }\n });\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { JOIN_KINDS, JoinKind } from '../core/sql/sql.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { TableSourceNode, UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { OrmSession } from '../orm/orm-session.js';\r\nimport { QueryResult } from '../core/execution/db-executor.js';\r\n\r\ntype UpdateDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for UPDATE queries\r\n */\r\nexport class UpdateQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: UpdateQueryState;\r\n\r\n /**\r\n * Creates a new UpdateQueryBuilder instance\r\n * @param table - The table definition for the UPDATE query\r\n * @param state - Optional initial query state, defaults to a new UpdateQueryState\r\n */\r\n constructor(table: TableDef, state?: UpdateQueryState) {\r\n this.table = table;\r\n this.state = state ?? new UpdateQueryState(table);\r\n }\r\n\r\n private clone(state: UpdateQueryState): UpdateQueryBuilder<T> {\r\n return new UpdateQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Sets an alias for the table in the UPDATE query\r\n * @param alias - The alias to assign to the table\r\n * @returns A new UpdateQueryBuilder with the table alias set\r\n */\r\n as(alias: string): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withTableAlias(alias));\r\n }\r\n\r\n /**\r\n * Adds a FROM clause to the UPDATE query\r\n * @param source - The table source to use in the FROM clause\r\n * @returns A new UpdateQueryBuilder with the FROM clause added\r\n */\r\n from(source: TableDef | TableSourceNode): UpdateQueryBuilder<T> {\r\n const tableSource = this.resolveTableSource(source);\r\n return this.clone(this.state.withFrom(tableSource));\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the UPDATE query\r\n * @param table - The table to join with\r\n * @param condition - The join condition expression\r\n * @param kind - The type of join (defaults to INNER)\r\n * @param relationName - Optional name for the relation\r\n * @returns A new UpdateQueryBuilder with the JOIN clause added\r\n */\r\n join(\r\n table: TableDef | TableSourceNode | string,\r\n condition: ExpressionNode,\r\n kind: JoinKind = JOIN_KINDS.INNER,\r\n relationName?: string\r\n ): UpdateQueryBuilder<T> {\r\n const joinTarget = this.resolveJoinTarget(table);\r\n const joinNode = createJoinNode(kind, joinTarget, condition, relationName);\r\n return this.clone(this.state.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Adds a SET clause to the UPDATE query\r\n * @param values - The column-value pairs to update\r\n * @returns A new UpdateQueryBuilder with the SET clause added\r\n */\r\n set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the UPDATE query\r\n * @param expr - The expression to use as the WHERE condition\r\n * @returns A new UpdateQueryBuilder with the WHERE clause added\r\n */\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the UPDATE query\r\n * @param columns - Columns to return after update\r\n * @returns A new UpdateQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): UpdateQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n private resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n }\r\n\r\n private resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return this.resolveTableSource(table);\r\n }\r\n\r\n /**\r\n * Compiles the UPDATE query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: UpdateDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileUpdate(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the UPDATE query\r\n * @param dialect - The SQL dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(dialect: UpdateDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Executes the UPDATE query using the provided session\r\n * @param session - The ORM session to execute the query with\r\n * @returns A promise that resolves to the query results\r\n */\r\n async execute(session: OrmSession): Promise<QueryResult[]> {\n const execCtx = session.getExecutionContext();\n const compiled = this.compile(execCtx.dialect);\n return execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n }\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the UPDATE query\r\n */\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\nconst isTableSourceNode = (source: TableDef | TableSourceNode): source is TableSourceNode =>\r\n typeof (source as TableSourceNode).type === 'string';\r\n\r\n","import { TableDef } from '../schema/table.js';\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\nimport {\n DeleteQueryNode,\n TableSourceNode\n} from '../core/ast/query.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { createTableNode } from '../core/ast/builders.js';\n\n/**\n * Maintains immutable state for DELETE queries\n */\nexport class DeleteQueryState {\n public readonly table: TableDef;\n public readonly ast: DeleteQueryNode;\n\n /**\n * Creates a new DeleteQueryState instance\n * @param table - The table definition for the DELETE query\n * @param ast - Optional initial AST node, defaults to a basic DELETE query\n */\n constructor(table: TableDef, ast?: DeleteQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'DeleteQuery',\n from: createTableNode(table),\n joins: []\n };\n }\n\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\n return new DeleteQueryState(this.table, nextAst);\n }\n\n /**\n * Adds a WHERE clause to the DELETE query\n * @param expr - The expression to use as the WHERE condition\n * @returns A new DeleteQueryState with the WHERE clause added\n */\n withWhere(expr: ExpressionNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n where: expr\n });\n }\n\n /**\n * Adds a RETURNING clause to the DELETE query\n * @param columns - The columns to return after deletion\n * @returns A new DeleteQueryState with the RETURNING clause added\n */\n withReturning(columns: ColumnNode[]): DeleteQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n\n /**\n * Adds a USING clause to the DELETE query\n * @param source - The table source to use in the USING clause\n * @returns A new DeleteQueryState with the USING clause added\n */\n withUsing(source: TableSourceNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n using: source\n });\n }\n\n /**\n * Adds a JOIN clause to the DELETE query\n * @param join - The join node to add\n * @returns A new DeleteQueryState with the JOIN clause added\n */\n withJoin(join: JoinNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Sets an alias for the table in the DELETE query\n * @param alias - The alias to assign to the table\n * @returns A new DeleteQueryState with the table alias set\n */\n withTableAlias(alias: string): DeleteQueryState {\n return this.clone({\n ...this.ast,\n from: {\n ...this.ast.from,\n alias\n }\n });\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { JOIN_KINDS, JoinKind } from '../core/sql/sql.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { TableSourceNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { OrmSession } from '../orm/orm-session.js';\r\nimport { QueryResult } from '../core/execution/db-executor.js';\r\n\r\ntype DeleteDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for DELETE queries\r\n */\r\nexport class DeleteQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: DeleteQueryState;\r\n\r\n /**\r\n * Creates a new DeleteQueryBuilder instance\r\n * @param table - The table definition for the DELETE query\r\n * @param state - Optional initial query state, defaults to a new DeleteQueryState\r\n */\r\n constructor(table: TableDef, state?: DeleteQueryState) {\r\n this.table = table;\r\n this.state = state ?? new DeleteQueryState(table);\r\n }\r\n\r\n private clone(state: DeleteQueryState): DeleteQueryBuilder<T> {\r\n return new DeleteQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the DELETE query\r\n * @param expr - The expression to use as the WHERE condition\r\n * @returns A new DeleteQueryBuilder with the WHERE clause added\r\n */\r\n where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n /**\r\n * Sets an alias for the table in the DELETE query\r\n * @param alias - The alias to assign to the table\r\n * @returns A new DeleteQueryBuilder with the table alias set\r\n */\r\n as(alias: string): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withTableAlias(alias));\r\n }\r\n\r\n /**\r\n * Adds a USING clause to the DELETE query\r\n * @param source - The table source to use in the USING clause\r\n * @returns A new DeleteQueryBuilder with the USING clause added\r\n */\r\n using(source: TableDef | TableSourceNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withUsing(this.resolveTableSource(source)));\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the DELETE query\r\n * @param table - The table to join with\r\n * @param condition - The join condition expression\r\n * @param kind - The type of join (defaults to INNER)\r\n * @param relationName - Optional name for the relation\r\n * @returns A new DeleteQueryBuilder with the JOIN clause added\r\n */\r\n join(\r\n table: TableDef | TableSourceNode | string,\r\n condition: ExpressionNode,\r\n kind: JoinKind = JOIN_KINDS.INNER,\r\n relationName?: string\r\n ): DeleteQueryBuilder<T> {\r\n const target = this.resolveJoinTarget(table);\r\n const joinNode = createJoinNode(kind, target, condition, relationName);\r\n return this.clone(this.state.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the DELETE query\r\n * @param columns - The columns to return after deletion\r\n * @returns A new DeleteQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): DeleteQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n private resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n }\r\n\r\n private resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return this.resolveTableSource(table);\r\n }\r\n\r\n /**\r\n * Compiles the DELETE query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: DeleteDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileDelete(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the DELETE query\r\n * @param dialect - The SQL dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(dialect: DeleteDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Executes the DELETE query using the provided session\r\n * @param session - The ORM session to execute the query with\r\n * @returns A promise that resolves to the query results\r\n */\r\n async execute(session: OrmSession): Promise<QueryResult[]> {\n const execCtx = session.getExecutionContext();\n const compiled = this.compile(execCtx.dialect);\n return execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n }\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the DELETE query\r\n */\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\nconst isTableSourceNode = (source: TableDef | TableSourceNode): source is TableSourceNode =>\r\n typeof (source as TableSourceNode).type === 'string';\r\n\r\n","import type { TableDef, IndexColumn } from '../../schema/table.js';\r\nimport type { ColumnDef, RawDefaultValue } from '../../schema/column-types.js';\r\n\r\n/**\r\n * Minimal surface for anything that can quote identifiers.\r\n * Implemented by SchemaDialect, runtime Dialect, etc.\r\n */\r\nexport interface Quoter {\r\n quoteIdentifier(id: string): string;\r\n}\r\n\r\n/**\r\n * Escape a value to be safe inside a single-quoted SQL literal.\r\n * Purely mechanical; no dialect knowledge.\r\n */\r\nexport const escapeSqlString = (value: string): string =>\r\n value.replace(/'/g, \"''\");\r\n\r\n/**\r\n * Narrow a value to the RawDefaultValue shape.\r\n * This is domain-specific but dialect-agnostic.\r\n */\r\nexport const isRawDefault = (value: unknown): value is RawDefaultValue =>\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'raw' in value &&\r\n typeof (value as RawDefaultValue).raw === 'string';\r\n\r\n/**\r\n * Abstraction for \"how do I turn values into SQL literals\".\r\n * Implemented or configured by each dialect.\r\n */\r\nexport interface LiteralFormatter {\r\n formatLiteral(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Declarative options for building a LiteralFormatter.\r\n * Dialects configure behavior by data, not by being hard-coded here.\r\n */\r\nexport interface LiteralFormatOptions {\r\n nullLiteral?: string; // default: 'NULL'\r\n booleanTrue?: string; // default: 'TRUE'\r\n booleanFalse?: string; // default: 'FALSE'\r\n\r\n numberFormatter?: (value: number) => string;\r\n dateFormatter?: (value: Date) => string;\r\n stringWrapper?: (escaped: string) => string; // how to wrap an escaped string\r\n jsonWrapper?: (escaped: string) => string; // how to wrap escaped JSON\r\n}\r\n\r\n/**\r\n * Factory for a value-based LiteralFormatter that:\r\n * - Handles type dispatch (null/number/boolean/date/string/object/raw)\r\n * - Delegates representation choices to options\r\n * - Knows nothing about concrete dialects\r\n */\r\nexport const createLiteralFormatter = (\r\n options: LiteralFormatOptions = {}\r\n): LiteralFormatter => {\r\n const {\r\n nullLiteral = 'NULL',\r\n booleanTrue = 'TRUE',\r\n booleanFalse = 'FALSE',\r\n\r\n numberFormatter = (value: number): string =>\r\n Number.isFinite(value) ? String(value) : nullLiteral,\r\n\r\n dateFormatter = (value: Date): string =>\r\n `'${escapeSqlString(value.toISOString())}'`,\r\n\r\n stringWrapper = (escaped: string): string => `'${escaped}'`,\r\n jsonWrapper = (escaped: string): string => `'${escaped}'`,\r\n } = options;\r\n\r\n const wrapString = stringWrapper;\r\n const wrapJson = jsonWrapper;\r\n\r\n const format = (value: unknown): string => {\r\n // Domain rule: raw defaults bypass all formatting.\r\n if (isRawDefault(value)) return value.raw;\r\n\r\n if (value === null) return nullLiteral;\r\n\r\n if (typeof value === 'number') {\r\n return numberFormatter(value);\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value ? booleanTrue : booleanFalse;\r\n }\r\n\r\n if (value instanceof Date) {\r\n return dateFormatter(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return wrapString(escapeSqlString(value));\r\n }\r\n\r\n // Fallback: serialize to JSON then treat as string.\r\n return wrapJson(escapeSqlString(JSON.stringify(value)));\r\n };\r\n\r\n return {\r\n formatLiteral: format,\r\n };\r\n};\r\n\r\n/**\r\n * Convenience wrapper if you prefer a functional style at call-sites.\r\n */\r\nexport const formatLiteral = (\r\n formatter: LiteralFormatter,\r\n value: unknown\r\n): string => formatter.formatLiteral(value);\r\n\r\n/**\r\n * Quotes a possibly qualified identifier like \"schema.table\" or \"db.schema.table\"\r\n * using a Quoter that knows how to quote a single segment.\r\n */\r\nexport const quoteQualified = (quoter: Quoter, identifier: string): string => {\r\n const parts = identifier.split('.');\r\n return parts.map(part => quoter.quoteIdentifier(part)).join('.');\r\n};\r\n\r\n/**\r\n * Renders index column list, including optional order / nulls, using the\r\n * provided Quoter for identifier quoting.\r\n */\r\nexport const renderIndexColumns = (\r\n quoter: Quoter,\r\n columns: (string | IndexColumn)[]\r\n): string =>\r\n columns\r\n .map(col => {\r\n if (typeof col === 'string') {\r\n return quoter.quoteIdentifier(col);\r\n }\r\n\r\n const parts: string[] = [quoter.quoteIdentifier(col.column)];\r\n\r\n if (col.order) {\r\n parts.push(col.order);\r\n }\r\n\r\n if (col.nulls) {\r\n parts.push(`NULLS ${col.nulls}`);\r\n }\r\n\r\n return parts.join(' ');\r\n })\r\n .join(', ');\r\n\r\n/**\r\n * Resolves the primary key column names for a table, based purely on schema\r\n * metadata. This is domain logic, but independent from any dialect.\r\n */\r\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\r\n if (Array.isArray(table.primaryKey) && table.primaryKey.length > 0) {\r\n return table.primaryKey;\r\n }\r\n\r\n const columns = Object.values(table.columns ?? {}) as ColumnDef[];\r\n\r\n // `primary` / `name` are domain-level properties of ColumnDef.\r\n return columns\r\n .filter(col => col.primary)\r\n .map(col => col.name);\r\n};\r\n\r\n","import type { TableDef } from '../../schema/table.js';\nimport type { ColumnDef } from '../../schema/column-types.js';\nimport type { SchemaDialect } from './schema-dialect.js';\nimport { resolvePrimaryKey } from './sql-writing.js';\nimport { DialectName } from './schema-dialect.js';\n\n/** Result of generating schema SQL. */\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\n/** Options for rendering column definitions. */\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\n\n/**\n * Renders a column definition for SQL.\n * @param table - The table definition.\n * @param col - The column definition.\n * @param dialect - The schema dialect.\n * @param options - Options for rendering.\n * @returns The rendered SQL and whether primary key is inline.\n */\nexport const renderColumnDefinition = (\n table: TableDef,\n col: ColumnDef,\n dialect: SchemaDialect,\n options: RenderColumnOptions = {}\n): { sql: string; inlinePrimary: boolean } => {\n const parts: string[] = [];\n parts.push(dialect.quoteIdentifier(col.name));\n parts.push(dialect.renderColumnType(col));\n\n const autoInc = dialect.renderAutoIncrement(col, table);\n if (autoInc) parts.push(autoInc);\n\n if (col.notNull) parts.push('NOT NULL');\n if (col.unique) parts.push('UNIQUE');\n if (col.default !== undefined) {\n parts.push(`DEFAULT ${dialect.renderDefault(col.default, col)}`);\n }\n if (options.includePrimary && col.primary) {\n parts.push('PRIMARY KEY');\n }\n if (col.check) {\n parts.push(`CHECK (${col.check})`);\n }\n if (col.references) {\n parts.push(dialect.renderReference(col.references, table));\n }\n\n return { sql: parts.join(' '), inlinePrimary: !!(options.includePrimary && col.primary) };\n};\n\n/**\n * Generates SQL to create a table.\n * @param table - The table definition.\n * @param dialect - The schema dialect.\n * @returns The table SQL and index SQL.\n */\nexport const generateCreateTableSql = (\n table: TableDef,\n dialect: SchemaDialect\n): SchemaGenerateResult => {\n const pk = resolvePrimaryKey(table);\n const inlinePkColumns = new Set<string>();\n\n const columnLines = Object.values(table.columns).map(col => {\n const includePk = dialect.preferInlinePkAutoincrement(col, table, pk) && pk.includes(col.name);\n if (includePk) {\n inlinePkColumns.add(col.name);\n }\n return renderColumnDefinition(table, col, dialect, { includePrimary: includePk }).sql;\n });\n\n const constraintLines: string[] = [];\n\n if (pk.length > 0 && !(pk.length === 1 && inlinePkColumns.has(pk[0]))) {\n const cols = pk.map(c => dialect.quoteIdentifier(c)).join(', ');\n constraintLines.push(`PRIMARY KEY (${cols})`);\n }\n\n if (table.checks) {\n table.checks.forEach(check => {\n const name = check.name ? `${dialect.quoteIdentifier(check.name)} ` : '';\n constraintLines.push(`CONSTRAINT ${name}CHECK (${check.expression})`);\n });\n }\n\n const allLines = [...columnLines, ...constraintLines];\n const body = allLines.map(line => ` ${line}`).join(',\\n');\n const tableOptions = dialect.renderTableOptions(table);\n const tableSql = `CREATE TABLE ${dialect.formatTableName(table)} (\\n${body}\\n)${tableOptions ? ' ' + tableOptions : ''};`;\n\n const indexSql: string[] = [];\n if (table.indexes && table.indexes.length > 0) {\n for (const idx of table.indexes) {\n if (idx.where && !dialect.supportsPartialIndexes()) {\n throw new Error(`Dialect ${dialect.name} does not support partial/filtered indexes (${idx.name || idx.columns.join('_')}).`);\n }\n indexSql.push(dialect.renderIndex(table, idx));\n }\n }\n\n return { tableSql, indexSql };\n};\n\n/**\n * Generates SQL for creating multiple tables.\n * @param tables - The table definitions.\n * @param dialect - The schema dialect.\n * @returns The SQL statements.\n */\nexport const generateSchemaSql = (\n tables: TableDef[],\n dialect: SchemaDialect\n): string[] => {\n const ordered = orderTablesByDependencies(tables);\n const statements: string[] = [];\n ordered.forEach(table => {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n statements.push(tableSql, ...indexSql);\n });\n return statements;\n};\n\nconst orderTablesByDependencies = (tables: TableDef[]): TableDef[] => {\n const map = new Map<string, TableDef>();\n tables.forEach(t => map.set(t.name, t));\n\n const deps = new Map<string, Set<string>>();\n for (const table of tables) {\n const refTables = new Set<string>();\n Object.values(table.columns).forEach(col => {\n if (col.references?.table) {\n refTables.add(col.references.table);\n }\n });\n deps.set(table.name, refTables);\n }\n\n const visited = new Set<string>();\n const ordered: TableDef[] = [];\n\n const visit = (name: string, stack: Set<string>) => {\n if (visited.has(name)) return;\n const table = map.get(name);\n if (!table) return;\n if (stack.has(name)) {\n ordered.push(table);\n visited.add(name);\n return;\n }\n stack.add(name);\n for (const dep of deps.get(name) || []) {\n visit(dep, stack);\n }\n stack.delete(name);\n visited.add(name);\n ordered.push(table);\n };\n\n tables.forEach(t => visit(t.name, new Set()));\n return ordered;\n};\n\n// Re-export DialectName for backward compatibility\nexport type { DialectName };\n\r\n","import type { TableDef, IndexDef } from '../../schema/table.js';\r\n\r\n/**\r\n * Derives the name for an index based on the table and index definition.\r\n * @param table - The table definition.\r\n * @param index - The index definition.\r\n * @returns The derived index name.\r\n */\r\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\r\n const base = (index.columns ?? [])\r\n .map(col => (typeof col === 'string' ? col : col.column))\r\n .join('_');\r\n\r\n const suffix = index.unique ? 'uniq' : 'idx';\r\n return `${table.name}_${base}_${suffix}`;\r\n};\r\n","import { TableDef } from '../../schema/table.js';\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport type { DbExecutor } from '../execution/db-executor.js';\r\nimport { SchemaDialect } from './schema-dialect.js';\r\nimport { deriveIndexName } from './naming-strategy.js';\r\nimport { generateCreateTableSql, renderColumnDefinition } from './schema-generator.js';\r\nimport { ColumnDiff, DatabaseColumn, DatabaseSchema, DatabaseTable } from './schema-types.js';\r\n\r\n/** The kind of schema change. */\r\nexport type SchemaChangeKind =\r\n | 'createTable'\r\n | 'dropTable'\r\n | 'addColumn'\r\n | 'dropColumn'\r\n | 'alterColumn'\r\n | 'addIndex'\r\n | 'dropIndex';\r\n\r\n/** Represents a single schema change. */\r\nexport interface SchemaChange {\r\n kind: SchemaChangeKind;\r\n table: string;\r\n description: string;\r\n statements: string[];\r\n safe: boolean;\r\n}\r\n\r\n/** Represents a plan of schema changes. */\r\nexport interface SchemaPlan {\r\n changes: SchemaChange[];\r\n warnings: string[];\r\n}\r\n\r\n/** Options for schema diffing. */\r\nexport interface SchemaDiffOptions {\r\n /** Allow destructive operations (drops) */\r\n allowDestructive?: boolean;\r\n}\r\n\r\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\r\n\r\nconst mapTables = (schema: DatabaseSchema) => {\r\n const map = new Map<string, DatabaseTable>();\r\n for (const table of schema.tables) {\r\n map.set(tableKey(table.name, table.schema), table);\r\n }\r\n return map;\r\n};\r\n\r\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\r\n const column = table.columns[colName];\r\n const rendered = renderColumnDefinition(table, column, dialect);\r\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\r\n};\r\n\r\nconst normalizeType = (value: string | undefined): string => (value || '').toLowerCase().replace(/\\s+/g, ' ').trim();\r\nconst normalizeDefault = (value: unknown): string | undefined => {\r\n if (value === undefined || value === null) return undefined;\r\n return String(value).trim();\r\n};\r\n\r\nconst diffColumn = (expected: ColumnDef, actual: DatabaseColumn, dialect: SchemaDialect): ColumnDiff => {\r\n const expectedType = normalizeType(dialect.renderColumnType(expected));\r\n const actualType = normalizeType(actual.type);\r\n const expectedDefault =\r\n expected.default !== undefined ? normalizeDefault(dialect.renderDefault(expected.default, expected)) : undefined;\r\n const actualDefault = normalizeDefault(actual.default);\r\n return {\r\n typeChanged: expectedType !== actualType,\r\n nullabilityChanged: !!expected.notNull !== !!actual.notNull,\r\n defaultChanged: expectedDefault !== actualDefault,\r\n autoIncrementChanged: !!expected.autoIncrement !== !!actual.autoIncrement\r\n };\r\n};\r\n\r\n/**\r\n * Computes the differences between expected and actual database schemas.\r\n * @param expectedTables - The expected table definitions.\r\n * @param actualSchema - The actual database schema.\r\n * @param dialect - The schema dialect.\r\n * @param options - Options for the diff.\r\n * @returns The schema plan with changes and warnings.\r\n */\r\nexport const diffSchema = (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n options: SchemaDiffOptions = {}\r\n): SchemaPlan => {\r\n const allowDestructive = options.allowDestructive ?? false;\r\n const plan: SchemaPlan = { changes: [], warnings: [] };\r\n\r\n const actualMap = mapTables(actualSchema);\r\n\r\n // Create missing tables and indexes\r\n for (const table of expectedTables) {\r\n const key = tableKey(table.name, table.schema);\r\n const actual = actualMap.get(key);\r\n if (!actual) {\r\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\r\n plan.changes.push({\r\n kind: 'createTable',\r\n table: key,\r\n description: `Create table ${key}`,\r\n statements: [tableSql, ...indexSql],\r\n safe: true\r\n });\r\n continue;\r\n }\r\n\r\n // Columns\r\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\r\n for (const colName of Object.keys(table.columns)) {\r\n if (!actualCols.has(colName)) {\r\n plan.changes.push({\r\n kind: 'addColumn',\r\n table: key,\r\n description: `Add column ${colName} to ${key}`,\r\n statements: [buildAddColumnSql(table, colName, dialect)],\r\n safe: true\r\n });\r\n } else {\r\n const expectedCol = table.columns[colName];\r\n const actualCol = actualCols.get(colName)!;\r\n const colDiff = diffColumn(expectedCol, actualCol, dialect);\r\n const shouldAlter =\r\n colDiff.typeChanged || colDiff.nullabilityChanged || colDiff.defaultChanged || colDiff.autoIncrementChanged;\r\n if (shouldAlter) {\r\n const statements = dialect.alterColumnSql?.(table, expectedCol, actualCol, colDiff) ?? [];\r\n if (statements.length > 0) {\r\n plan.changes.push({\r\n kind: 'alterColumn',\r\n table: key,\r\n description: `Alter column ${colName} on ${key}`,\r\n statements,\r\n safe: true\r\n });\r\n }\r\n const warning = dialect.warnAlterColumn?.(table, expectedCol, actualCol, colDiff);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n }\r\n for (const colName of actualCols.keys()) {\r\n if (!table.columns[colName]) {\r\n plan.changes.push({\r\n kind: 'dropColumn',\r\n table: key,\r\n description: `Drop column ${colName} from ${key}`,\r\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\r\n safe: false\r\n });\r\n const warning = dialect.warnDropColumn?.(actual, colName);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n\r\n // Indexes (naive: based on name or derived name)\r\n const expectedIndexes = table.indexes ?? [];\r\n const actualIndexes = actual.indexes ?? [];\r\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\r\n\r\n for (const idx of expectedIndexes) {\r\n const name = idx.name || deriveIndexName(table, idx);\r\n if (!actualIndexMap.has(name)) {\r\n plan.changes.push({\r\n kind: 'addIndex',\r\n table: key,\r\n description: `Create index ${name} on ${key}`,\r\n statements: [dialect.renderIndex(table, { ...idx, name })],\r\n safe: true\r\n });\r\n }\r\n }\r\n\r\n for (const idx of actualIndexes) {\r\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\r\n plan.changes.push({\r\n kind: 'dropIndex',\r\n table: key,\r\n description: `Drop index ${idx.name} on ${key}`,\r\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Extra tables\r\n for (const actual of actualSchema.tables) {\r\n const key = tableKey(actual.name, actual.schema);\r\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\r\n plan.changes.push({\r\n kind: 'dropTable',\r\n table: key,\r\n description: `Drop table ${key}`,\r\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n\r\n return plan;\r\n};\r\n\r\n/** Options for schema synchronization. */\r\nexport interface SynchronizeOptions extends SchemaDiffOptions {\r\n dryRun?: boolean;\r\n}\r\n\r\n/**\r\n * Synchronizes the database schema with the expected tables.\r\n * @param expectedTables - The expected table definitions.\r\n * @param actualSchema - The actual database schema.\r\n * @param dialect - The schema dialect.\r\n * @param executor - The database executor.\r\n * @param options - Options for synchronization.\r\n * @returns The schema plan with changes and warnings.\r\n */\r\nexport const synchronizeSchema = async (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n executor: DbExecutor,\r\n options: SynchronizeOptions = {}\r\n): Promise<SchemaPlan> => {\r\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\r\n if (!options.dryRun) {\r\n const { executeSchemaPlan } = await import('./schema-plan-executor.js');\r\n await executeSchemaPlan(plan, executor, options);\r\n }\r\n return plan;\r\n};\r\n\r\n","import { DbExecutor, QueryResult } from '../../execution/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\n/**\n * Converts a query result to an array of row objects.\n * @param result - The query result.\n * @returns The array of rows.\n */\nexport const toRows = (result: QueryResult | undefined): Record<string, unknown>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, unknown>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\n/**\n * Executes a SQL query and returns the rows.\n * @param executor - The database executor.\n * @param sql - The SQL query.\n * @param params - The query parameters.\n * @returns The array of rows.\n */\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, unknown>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\n\n/**\n * Checks if a table should be included in introspection based on options.\n * @param name - The table name.\n * @param options - The introspection options.\n * @returns True if the table should be included.\n */\nexport const shouldIncludeTable = (name: string, options: IntrospectOptions): boolean => {\n if (options.includeTables && !options.includeTables.includes(name)) return false;\n if (options.excludeTables && options.excludeTables.includes(name)) return false;\n return true;\n};\n","import { defineTable } from '../../../../schema/table.js';\r\nimport { col } from '../../../../schema/column-types.js';\r\n\r\n/** Table definition for information_schema.columns, providing metadata about table columns. */\r\nexport const PgInformationSchemaColumns = defineTable(\r\n 'columns',\r\n {\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n data_type: col.varchar(255),\r\n is_nullable: col.varchar(3),\r\n column_default: col.varchar(1024),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgClass = defineTable(\r\n 'pg_class',\r\n {\r\n oid: col.int(),\r\n relname: col.varchar(255),\r\n relnamespace: col.int(),\r\n relkind: col.varchar(1)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgNamespace = defineTable(\r\n 'pg_namespace',\r\n {\r\n oid: col.int(),\r\n nspname: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgIndex = defineTable(\r\n 'pg_index',\r\n {\r\n indrelid: col.int(),\r\n indexrelid: col.int(),\r\n indisprimary: col.boolean(),\r\n indkey: col.varchar(255),\r\n indpred: col.varchar(1024)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgAttribute = defineTable(\r\n 'pg_attribute',\r\n {\r\n attrelid: col.int(),\r\n attname: col.varchar(255),\r\n attnum: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgTableConstraints = defineTable(\r\n 'table_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n constraint_type: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgKeyColumnUsage = defineTable(\r\n 'key_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgConstraintColumnUsage = defineTable(\r\n 'constraint_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgReferentialConstraints = defineTable(\r\n 'referential_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n unique_constraint_catalog: col.varchar(255),\r\n unique_constraint_schema: col.varchar(255),\r\n unique_constraint_name: col.varchar(255),\r\n match_option: col.varchar(64),\r\n update_rule: col.varchar(64),\r\n delete_rule: col.varchar(64)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\n/** Default export containing commonly used PostgreSQL catalog table definitions. */\r\nexport default {\r\n PgInformationSchemaColumns,\r\n PgClass,\r\n PgNamespace,\r\n PgIndex,\r\n PgAttribute\r\n};\r\n\r\n","import type { IntrospectContext } from './context.js';\r\nimport type { SelectQueryNode } from '../../ast/query.js';\r\n\r\nimport { queryRows } from './utils.js';\r\n\r\n/** A source that can provide a select query AST. */\r\ntype SelectQuerySource = { getAST(): SelectQueryNode };\r\n\r\n/**\r\n * Runs a select query from a query builder and returns the results.\r\n * @param qb - The query builder.\r\n * @param ctx - The introspection context.\r\n * @returns The query results.\r\n */\r\nexport async function runSelect<T = Record<string, unknown>>(\r\n qb: SelectQuerySource,\r\n ctx: IntrospectContext\r\n): Promise<T[]> {\r\n const ast = qb.getAST();\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n return (await queryRows(ctx.executor, compiled.sql, compiled.params)) as T[];\r\n}\r\n\r\nexport default runSelect;\r\n\r\n/**\r\n * Runs a select query from an AST node and returns the results.\r\n * @param ast - The select query AST.\r\n * @param ctx - The introspection context.\r\n * @returns The query results.\r\n */\r\nexport async function runSelectNode<T = Record<string, unknown>>(ast: SelectQueryNode, ctx: IntrospectContext): Promise<T[]> {\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n return (await queryRows(ctx.executor, compiled.sql, compiled.params)) as T[];\r\n}\r\n","import type { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { shouldIncludeTable, queryRows } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport type { ReferentialAction } from '../../../schema/column-types.js';\r\nimport type { IntrospectContext } from './context.js';\r\nimport { PgInformationSchemaColumns } from './catalogs/postgres.js';\r\nimport { PgKeyColumnUsage, PgTableConstraints, PgConstraintColumnUsage, PgReferentialConstraints } from './catalogs/postgres.js';\r\nimport { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport { eq, and } from '../../ast/expression-builders.js';\r\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\r\nimport type { JoinNode } from '../../ast/join.js';\r\nimport type { ColumnNode, ExpressionNode } from '../../ast/expression-nodes.js';\r\nimport { fnTable } from '../../ast/builders.js';\r\nimport { runSelect, runSelectNode } from './run-select.js';\r\n\r\n/** Row type for PostgreSQL column introspection from information_schema.columns. */\r\ntype ColumnIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n data_type: string;\r\n is_nullable: string;\r\n column_default: string | null;\r\n ordinal_position: number | null;\r\n};\r\n\r\n/** Row type for PostgreSQL primary key introspection from key_column_usage and table_constraints. */\r\ntype PrimaryKeyIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n ordinal_position: number | null;\r\n constraint_name: string;\r\n};\r\n\r\n/** Row type for PostgreSQL foreign key introspection from various constraint tables. */\r\ntype ForeignKeyIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n constraint_name: string;\r\n foreign_table_schema: string;\r\n foreign_table_name: string;\r\n foreign_column_name: string;\r\n delete_rule: ReferentialAction;\r\n update_rule: ReferentialAction;\r\n};\r\n\r\n/** Represents a foreign key reference entry with optional referential actions. */\r\ntype ForeignKeyEntry = {\r\n table: string;\r\n column: string;\r\n onDelete?: ReferentialAction;\r\n onUpdate?: ReferentialAction;\r\n};\r\n\r\ntype ColumnCommentRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n description: string | null;\n};\n\ntype TableCommentRow = {\n table_schema: string;\n table_name: string;\n description: string | null;\n};\n\r\n/** Row type for PostgreSQL index query results from pg_catalog tables. */\r\ntype IndexQueryRow = {\r\n table_schema: string;\r\n table_name: string;\r\n index_name: string;\r\n is_unique: boolean;\r\n predicate: string | null;\r\n attname: string | null;\r\n ord: number | null;\r\n};\r\n\r\n/** Grouped index information used for aggregating index columns. */\r\ntype IndexGroup = {\r\n table_schema: string;\r\n table_name: string;\r\n index_name: string;\r\n is_unique: boolean;\r\n predicate: string | null;\r\n cols: { ord: number; att: string | null }[];\r\n};\r\n\r\n/** PostgreSQL schema introspector. */\r\nexport const postgresIntrospector: SchemaIntrospector = {\r\n /**\r\n * Introspects the PostgreSQL database schema by querying information_schema and pg_catalog.\r\n * Builds tables with columns, primary keys, foreign keys, and indexes.\r\n * @param ctx - The introspection context with database executor.\r\n * @param options - Options for schema selection and table filtering.\r\n * @returns A promise resolving to the complete database schema.\r\n */\r\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema || 'public';\r\n const tables: DatabaseTable[] = [];\r\n\r\n // Columns query\r\n const qbColumns = new SelectQueryBuilder(PgInformationSchemaColumns)\r\n .select({\r\n table_schema: PgInformationSchemaColumns.columns.table_schema,\r\n table_name: PgInformationSchemaColumns.columns.table_name,\r\n column_name: PgInformationSchemaColumns.columns.column_name,\r\n data_type: PgInformationSchemaColumns.columns.data_type,\r\n is_nullable: PgInformationSchemaColumns.columns.is_nullable,\r\n column_default: PgInformationSchemaColumns.columns.column_default,\r\n ordinal_position: PgInformationSchemaColumns.columns.ordinal_position\r\n })\r\n .where(eq(PgInformationSchemaColumns.columns.table_schema, schema))\r\n .orderBy(PgInformationSchemaColumns.columns.table_name)\r\n .orderBy(PgInformationSchemaColumns.columns.ordinal_position);\r\n\r\n const columnRows = await runSelect<ColumnIntrospectRow>(qbColumns, ctx);\r\n const columnCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n ns.nspname AS table_schema,\n cls.relname AS table_name,\n att.attname AS column_name,\n pg_catalog.col_description(cls.oid, att.attnum) AS description\n FROM pg_catalog.pg_attribute att\n JOIN pg_catalog.pg_class cls ON cls.oid = att.attrelid\n JOIN pg_catalog.pg_namespace ns ON ns.oid = cls.relnamespace\n WHERE ns.nspname = $1\n AND att.attnum > 0\n AND NOT att.attisdropped\n `,\n [schema]\n )) as ColumnCommentRow[];\n const columnComments = new Map<string, string>();\n columnCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.description) return;\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const trimmed = r.description.trim();\n if (!trimmed) return;\n columnComments.set(key, trimmed);\n });\n const tableCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n ns.nspname AS table_schema,\n cls.relname AS table_name,\n pg_catalog.obj_description(cls.oid) AS description\n FROM pg_catalog.pg_class cls\n JOIN pg_catalog.pg_namespace ns ON ns.oid = cls.relnamespace\n WHERE ns.nspname = $1\n AND cls.relkind IN ('r', 'p')\n `,\n [schema]\n )) as TableCommentRow[];\n const tableComments = new Map<string, string>();\n tableCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.description) return;\n const key = `${r.table_schema}.${r.table_name}`;\n const trimmed = r.description.trim();\n if (!trimmed) return;\n tableComments.set(key, trimmed);\n });\n\r\n // Primary key columns query\r\n const qbPk = new SelectQueryBuilder(PgKeyColumnUsage)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n ordinal_position: PgKeyColumnUsage.columns.ordinal_position,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name\r\n })\r\n .innerJoin(PgTableConstraints, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'PRIMARY KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema))\r\n .orderBy(PgKeyColumnUsage.columns.table_name)\r\n .orderBy(PgKeyColumnUsage.columns.ordinal_position);\r\n\r\n const pkRows = await runSelect<PrimaryKeyIntrospectRow>(qbPk, ctx);\r\n\r\n // Build primary key map (grouped by table, ordered by ordinal_position)\r\n const pkMap = new Map<string, string[]>();\r\n const pkGrouped = new Map<string, { pos: number; col: string }[]>();\r\n for (const r of pkRows) {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const arr = pkGrouped.get(key) ?? [];\r\n arr.push({ pos: r.ordinal_position ?? 0, col: r.column_name });\r\n pkGrouped.set(key, arr);\r\n }\r\n for (const [k, vals] of pkGrouped.entries()) {\r\n vals.sort((a, b) => (a.pos || 0) - (b.pos || 0));\r\n pkMap.set(k, vals.map(v => v.col));\r\n }\r\n\r\n // Foreign key columns query\r\n const qbFk = new SelectQueryBuilder(PgKeyColumnUsage)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name,\r\n foreign_table_schema: PgConstraintColumnUsage.columns.table_schema,\r\n foreign_table_name: PgConstraintColumnUsage.columns.table_name,\r\n foreign_column_name: PgConstraintColumnUsage.columns.column_name,\r\n delete_rule: PgReferentialConstraints.columns.delete_rule,\r\n update_rule: PgReferentialConstraints.columns.update_rule\r\n })\r\n .innerJoin(PgTableConstraints, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .innerJoin(PgConstraintColumnUsage, eq(PgConstraintColumnUsage.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .innerJoin(PgReferentialConstraints, eq(PgReferentialConstraints.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'FOREIGN KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema));\r\n\r\n const fkRows = await runSelect<ForeignKeyIntrospectRow>(qbFk, ctx);\r\n\r\n // Build foreign key map\r\n const fkMap = new Map<string, ForeignKeyEntry[]>();\r\n for (const r of fkRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const existing = fkMap.get(key) ?? [];\r\n existing.push({\r\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\r\n column: r.foreign_column_name,\r\n onDelete: r.delete_rule,\r\n onUpdate: r.update_rule\r\n });\r\n fkMap.set(key, existing);\r\n }\r\n\r\n // Index columns query using AST with FunctionTable for unnest\r\n const indexQuery: SelectQueryNode = {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: 'pg_index', schema: 'pg_catalog', alias: 'i' } as TableNode,\r\n columns: [\r\n { type: 'Column', table: 'ns', name: 'nspname', alias: 'table_schema' } as ColumnNode,\r\n { type: 'Column', table: 'tbl', name: 'relname', alias: 'table_name' } as ColumnNode,\r\n { type: 'Column', table: 'idx', name: 'relname', alias: 'index_name' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indisunique', alias: 'is_unique' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indpred', alias: 'predicate' } as ColumnNode,\r\n { type: 'Column', table: 'att', name: 'attname', alias: 'attname' } as ColumnNode,\r\n { type: 'Column', table: 'arr', name: 'idx', alias: 'ord' } as ColumnNode\r\n ],\r\n joins: [\r\n // JOIN pg_class AS tbl ON tbl.oid = i.indrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'tbl' } as TableNode,\r\n condition: eq({ table: 'tbl', name: 'oid' }, { table: 'i', name: 'indrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_namespace AS ns ON ns.oid = tbl.relnamespace\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_namespace', schema: 'pg_catalog', alias: 'ns' } as TableNode,\r\n condition: eq({ table: 'ns', name: 'oid' }, { table: 'tbl', name: 'relnamespace' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_class AS idx ON idx.oid = i.indexrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'idx' } as TableNode,\r\n condition: eq({ table: 'idx', name: 'oid' }, { table: 'i', name: 'indexrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // LATERAL JOIN UNNEST(i.indkey) WITH ORDINALITY AS arr(attnum, idx)\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: fnTable('unnest', [{ type: 'Column', table: 'i', name: 'indkey' } as ColumnNode], 'arr', {\r\n lateral: true,\r\n withOrdinality: true,\r\n columnAliases: ['attnum', 'idx']\r\n }),\r\n condition: { type: 'BinaryExpression', left: { type: 'Literal', value: 1 }, operator: '=', right: { type: 'Literal', value: 1 } } as unknown as ExpressionNode\r\n } as JoinNode,\r\n // LEFT JOIN pg_attribute AS att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\r\n {\r\n type: 'Join',\r\n kind: 'LEFT',\r\n table: { type: 'Table', name: 'pg_attribute', schema: 'pg_catalog', alias: 'att' } as TableNode,\r\n condition: and(\r\n eq({ table: 'att', name: 'attrelid' }, { table: 'tbl', name: 'oid' }),\r\n eq({ table: 'att', name: 'attnum' }, { table: 'arr', name: 'attnum' })\r\n ) as ExpressionNode\r\n } as JoinNode\r\n ],\r\n where: and(\r\n eq({ table: 'ns', name: 'nspname' }, schema) as ExpressionNode,\r\n eq({ table: 'i', name: 'indisprimary' }, false) as ExpressionNode\r\n ) as ExpressionNode\r\n };\r\n\r\n const indexQueryRows = await runSelectNode<IndexQueryRow>(indexQuery, ctx);\r\n\r\n // Aggregate index rows by table/index to build final index list\r\n const indexGrouped = new Map<string, IndexGroup>();\r\n for (const r of indexQueryRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const entry = indexGrouped.get(key) ?? {\r\n table_schema: r.table_schema,\r\n table_name: r.table_name,\r\n index_name: r.index_name,\r\n is_unique: r.is_unique,\r\n predicate: r.predicate,\r\n cols: []\r\n };\r\n entry.cols.push({ ord: r.ord ?? 0, att: r.attname ?? null });\r\n indexGrouped.set(key, entry);\r\n }\r\n\r\n const indexRows = Array.from(indexGrouped.values()).map(v => ({\r\n table_schema: v.table_schema,\r\n table_name: v.table_name,\r\n index_name: v.index_name,\r\n is_unique: v.is_unique,\r\n predicate: v.predicate,\r\n column_names: v.cols.sort((a, b) => (a.ord || 0) - (b.ord || 0)).map(c => c.att).filter(Boolean)\r\n }));\r\n\r\n // Build final schema\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) {\r\n return;\r\n }\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key)\n });\n }\r\n const cols = tablesByKey.get(key)!;\r\n const commentKey = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const columnComment = columnComments.get(commentKey);\r\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n comment: columnComment ?? undefined,\r\n references: fk\r\n ? {\r\n table: fk.table,\r\n column: fk.column,\r\n onDelete: fk.onDelete,\r\n onUpdate: fk.onUpdate\r\n }\r\n : undefined\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\r\n unique: !!r.is_unique,\r\n where: r.predicate || undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n tables.push(...tablesByKey.values());\r\n return { tables };\r\n }\r\n};\r\n","import { defineTable } from '../../../../schema/table.js';\nimport { col } from '../../../../schema/column-types.js';\n\nconst INFORMATION_SCHEMA = 'information_schema';\n\n/** Table definition for `information_schema.tables`. */\nexport const InformationSchemaTables = defineTable(\n 'tables',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n table_comment: col.varchar(1024)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.columns`. */\nexport const InformationSchemaColumns = defineTable(\n 'columns',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n column_name: col.varchar(255),\n column_type: col.varchar(255),\n data_type: col.varchar(255),\n is_nullable: col.varchar(3),\n column_default: col.varchar(1024),\n extra: col.varchar(255),\n column_comment: col.varchar(1024),\n ordinal_position: col.int()\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.key_column_usage`. */\nexport const InformationSchemaKeyColumnUsage = defineTable(\n 'key_column_usage',\n {\n constraint_schema: col.varchar(255),\n constraint_name: col.varchar(255),\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n column_name: col.varchar(255),\n ordinal_position: col.int(),\n referenced_table_schema: col.varchar(255),\n referenced_table_name: col.varchar(255),\n referenced_column_name: col.varchar(255)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.referential_constraints`. */\nexport const InformationSchemaReferentialConstraints = defineTable(\n 'referential_constraints',\n {\n constraint_schema: col.varchar(255),\n constraint_name: col.varchar(255),\n delete_rule: col.varchar(255),\n update_rule: col.varchar(255)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.statistics`. */\nexport const InformationSchemaStatistics = defineTable(\n 'statistics',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n index_name: col.varchar(255),\n non_unique: col.int(),\n column_name: col.varchar(255),\n seq_in_index: col.int()\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\nexport default {\n InformationSchemaTables,\n InformationSchemaColumns,\n InformationSchemaKeyColumnUsage,\n InformationSchemaReferentialConstraints,\n InformationSchemaStatistics\n};\n","import type { ReferentialAction } from '../../../schema/column-types.js';\nimport { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode, ExpressionNode, FunctionNode } from '../../ast/expression-nodes.js';\nimport type { JoinNode } from '../../ast/join.js';\nimport { eq, neq, and, isNotNull } from '../../ast/expression-builders.js';\nimport { groupConcat } from '../../ast/aggregate-functions.js';\nimport type { TableDef } from '../../../schema/table.js';\nimport {\n InformationSchemaTables,\n InformationSchemaColumns,\n InformationSchemaKeyColumnUsage,\n InformationSchemaReferentialConstraints,\n InformationSchemaStatistics\n} from './catalogs/mysql.js';\n\ntype MysqlColumnRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n column_type: string;\n data_type: string;\n is_nullable: string;\n column_default: string | null;\n extra: string | null;\n column_comment: string;\n};\n\ntype MysqlPrimaryKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n};\n\ntype MysqlTableRow = {\n table_schema: string;\n table_name: string;\n table_comment: string;\n};\n\ntype MysqlIndexRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n non_unique: number;\n cols: string | null;\n};\n\ntype MysqlForeignKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n constraint_name: string;\n referenced_table_schema: string;\n referenced_table_name: string;\n referenced_column_name: string;\n delete_rule: string;\n update_rule: string;\n};\n\ntype MysqlForeignKeyEntry = {\n table: string;\n column: string;\n onDelete?: string;\n onUpdate?: string;\n name?: string;\n};\n\nconst tableNode = (table: TableDef, alias: string): TableNode => ({\n type: 'Table',\n name: table.name,\n schema: table.schema,\n alias\n});\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst combineConditions = (...expressions: (ExpressionNode | undefined)[]): ExpressionNode | undefined => {\n const filtered = expressions.filter(Boolean) as ExpressionNode[];\n if (!filtered.length) return undefined;\n if (filtered.length === 1) return filtered[0];\n return and(...filtered);\n};\n\nconst databaseFunction: FunctionNode = {\n type: 'Function',\n name: 'DATABASE',\n fn: 'DATABASE',\n args: []\n};\n\n/**\n * Schema introspector for MySQL.\n * Queries information_schema tables to extract schema metadata.\n */\nexport const mysqlIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n\n const buildSchemaCondition = (alias: string): ExpressionNode =>\n schema\n ? eq(columnNode(alias, 'table_schema'), schema)\n : eq(columnNode(alias, 'table_schema'), databaseFunction);\n\n const tablesQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaTables, 't'),\n columns: [\n columnNode('t', 'table_schema'),\n columnNode('t', 'table_name'),\n columnNode('t', 'table_comment')\n ],\n joins: [],\n where: buildSchemaCondition('t')\n };\n\n const columnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaColumns, 'c'),\n columns: [\n columnNode('c', 'table_schema'),\n columnNode('c', 'table_name'),\n columnNode('c', 'column_name'),\n columnNode('c', 'column_type'),\n columnNode('c', 'data_type'),\n columnNode('c', 'is_nullable'),\n columnNode('c', 'column_default'),\n columnNode('c', 'extra'),\n columnNode('c', 'column_comment')\n ],\n joins: [],\n where: buildSchemaCondition('c'),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('c', 'table_name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('c', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const pkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaKeyColumnUsage, 'kcu'),\n columns: [\n columnNode('kcu', 'table_schema'),\n columnNode('kcu', 'table_name'),\n columnNode('kcu', 'column_name')\n ],\n joins: [],\n where: combineConditions(\n eq(columnNode('kcu', 'constraint_name'), 'PRIMARY'),\n buildSchemaCondition('kcu')\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const fkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaKeyColumnUsage, 'kcu'),\n columns: [\n columnNode('kcu', 'table_schema'),\n columnNode('kcu', 'table_name'),\n columnNode('kcu', 'column_name'),\n columnNode('kcu', 'constraint_name'),\n columnNode('kcu', 'referenced_table_schema'),\n columnNode('kcu', 'referenced_table_name'),\n columnNode('kcu', 'referenced_column_name'),\n columnNode('rc', 'delete_rule'),\n columnNode('rc', 'update_rule')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(InformationSchemaReferentialConstraints, 'rc'),\n condition: and(\n eq({ table: 'rc', name: 'constraint_schema' }, { table: 'kcu', name: 'constraint_schema' }),\n eq({ table: 'rc', name: 'constraint_name' }, { table: 'kcu', name: 'constraint_name' })\n )\n } as JoinNode\n ],\n where: combineConditions(\n isNotNull(columnNode('kcu', 'referenced_table_name')),\n buildSchemaCondition('kcu')\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'table_name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const indexQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaStatistics, 'stats'),\n columns: [\n columnNode('stats', 'table_schema'),\n columnNode('stats', 'table_name'),\n columnNode('stats', 'index_name'),\n columnNode('stats', 'non_unique'),\n {\n ...groupConcat(columnNode('stats', 'column_name'), {\n orderBy: [{ column: columnNode('stats', 'seq_in_index') }]\n }),\n alias: 'cols'\n }\n ],\n joins: [],\n where: combineConditions(\n neq(columnNode('stats', 'index_name'), 'PRIMARY'),\n buildSchemaCondition('stats')\n ),\n groupBy: [\n columnNode('stats', 'table_schema'),\n columnNode('stats', 'table_name'),\n columnNode('stats', 'index_name'),\n columnNode('stats', 'non_unique')\n ]\n };\n\n const tableRows = (await runSelectNode<MysqlTableRow>(tablesQuery, ctx)) as MysqlTableRow[];\n const columnRows = (await runSelectNode<MysqlColumnRow>(columnsQuery, ctx)) as MysqlColumnRow[];\n const pkRows = (await runSelectNode<MysqlPrimaryKeyRow>(pkQuery, ctx)) as MysqlPrimaryKeyRow[];\n const fkRows = (await runSelectNode<MysqlForeignKeyRow>(fkQuery, ctx)) as MysqlForeignKeyRow[];\n const indexRows = (await runSelectNode<MysqlIndexRow>(indexQuery, ctx)) as MysqlIndexRow[];\n\n const tableComments = new Map<string, string>();\n tableRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n if (r.table_comment) {\n tableComments.set(key, r.table_comment);\n }\n });\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const list = pkMap.get(key) || [];\n list.push(r.column_name);\n pkMap.set(key, list);\n });\n\n const fkMap = new Map<string, MysqlForeignKeyEntry[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const list = fkMap.get(key) || [];\n list.push({\n table: `${r.referenced_table_schema}.${r.referenced_table_name}`,\n column: r.referenced_column_name,\n onDelete: r.delete_rule,\n onUpdate: r.update_rule,\n name: r.constraint_name\n });\n fkMap.set(key, list);\n });\n\n const tablesByKey = new Map<string, DatabaseTable>();\n\n columnRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!tablesByKey.has(key)) {\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key) || undefined\n });\n }\n const table = tablesByKey.get(key)!;\n const columnType = r.column_type || r.data_type;\n const comment = r.column_comment?.trim() ? r.column_comment : undefined;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: columnType,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment'),\n comment\n };\n const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];\n if (fk) {\n column.references = {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete as ReferentialAction | undefined,\n onUpdate: fk.onUpdate as ReferentialAction | undefined,\n name: fk.name\n };\n }\n table.columns.push(column);\n });\n\n indexRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const table = tablesByKey.get(key);\n if (!table) return;\n const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map(c => ({ column: c.trim() }));\n const idx: DatabaseIndex = {\n name: r.index_name,\n columns: cols,\n unique: r.non_unique === 0\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable, queryRows } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode } from '../../ast/expression-nodes.js';\nimport { eq, notLike, and, valueToOperand } from '../../ast/expression-builders.js';\nimport { fnTable } from '../../ast/builders.js';\nimport type { ReferentialAction } from '../../../schema/column-types.js';\n\ntype SqliteTableRow = {\n name: string;\n};\n\ntype SqliteTableInfoRow = {\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n};\n\ntype SqliteForeignKeyRow = {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string | null;\n on_delete: string | null;\n};\n\ntype SqliteIndexListRow = {\n seq: number;\n name: string;\n unique: number;\n};\n\ntype SqliteIndexInfoRow = {\n seqno: number;\n cid: number;\n name: string;\n};\n\nconst toReferentialAction = (value: string | null | undefined): ReferentialAction | undefined => {\n if (!value) return undefined;\n const normalized = value.toUpperCase();\n if (\n normalized === 'NO ACTION' ||\n normalized === 'RESTRICT' ||\n normalized === 'CASCADE' ||\n normalized === 'SET NULL' ||\n normalized === 'SET DEFAULT'\n ) {\n return normalized as ReferentialAction;\n }\n return undefined;\n};\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst buildPragmaQuery = (\n name: string,\n table: string,\n alias: string,\n columnAliases: string[]\n): SelectQueryNode => ({\n type: 'SelectQuery',\n from: fnTable(name, [valueToOperand(table)], alias, { columnAliases }),\n columns: columnAliases.map(column => columnNode(alias, column)),\n joins: []\n});\n\nconst runPragma = async <T>(\n name: string,\n table: string,\n alias: string,\n columnAliases: string[],\n ctx: IntrospectContext\n): Promise<T[]> => {\n const query = buildPragmaQuery(name, table, alias, columnAliases);\n return (await runSelectNode<T>(query, ctx)) as T[];\n};\n\nconst loadSqliteSchemaComments = async (ctx: IntrospectContext) => {\n const tableComments = new Map<string, string>();\n const columnComments = new Map<string, string>();\n const tableExists = await queryRows(\n ctx.executor,\n `SELECT name FROM sqlite_master WHERE type='table' AND name='schema_comments' LIMIT 1`\n );\n if (!tableExists.length) {\n return { tableComments, columnComments };\n }\n\n const commentRows = await queryRows(\n ctx.executor,\n `SELECT object_type, schema_name, table_name, column_name, comment FROM schema_comments`\n );\n for (const row of commentRows) {\n const objectType = typeof row.object_type === 'string' ? row.object_type.toLowerCase() : '';\n const tableName = typeof row.table_name === 'string' ? row.table_name : '';\n if (!tableName) continue;\n const columnName = typeof row.column_name === 'string' ? row.column_name : '';\n const schemaName = typeof row.schema_name === 'string' ? row.schema_name : '';\n const rawComment = row.comment;\n if (rawComment == null) continue;\n const commentText = String(rawComment).trim();\n if (!commentText) continue;\n\n const addTableComment = () => {\n tableComments.set(tableName, commentText);\n if (schemaName) {\n tableComments.set(`${schemaName}.${tableName}`, commentText);\n }\n };\n const addColumnComment = () => {\n columnComments.set(`${tableName}.${columnName}`, commentText);\n if (schemaName) {\n columnComments.set(`${schemaName}.${tableName}.${columnName}`, commentText);\n }\n };\n\n if (objectType === 'table') {\n addTableComment();\n } else if (objectType === 'column' && columnName) {\n addColumnComment();\n }\n }\n\n return {\n tableComments,\n columnComments\n };\n};\n\n/**\n * Schema introspector for SQLite.\n * Uses PRAGMA commands and sqlite_master to extract schema metadata.\n */\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const alias = 'sqlite_master';\n const tablesQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: { type: 'Table', name: 'sqlite_master' } as TableNode,\n columns: [columnNode(alias, 'name')],\n joins: [],\n where: and(\n eq(columnNode(alias, 'type'), 'table'),\n notLike(columnNode(alias, 'name'), 'sqlite_%')\n )\n };\n\n const { tableComments, columnComments } = await loadSqliteSchemaComments(ctx);\n const tableRows = (await runSelectNode<SqliteTableRow>(tablesQuery, ctx)) as SqliteTableRow[];\n const tables: DatabaseTable[] = [];\n\n for (const row of tableRows) {\n const tableName = row.name;\n if (!shouldIncludeTable(tableName, options)) continue;\n\n const tableInfo = await runPragma<SqliteTableInfoRow>(\n 'pragma_table_info',\n tableName,\n 'ti',\n ['cid', 'name', 'type', 'notnull', 'dflt_value', 'pk'],\n ctx\n );\n\n const foreignKeys = await runPragma<SqliteForeignKeyRow>(\n 'pragma_foreign_key_list',\n tableName,\n 'fk',\n ['id', 'seq', 'table', 'from', 'to', 'on_update', 'on_delete', 'match'],\n ctx\n );\n\n const indexList = await runPragma<SqliteIndexListRow>(\n 'pragma_index_list',\n tableName,\n 'idx',\n ['seq', 'name', 'unique'],\n ctx\n );\n\n const tableEntry: DatabaseTable = {\n name: tableName,\n columns: [],\n primaryKey: [],\n indexes: [],\n comment: tableComments.get(tableName)\n };\n\n tableInfo.forEach(info => {\n const column: DatabaseColumn = {\n name: info.name,\n type: info.type,\n notNull: info.notnull === 1,\n default: info.dflt_value ?? undefined,\n autoIncrement: false\n };\n const columnComment = columnComments.get(`${tableName}.${info.name}`);\n if (columnComment) {\n column.comment = columnComment;\n }\n tableEntry.columns.push(column);\n if (info.pk && info.pk > 0) {\n tableEntry.primaryKey = tableEntry.primaryKey || [];\n tableEntry.primaryKey.push(info.name);\n }\n });\n\n foreignKeys.forEach(fk => {\n const column = tableEntry.columns.find(col => col.name === fk.from);\n if (column) {\n column.references = {\n table: fk.table,\n column: fk.to,\n onDelete: toReferentialAction(fk.on_delete),\n onUpdate: toReferentialAction(fk.on_update)\n };\n }\n });\n\n for (const idx of indexList) {\n if (!idx.name) continue;\n const indexColumns = await runPragma<SqliteIndexInfoRow>(\n 'pragma_index_info',\n idx.name,\n 'info',\n ['seqno', 'cid', 'name'],\n ctx\n );\n const idxEntry: DatabaseIndex = {\n name: idx.name,\n columns: indexColumns.map(col => ({ column: col.name })),\n unique: idx.unique === 1\n };\n tableEntry.indexes!.push(idxEntry);\n }\n\n tables.push(tableEntry);\n }\n\n return { tables };\n }\n};\n","import { defineTable } from '../../../../schema/table.js';\nimport { col } from '../../../../schema/column-types.js';\n\n/** Table definitions for SQL Server catalog views used during introspection. */\nexport const SysColumns = defineTable(\n 'columns',\n {\n object_id: col.int(),\n name: col.varchar(255),\n column_id: col.int(),\n max_length: col.int(),\n precision: col.int(),\n scale: col.int(),\n is_nullable: col.boolean(),\n is_identity: col.boolean(),\n default_object_id: col.int(),\n user_type_id: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysTables = defineTable(\n 'tables',\n {\n object_id: col.int(),\n name: col.varchar(255),\n schema_id: col.int(),\n is_ms_shipped: col.boolean()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysSchemas = defineTable(\n 'schemas',\n {\n schema_id: col.int(),\n name: col.varchar(255)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysTypes = defineTable(\n 'types',\n {\n user_type_id: col.int(),\n name: col.varchar(255)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysIndexes = defineTable(\n 'indexes',\n {\n object_id: col.int(),\n index_id: col.int(),\n name: col.varchar(255),\n is_primary_key: col.boolean(),\n is_unique: col.boolean(),\n has_filter: col.boolean(),\n filter_definition: col.varchar(1024),\n is_hypothetical: col.boolean()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysIndexColumns = defineTable(\n 'index_columns',\n {\n object_id: col.int(),\n index_id: col.int(),\n column_id: col.int(),\n key_ordinal: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysForeignKeys = defineTable(\n 'foreign_keys',\n {\n object_id: col.int(),\n name: col.varchar(255),\n delete_referential_action_desc: col.varchar(64),\n update_referential_action_desc: col.varchar(64)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysForeignKeyColumns = defineTable(\n 'foreign_key_columns',\n {\n constraint_object_id: col.int(),\n parent_object_id: col.int(),\n parent_column_id: col.int(),\n referenced_object_id: col.int(),\n referenced_column_id: col.int(),\n constraint_column_id: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport default {\n SysColumns,\n SysTables,\n SysSchemas,\n SysTypes,\n SysIndexes,\n SysIndexColumns,\n SysForeignKeys,\n SysForeignKeyColumns\n};\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Converts a string to lowercase.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LOWER SQL function.\r\n */\r\nexport const lower = (value: OperandInput): FunctionNode => fn('LOWER', [value]);\r\n\r\n/**\r\n * Converts a string to uppercase.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the UPPER SQL function.\r\n */\r\nexport const upper = (value: OperandInput): FunctionNode => fn('UPPER', [value]);\r\n\r\n/**\r\n * Returns the ASCII code of the first character of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the ASCII SQL function.\r\n */\r\nexport const ascii = (value: OperandInput): FunctionNode => fn('ASCII', [value]);\r\n\r\n/**\r\n * Returns a string from one or more ASCII codes.\r\n * @param codes - The ASCII codes.\r\n * @returns A FunctionNode representing the CHAR SQL function.\r\n */\r\nexport const char = (...codes: OperandInput[]): FunctionNode => {\r\n if (codes.length === 0) throw new Error('char() expects at least 1 argument');\r\n return fn('CHAR', codes);\r\n};\r\n\r\n/**\r\n * Returns the number of characters in a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the CHAR_LENGTH SQL function.\r\n */\r\nexport const charLength = (value: OperandInput): FunctionNode => fn('CHAR_LENGTH', [value]);\r\n\r\n/**\r\n * Returns the length of a string in bytes or characters.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LENGTH SQL function.\r\n */\r\nexport const length = (value: OperandInput): FunctionNode => fn('LENGTH', [value]);\r\n\r\n/**\r\n * Removes leading and trailing whitespace or specified characters from a string.\r\n * @param value - The string value.\r\n * @param chars - The characters to trim (optional).\r\n * @returns A FunctionNode representing the TRIM SQL function.\r\n */\r\nexport const trim = (value: OperandInput, chars?: OperandInput): FunctionNode =>\r\n chars === undefined ? fn('TRIM', [value]) : fn('TRIM', [value, chars]);\r\n\r\n/**\r\n * Removes leading whitespace from a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LTRIM SQL function.\r\n */\r\nexport const ltrim = (value: OperandInput): FunctionNode => fn('LTRIM', [value]);\r\n\r\n/**\r\n * Removes trailing whitespace from a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the RTRIM SQL function.\r\n */\r\nexport const rtrim = (value: OperandInput): FunctionNode => fn('RTRIM', [value]);\r\n\r\n/**\r\n * Concatenates two or more strings.\r\n * @param args - The strings to concatenate.\r\n * @returns A FunctionNode representing the CONCAT SQL function.\r\n */\r\nexport const concat = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('concat() expects at least 2 arguments');\r\n return fn('CONCAT', args);\r\n};\r\n\r\n/**\r\n * Concatenates strings with a separator.\r\n * @param separator - The separator string.\r\n * @param args - The strings to concatenate.\r\n * @returns A FunctionNode representing the CONCAT_WS SQL function.\r\n */\r\nexport const concatWs = (separator: OperandInput, ...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 1) throw new Error('concatWs() expects at least 2 arguments including the separator');\r\n return fn('CONCAT_WS', [separator, ...args]);\r\n};\r\n\r\n/**\r\n * Extracts a substring from a string.\r\n * @param value - The string value.\r\n * @param start - The starting position.\r\n * @param length - The length of the substring (optional).\r\n * @returns A FunctionNode representing the SUBSTR SQL function.\r\n */\r\nexport const substr = (value: OperandInput, start: OperandInput, length?: OperandInput): FunctionNode =>\r\n length === undefined ? fn('SUBSTR', [value, start]) : fn('SUBSTR', [value, start, length]);\r\n\r\n/**\r\n * Returns the leftmost characters of a string.\r\n * @param value - The string value.\r\n * @param len - The number of characters to return.\r\n * @returns A FunctionNode representing the LEFT SQL function.\r\n */\r\nexport const left = (value: OperandInput, len: OperandInput): FunctionNode => fn('LEFT', [value, len]);\r\n\r\n/**\r\n * Returns the rightmost characters of a string.\r\n * @param value - The string value.\r\n * @param len - The number of characters to return.\r\n * @returns A FunctionNode representing the RIGHT SQL function.\r\n */\r\nexport const right = (value: OperandInput, len: OperandInput): FunctionNode => fn('RIGHT', [value, len]);\r\n\r\n/**\r\n * Returns the position of a substring in a string.\r\n * @param substring - The substring to search for.\r\n * @param value - The string to search in.\r\n * @returns A FunctionNode representing the POSITION SQL function.\r\n */\r\nexport const position = (substring: OperandInput, value: OperandInput): FunctionNode => fn('POSITION', [substring, value]);\r\n\r\n/**\r\n * Returns the position of a substring in a string.\r\n * @param value - The string to search in.\r\n * @param substring - The substring to search for.\r\n * @returns A FunctionNode representing the INSTR SQL function.\r\n */\r\nexport const instr = (value: OperandInput, substring: OperandInput): FunctionNode => fn('INSTR', [value, substring]);\r\n\r\n/**\r\n * Returns the position of a substring in a string, optionally starting from a position.\r\n * @param substring - The substring to search for.\r\n * @param value - The string to search in.\r\n * @param start - The starting position (optional).\r\n * @returns A FunctionNode representing the LOCATE SQL function.\r\n */\r\nexport const locate = (substring: OperandInput, value: OperandInput, start?: OperandInput): FunctionNode =>\r\n start === undefined ? fn('LOCATE', [substring, value]) : fn('LOCATE', [substring, value, start]);\r\n\r\n/**\r\n * Replaces occurrences of a substring in a string.\r\n * @param value - The string to search in.\r\n * @param search - The substring to replace.\r\n * @param replacement - The replacement string.\r\n * @returns A FunctionNode representing the REPLACE SQL function.\r\n */\r\nexport const replace = (value: OperandInput, search: OperandInput, replacement: OperandInput): FunctionNode =>\r\n fn('REPLACE', [value, search, replacement]);\r\n\r\n/**\r\n * Repeats a string a specified number of times.\r\n * @param value - The string to repeat.\r\n * @param count - The number of times to repeat.\r\n * @returns A FunctionNode representing the REPEAT SQL function.\r\n */\r\nexport const repeat = (value: OperandInput, count: OperandInput): FunctionNode => fn('REPEAT', [value, count]);\r\n\r\n/**\r\n * Left-pads a string to a certain length with another string.\r\n * @param value - The string to pad.\r\n * @param len - The length to pad to.\r\n * @param pad - The padding string.\r\n * @returns A FunctionNode representing the LPAD SQL function.\r\n */\r\nexport const lpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('LPAD', [value, len, pad]);\r\n\r\n/**\r\n * Right-pads a string to a certain length with another string.\r\n * @param value - The string to pad.\r\n * @param len - The length to pad to.\r\n * @param pad - The padding string.\r\n * @returns A FunctionNode representing the RPAD SQL function.\r\n */\r\nexport const rpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('RPAD', [value, len, pad]);\r\n\r\n/**\r\n * Returns a string consisting of a specified number of spaces.\r\n * @param count - The number of spaces.\r\n * @returns A FunctionNode representing the SPACE SQL function.\r\n */\r\nexport const space = (count: OperandInput): FunctionNode => fn('SPACE', [count]);\r\n\r\n/**\r\n * Reverses a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the REVERSE SQL function.\r\n */\r\nexport const reverse = (value: OperandInput): FunctionNode => fn('REVERSE', [value]);\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the INITCAP SQL function.\r\n */\r\nexport const initcap = (value: OperandInput): FunctionNode => fn('INITCAP', [value]);\r\n\r\n/**\r\n * Returns the MD5 hash of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the MD5 SQL function.\r\n */\r\nexport const md5 = (value: OperandInput): FunctionNode => fn('MD5', [value]);\r\n\r\n/**\r\n * Returns the SHA-1 hash of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the SHA1 SQL function.\r\n */\r\nexport const sha1 = (value: OperandInput): FunctionNode => fn('SHA1', [value]);\r\n\r\n/**\r\n * Returns the SHA-2 hash of a string with a specified bit length.\r\n * @param value - The string value.\r\n * @param bits - The bit length (e.g., 224, 256, 384, 512).\r\n * @returns A FunctionNode representing the SHA2 SQL function.\r\n */\r\nexport const sha2 = (value: OperandInput, bits: OperandInput): FunctionNode => fn('SHA2', [value, bits]);\r\n\r\n/**\r\n * Returns the length of a string in bits.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the BIT_LENGTH SQL function.\r\n */\r\nexport const bitLength = (value: OperandInput): FunctionNode => fn('BIT_LENGTH', [value]);\r\n\r\n/**\r\n * Returns the length of a string in bytes.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the OCTET_LENGTH SQL function.\r\n */\r\nexport const octetLength = (value: OperandInput): FunctionNode => fn('OCTET_LENGTH', [value]);\r\n\r\n/**\r\n * Returns a string from an ASCII code.\r\n * @param code - The ASCII code.\r\n * @returns A FunctionNode representing the CHR/CHAR SQL function.\r\n */\r\nexport const chr = (code: OperandInput): FunctionNode => fn('CHR', [code]);\r\n\r\n","import { caseWhen, cast, div, eq, inList, valueToOperand, columnOperand, ValueOperandInput } from '../../../ast/expression-builders.js';\nimport { isOperandNode } from '../../../ast/expression-nodes.js';\nimport type { OperandNode } from '../../../ast/expression.js';\nimport type { ColumnRef } from '../../../ast/types.js';\nimport { concat, lower } from '../../../functions/text.js';\n\ntype OperandInput = OperandNode | ColumnRef | string | number | boolean | null;\n\nconst isColumnReference = (value: unknown): value is ColumnRef =>\n typeof value === 'object' &&\n value !== null &&\n !('type' in value) &&\n 'name' in value &&\n typeof (value as ColumnRef).name === 'string';\n\nconst toOperandNode = (value: OperandInput): OperandNode => {\n if (isOperandNode(value)) return value;\n if (isColumnReference(value)) return columnOperand(value);\n return valueToOperand(value as ValueOperandInput);\n};\n\nconst fn = (name: string, args: OperandInput[]): OperandNode => ({\n type: 'Function',\n name,\n fn: name,\n args: args.map(arg => toOperandNode(arg))\n});\n\nconst CHAR_TYPES = ['varchar', 'char', 'varbinary', 'binary', 'nvarchar', 'nchar'];\nconst DECIMAL_TYPES = ['decimal', 'numeric'];\n\n/**\n * Returns an expression that calls OBJECT_DEFINITION for the given object ID.\n * Used to retrieve the source text of views, procedures, etc.\n */\nexport const objectDefinition = (objectId: OperandInput): OperandNode => fn('OBJECT_DEFINITION', [objectId]);\n\n/**\n * Builds a SQL Server data type string representation from its components.\n * \n * @param typeName The base type name.\n * @param maxLength The maximum length for char/binary types.\n * @param precision The precision for decimal/numeric types.\n * @param scale The scale for decimal/numeric types.\n * @returns An expression that evaluates to the full data type string.\n */\nexport const buildMssqlDataType = (\n typeName: OperandInput,\n maxLength: OperandInput,\n precision: OperandInput,\n scale: OperandInput\n): OperandNode => {\n const typeOperand = toOperandNode(typeName);\n const maxLenOperand = toOperandNode(maxLength);\n const precisionOperand = toOperandNode(precision);\n const scaleOperand = toOperandNode(scale);\n const typeLower = lower(typeOperand);\n\n const lengthCase = caseWhen(\n [\n {\n when: eq(maxLenOperand, -1),\n then: 'max'\n },\n {\n when: inList(typeLower, ['nvarchar', 'nchar']),\n then: cast(div(maxLenOperand, 2), 'varchar(10)')\n }\n ],\n cast(maxLenOperand, 'varchar(10)')\n );\n\n const charSuffix = concat('(', lengthCase, ')');\n\n const decimalSuffix = concat(\n '(',\n cast(precisionOperand, 'varchar(10)'),\n ',',\n cast(scaleOperand, 'varchar(10)'),\n ')'\n );\n\n const suffix = caseWhen(\n [\n { when: inList(typeLower, CHAR_TYPES), then: charSuffix },\n { when: inList(typeLower, DECIMAL_TYPES), then: decimalSuffix }\n ],\n ''\n );\n\n return concat(typeLower, suffix);\n};\n\nexport default {\n objectDefinition,\n buildMssqlDataType\n};\n","import type { ReferentialAction } from '../../../schema/column-types.js';\nimport { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable, queryRows } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode, ExpressionNode, FunctionNode } from '../../ast/expression-nodes.js';\nimport type { JoinNode } from '../../ast/join.js';\nimport { eq, and } from '../../ast/expression-builders.js';\nimport type { TableDef } from '../../../schema/table.js';\nimport {\n SysColumns,\n SysTables,\n SysSchemas,\n SysTypes,\n SysIndexes,\n SysIndexColumns,\n SysForeignKeys,\n SysForeignKeyColumns\n} from './catalogs/mssql.js';\nimport { buildMssqlDataType, objectDefinition } from './functions/mssql.js';\n\ntype MssqlColumnRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: boolean | number;\n is_identity: boolean | number;\n column_default: string | null;\n};\n\ntype MssqlPrimaryKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n key_ordinal: number;\n};\n\ntype MssqlIndexRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n is_unique: boolean | number;\n has_filter: boolean | number;\n filter_definition: string | null;\n};\n\ntype MssqlIndexColumnRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n column_name: string;\n key_ordinal: number;\n};\n\ntype MssqlForeignKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n constraint_name: string;\n referenced_schema: string;\n referenced_table: string;\n referenced_column: string;\n delete_rule: string | null;\n update_rule: string | null;\n};\n\ntype MssqlTableCommentRow = {\n table_schema: string;\n table_name: string;\n comment: string | null;\n};\n\ntype MssqlColumnCommentRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n comment: string | null;\n};\n\ntype ForeignKeyEntry = {\n table: string;\n column: string;\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n name?: string;\n};\n\nconst normalizeReferentialAction = (value: string | null | undefined): ReferentialAction | undefined => {\n if (!value) return undefined;\n const normalized = value.replace(/_/g, ' ').toUpperCase();\n const allowed: ReferentialAction[] = ['NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL', 'SET DEFAULT'];\n return allowed.includes(normalized as ReferentialAction) ? (normalized as ReferentialAction) : undefined;\n};\n\nconst tableNode = (table: TableDef, alias: string): TableNode => ({\n type: 'Table',\n name: table.name,\n schema: table.schema,\n alias\n});\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst combineConditions = (...expressions: (ExpressionNode | undefined)[]): ExpressionNode | undefined => {\n const filtered = expressions.filter(Boolean) as ExpressionNode[];\n if (!filtered.length) return undefined;\n if (filtered.length === 1) return filtered[0];\n return and(...filtered);\n};\n\n/**\n * Schema introspector for Microsoft SQL Server.\n * Queryies system catalogs (sys.tables, sys.columns, etc.) to extract schema metadata.\n */\nexport const mssqlIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const schemaCondition = schema ? eq(columnNode('sch', 'name'), schema) : undefined;\n const schemaFilter = schema ? 'AND sch.name = @p1' : '';\n const schemaParams = schema ? [schema] : [];\n const tableCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n CONVERT(nvarchar(4000), ep.value) AS comment\n FROM sys.extended_properties ep\n JOIN sys.tables t ON t.object_id = ep.major_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE ep.class = 1\n AND ep.minor_id = 0\n AND ep.name = 'MS_Description'\n ${schemaFilter}\n `,\n schemaParams\n )) as MssqlTableCommentRow[];\n const columnCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n col.name AS column_name,\n CONVERT(nvarchar(4000), ep.value) AS comment\n FROM sys.extended_properties ep\n JOIN sys.columns col ON col.object_id = ep.major_id AND col.column_id = ep.minor_id\n JOIN sys.tables t ON t.object_id = col.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE ep.class = 1\n AND ep.minor_id > 0\n AND ep.name = 'MS_Description'\n ${schemaFilter}\n `,\n schemaParams\n )) as MssqlColumnCommentRow[];\n const tableComments = new Map<string, string>();\n tableCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.comment) return;\n const trimmed = r.comment.trim();\n if (!trimmed) return;\n tableComments.set(`${r.table_schema}.${r.table_name}`, trimmed);\n });\n const columnComments = new Map<string, string>();\n columnCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.comment) return;\n const trimmed = r.comment.trim();\n if (!trimmed) return;\n columnComments.set(`${r.table_schema}.${r.table_name}.${r.column_name}`, trimmed);\n });\n\n const dataTypeExpression = buildMssqlDataType(\n { table: 'ty', name: 'name' },\n { table: 'c', name: 'max_length' },\n { table: 'c', name: 'precision' },\n { table: 'c', name: 'scale' }\n ) as FunctionNode;\n\n const defaultExpression = objectDefinition({ table: 'c', name: 'default_object_id' }) as FunctionNode;\n\n const columnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysColumns, 'c'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n { ...dataTypeExpression, alias: 'data_type' },\n columnNode('c', 'is_nullable'),\n columnNode('c', 'is_identity'),\n { ...defaultExpression, alias: 'column_default' }\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'c', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTypes, 'ty'),\n condition: eq({ table: 'ty', name: 'user_type_id' }, { table: 'c', name: 'user_type_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 't', name: 'is_ms_shipped' }, 0),\n schemaCondition\n )\n };\n\n const pkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexes, 'i'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('ic', 'key_ordinal', 'key_ordinal')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysIndexColumns, 'ic'),\n condition: and(\n eq({ table: 'ic', name: 'object_id' }, { table: 'i', name: 'object_id' }),\n eq({ table: 'ic', name: 'index_id' }, { table: 'i', name: 'index_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'ic', name: 'object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'ic', name: 'column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 1),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('ic', 'key_ordinal'),\n direction: 'ASC'\n }\n ]\n };\n\n const fkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysForeignKeyColumns, 'fkc'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('fk', 'name', 'constraint_name'),\n columnNode('rsch', 'name', 'referenced_schema'),\n columnNode('rt', 'name', 'referenced_table'),\n columnNode('rc', 'name', 'referenced_column'),\n columnNode('fk', 'delete_referential_action_desc', 'delete_rule'),\n columnNode('fk', 'update_referential_action_desc', 'update_rule')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysForeignKeys, 'fk'),\n condition: eq({ table: 'fk', name: 'object_id' }, { table: 'fkc', name: 'constraint_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'fkc', name: 'parent_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'fkc', name: 'parent_object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'fkc', name: 'parent_column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 'rt'),\n condition: eq({ table: 'rt', name: 'object_id' }, { table: 'fkc', name: 'referenced_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'rsch'),\n condition: eq({ table: 'rsch', name: 'schema_id' }, { table: 'rt', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'rc'),\n condition: and(\n eq({ table: 'rc', name: 'object_id' }, { table: 'fkc', name: 'referenced_object_id' }),\n eq({ table: 'rc', name: 'column_id' }, { table: 'fkc', name: 'referenced_column_id' })\n )\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 't', name: 'is_ms_shipped' }, 0),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('fk', 'name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('fkc', 'constraint_column_id'),\n direction: 'ASC'\n }\n ]\n };\n\n const indexQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexes, 'i'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('i', 'name', 'index_name'),\n columnNode('i', 'is_unique'),\n columnNode('i', 'has_filter'),\n columnNode('i', 'filter_definition')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 0),\n eq({ table: 'i', name: 'is_hypothetical' }, 0),\n schemaCondition\n )\n };\n\n const indexColumnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexColumns, 'ic'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('i', 'name', 'index_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('ic', 'key_ordinal', 'key_ordinal')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysIndexes, 'i'),\n condition: and(\n eq({ table: 'ic', name: 'object_id' }, { table: 'i', name: 'object_id' }),\n eq({ table: 'ic', name: 'index_id' }, { table: 'i', name: 'index_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'ic', name: 'object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'ic', name: 'column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 0),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('ic', 'key_ordinal'),\n direction: 'ASC'\n }\n ]\n };\n\n const columnRows = (await runSelectNode<MssqlColumnRow>(columnsQuery, ctx)) as MssqlColumnRow[];\n const pkRows = (await runSelectNode<MssqlPrimaryKeyRow>(pkQuery, ctx)) as MssqlPrimaryKeyRow[];\n const fkRows = (await runSelectNode<MssqlForeignKeyRow>(fkQuery, ctx)) as MssqlForeignKeyRow[];\n const indexRows = (await runSelectNode<MssqlIndexRow>(indexQuery, ctx)) as MssqlIndexRow[];\n const indexColsRows = (await runSelectNode<MssqlIndexColumnRow>(indexColumnsQuery, ctx)) as MssqlIndexColumnRow[];\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const list = pkMap.get(key) || [];\n list.push(r.column_name);\n pkMap.set(key, list);\n });\n\n const fkMap = new Map<string, ForeignKeyEntry[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const list = fkMap.get(key) || [];\n list.push({\n table: `${r.referenced_schema}.${r.referenced_table}`,\n column: r.referenced_column,\n onDelete: normalizeReferentialAction(r.delete_rule),\n onUpdate: normalizeReferentialAction(r.update_rule),\n name: r.constraint_name\n });\n fkMap.set(key, list);\n });\n\n const indexColumnsMap = new Map<string, { column: string; order: number }[]>();\n indexColsRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\n const list = indexColumnsMap.get(key) || [];\n list.push({ column: r.column_name, order: r.key_ordinal });\n indexColumnsMap.set(key, list);\n });\n\n const tablesByKey = new Map<string, DatabaseTable>();\n\n columnRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n const key = `${r.table_schema}.${r.table_name}`;\n if (!tablesByKey.has(key)) {\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key)\n });\n }\n const table = tablesByKey.get(key)!;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === false || r.is_nullable === 0,\n default: r.column_default ?? undefined,\n autoIncrement: !!r.is_identity\n };\n const columnComment = columnComments.get(`${key}.${r.column_name}`);\n if (columnComment) {\n column.comment = columnComment;\n }\n const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];\n if (fk) {\n column.references = {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n name: fk.name\n };\n }\n table.columns.push(column);\n });\n\n indexRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const table = tablesByKey.get(key);\n if (!table) return;\n const cols = (indexColumnsMap.get(`${r.table_schema}.${r.table_name}.${r.index_name}`) || [])\n .sort((a, b) => a.order - b.order)\n .map(c => ({ column: c.column }));\n const idx: DatabaseIndex = {\n name: r.index_name,\n columns: cols,\n unique: !!r.is_unique,\n where: r.has_filter ? r.filter_definition ?? undefined : undefined\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import type { DialectName } from '../schema-generator.js';\r\nimport type { SchemaIntrospector } from './types.js';\r\nimport { postgresIntrospector } from './postgres.js';\r\nimport { mysqlIntrospector } from './mysql.js';\r\nimport { sqliteIntrospector } from './sqlite.js';\r\nimport { mssqlIntrospector } from './mssql.js';\r\n\r\n/** Registry mapping dialect names to their corresponding schema introspectors. */\r\nconst registry = new Map<DialectName, SchemaIntrospector>();\r\n\r\n/**\r\n * Registers the built-in schema introspectors for all supported database dialects.\r\n */\r\nconst registerBuiltInIntrospectors = () => {\r\n registry.set('postgres', postgresIntrospector);\r\n registry.set('mysql', mysqlIntrospector);\r\n registry.set('sqlite', sqliteIntrospector);\r\n registry.set('mssql', mssqlIntrospector);\r\n};\r\n\r\nregisterBuiltInIntrospectors();\r\n\r\n/**\r\n * Registers a schema introspector for a dialect.\r\n * @param dialect - The dialect name.\r\n * @param introspector - The schema introspector.\r\n */\r\nexport const registerSchemaIntrospector = (dialect: DialectName, introspector: SchemaIntrospector): void => {\r\n registry.set(dialect, introspector);\r\n};\r\n\r\n/**\r\n * Gets the schema introspector for a dialect.\r\n * @param dialect - The dialect name.\r\n * @returns The schema introspector or undefined if not found.\r\n */\r\nexport const getSchemaIntrospector = (dialect: DialectName): SchemaIntrospector | undefined => {\r\n return registry.get(dialect);\r\n};\r\n\r\n","import type { DialectName } from './schema-generator.js';\r\nimport { DatabaseSchema } from './schema-types.js';\r\nimport { DbExecutor } from '../execution/db-executor.js';\r\nimport type { IntrospectOptions, SchemaIntrospector, IntrospectContext } from './introspect/types.js';\r\nimport { getSchemaIntrospector } from './introspect/registry.js';\r\nimport { DialectFactory } from '../dialect/dialect-factory.js';\r\n\r\n/**\r\n * Introspects an existing database schema using the dialect-specific strategy.\r\n */\r\nexport const introspectSchema = async (\r\n executor: DbExecutor,\r\n dialect: DialectName,\r\n options: IntrospectOptions = {}\r\n): Promise<DatabaseSchema> => {\r\n const handler = getSchemaIntrospector(dialect);\r\n if (!handler) {\r\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\r\n }\r\n const dialectInstance = DialectFactory.create(dialect);\r\n const ctx: IntrospectContext = { executor, dialect: dialectInstance };\r\n return handler.introspect(ctx, options);\r\n};\r\n\r\nexport type { IntrospectOptions, SchemaIntrospector };\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Returns the absolute value of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ABS SQL function.\r\n */\r\nexport const abs = (value: OperandInput): FunctionNode => fn('ABS', [value]);\r\n\r\n/**\r\n * Returns the arccosine (inverse cosine) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ACOS SQL function.\r\n */\r\nexport const acos = (value: OperandInput): FunctionNode => fn('ACOS', [value]);\r\n\r\n/**\r\n * Returns the arcsine (inverse sine) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ASIN SQL function.\r\n */\r\nexport const asin = (value: OperandInput): FunctionNode => fn('ASIN', [value]);\r\n\r\n/**\r\n * Returns the arctangent (inverse tangent) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ATAN SQL function.\r\n */\r\nexport const atan = (value: OperandInput): FunctionNode => fn('ATAN', [value]);\r\n\r\n/**\r\n * Returns the arctangent of the two arguments.\r\n * @param y - The y-coordinate.\r\n * @param x - The x-coordinate.\r\n * @returns A FunctionNode representing the ATAN2 SQL function.\r\n */\r\nexport const atan2 = (y: OperandInput, x: OperandInput): FunctionNode => fn('ATAN2', [y, x]);\r\n\r\n/**\r\n * Returns the smallest integer greater than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CEIL SQL function.\r\n */\r\nexport const ceil = (value: OperandInput): FunctionNode => fn('CEIL', [value]);\r\n\r\n/**\r\n * Alias for ceil. Returns the smallest integer greater than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CEILING SQL function.\r\n */\r\nexport const ceiling = (value: OperandInput): FunctionNode => fn('CEILING', [value]);\r\n\r\n/**\r\n * Returns the cosine of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the COS SQL function.\r\n */\r\nexport const cos = (value: OperandInput): FunctionNode => fn('COS', [value]);\r\n\r\n/**\r\n * Returns the cotangent of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the COT SQL function.\r\n */\r\nexport const cot = (value: OperandInput): FunctionNode => fn('COT', [value]);\r\n\r\n/**\r\n * Converts radians to degrees.\r\n * @param value - The angle in radians.\r\n * @returns A FunctionNode representing the DEGREES SQL function.\r\n */\r\nexport const degrees = (value: OperandInput): FunctionNode => fn('DEGREES', [value]);\r\n\r\n/**\r\n * Returns e raised to the power of the argument.\r\n * @param value - The exponent.\r\n * @returns A FunctionNode representing the EXP SQL function.\r\n */\r\nexport const exp = (value: OperandInput): FunctionNode => fn('EXP', [value]);\r\n\r\n/**\r\n * Returns the largest integer less than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the FLOOR SQL function.\r\n */\r\nexport const floor = (value: OperandInput): FunctionNode => fn('FLOOR', [value]);\r\n\r\n/**\r\n * Returns the natural logarithm (base e) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LN SQL function.\r\n */\r\nexport const ln = (value: OperandInput): FunctionNode => fn('LN', [value]);\r\n\r\n/**\r\n * Returns the base-10 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG SQL function.\r\n */\r\nexport const log = (value: OperandInput): FunctionNode => fn('LOG', [value]);\r\n\r\n/**\r\n * Returns the base-10 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG10 SQL function.\r\n */\r\nexport const log10 = (value: OperandInput): FunctionNode => fn('LOG10', [value]);\r\n\r\n/**\r\n * Returns the logarithm of a number for a specific base.\r\n * @param base - The base of the logarithm.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG_BASE SQL function.\r\n */\r\nexport const logBase = (base: OperandInput, value: OperandInput): FunctionNode => fn('LOG_BASE', [base, value]);\r\n\r\n/**\r\n * Returns the remainder of dividing x by y.\r\n * @param x - The dividend.\r\n * @param y - The divisor.\r\n * @returns A FunctionNode representing the MOD SQL function.\r\n */\r\nexport const mod = (x: OperandInput, y: OperandInput): FunctionNode => fn('MOD', [x, y]);\r\n\r\n/**\r\n * Returns the value of PI (approximately 3.14159...).\r\n * @returns A FunctionNode representing the PI SQL function.\r\n */\r\nexport const pi = (): FunctionNode => fn('PI', []);\r\n\r\n/**\r\n * Returns x raised to the power of y.\r\n * @param x - The base.\r\n * @param y - The exponent.\r\n * @returns A FunctionNode representing the POWER SQL function.\r\n */\r\nexport const power = (x: OperandInput, y: OperandInput): FunctionNode => fn('POWER', [x, y]);\r\n\r\n/**\r\n * Alias for power. Returns x raised to the power of y.\r\n * @param x - The base.\r\n * @param y - The exponent.\r\n * @returns A FunctionNode representing the POW SQL function.\r\n */\r\nexport const pow = (x: OperandInput, y: OperandInput): FunctionNode => fn('POW', [x, y]);\r\n\r\n/**\r\n * Converts degrees to radians.\r\n * @param value - The angle in degrees.\r\n * @returns A FunctionNode representing the RADIANS SQL function.\r\n */\r\nexport const radians = (value: OperandInput): FunctionNode => fn('RADIANS', [value]);\r\n\r\n/**\r\n * Returns a random number between 0 and 1.\r\n * @returns A FunctionNode representing the RANDOM SQL function.\r\n */\r\nexport const random = (): FunctionNode => fn('RANDOM', []);\r\n\r\n/**\r\n * Alias for random. Returns a random number between 0 and 1.\r\n * @returns A FunctionNode representing the RAND SQL function.\r\n */\r\nexport const rand = (): FunctionNode => fn('RAND', []);\r\n\r\n/**\r\n * Rounds a number to a specified number of decimal places.\r\n * @param value - The numeric value to round.\r\n * @param decimals - The number of decimal places (optional).\r\n * @returns A FunctionNode representing the ROUND SQL function.\r\n */\r\nexport const round = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('ROUND', [value]) : fn('ROUND', [value, decimals]);\r\n\r\n/**\r\n * Returns the sign of a number (-1 for negative, 0 for zero, 1 for positive).\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the SIGN SQL function.\r\n */\r\nexport const sign = (value: OperandInput): FunctionNode => fn('SIGN', [value]);\r\n\r\n/**\r\n * Returns the sine of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the SIN SQL function.\r\n */\r\nexport const sin = (value: OperandInput): FunctionNode => fn('SIN', [value]);\r\n\r\n/**\r\n * Returns the square root of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the SQRT SQL function.\r\n */\r\nexport const sqrt = (value: OperandInput): FunctionNode => fn('SQRT', [value]);\r\n\r\n/**\r\n * Returns the tangent of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the TAN SQL function.\r\n */\r\nexport const tan = (value: OperandInput): FunctionNode => fn('TAN', [value]);\r\n\r\n/**\r\n * Truncates a number to a specified number of decimal places without rounding.\r\n * @param value - The numeric value to truncate.\r\n * @param decimals - The number of decimal places (optional).\r\n * @returns A FunctionNode representing the TRUNC SQL function.\r\n */\r\nexport const trunc = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('TRUNC', [value]) : fn('TRUNC', [value, decimals]);\r\n\r\n/**\r\n * Alias for trunc. Truncates a number to a specified number of decimal places without rounding.\r\n * @param value - The numeric value to truncate.\r\n * @param decimals - The number of decimal places.\r\n * @returns A FunctionNode representing the TRUNCATE SQL function.\r\n */\r\nexport const truncate = (value: OperandInput, decimals: OperandInput): FunctionNode =>\r\n fn('TRUNCATE', [value, decimals]);\r\n\r\n/**\r\n * Returns the base-2 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG2 SQL function.\r\n */\r\nexport const log2 = (value: OperandInput): FunctionNode => fn('LOG2', [value]);\r\n\r\n/**\r\n * Returns the cube root of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CBRT SQL function.\r\n */\r\nexport const cbrt = (value: OperandInput): FunctionNode => fn('CBRT', [value]);\r\n\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Returns the current local date and time.\r\n * @returns A FunctionNode representing the NOW() SQL function.\r\n */\r\nexport const now = (): FunctionNode => fn('NOW', []);\r\n\r\n/**\r\n * Returns the current date without time.\r\n * @returns A FunctionNode representing the CURRENT_DATE SQL function.\r\n */\r\nexport const currentDate = (): FunctionNode => fn('CURRENT_DATE', []);\r\n\r\n/**\r\n * Returns the current time without date.\r\n * @returns A FunctionNode representing the CURRENT_TIME SQL function.\r\n */\r\nexport const currentTime = (): FunctionNode => fn('CURRENT_TIME', []);\r\n\r\n/**\r\n * Returns the current UTC date and time.\r\n * @returns A FunctionNode representing the UTC_NOW() SQL function.\r\n */\r\nexport const utcNow = (): FunctionNode => fn('UTC_NOW', []);\r\n\r\n/**\r\n * Returns the current local time.\r\n * @returns A FunctionNode representing the LOCALTIME SQL function.\r\n */\r\nexport const localTime = (): FunctionNode => fn('LOCALTIME', []);\r\n\r\n/**\r\n * Returns the current local timestamp.\r\n * @returns A FunctionNode representing the LOCALTIMESTAMP SQL function.\r\n */\r\nexport const localTimestamp = (): FunctionNode => fn('LOCALTIMESTAMP', []);\r\n\r\n/**\r\n * Extracts a specified part from a date or datetime value.\r\n * @param part - The date part to extract (e.g., 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND').\r\n * @param date - The date or datetime value to extract from.\r\n * @returns A FunctionNode representing the EXTRACT SQL function.\r\n */\r\nexport const extract = (part: OperandInput, date: OperandInput): FunctionNode => fn('EXTRACT', [part, date]);\r\n\r\n/**\r\n * Extracts the year from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the YEAR SQL function.\r\n */\r\nexport const year = (date: OperandInput): FunctionNode => fn('YEAR', [date]);\r\n\r\n/**\r\n * Extracts the month from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the MONTH SQL function.\r\n */\r\nexport const month = (date: OperandInput): FunctionNode => fn('MONTH', [date]);\r\n\r\n/**\r\n * Extracts the day of the month from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the DAY SQL function.\r\n */\r\nexport const day = (date: OperandInput): FunctionNode => fn('DAY', [date]);\r\n\r\n/**\r\n * Adds a specified time interval to a date or datetime value.\r\n * @param date - The date or datetime value to add to.\r\n * @param interval - The number of units to add.\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND').\r\n * @returns A FunctionNode representing the DATE_ADD SQL function.\r\n */\r\nexport const dateAdd = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_ADD', [date, interval, unit]);\r\n\r\n/**\r\n * Subtracts a specified time interval from a date or datetime value.\r\n * @param date - The date or datetime value to subtract from.\r\n * @param interval - The number of units to subtract.\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND').\r\n * @returns A FunctionNode representing the DATE_SUB SQL function.\r\n */\r\nexport const dateSub = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_SUB', [date, interval, unit]);\r\n\r\n/**\r\n * Returns the difference between two dates in days.\r\n * @param date1 - The end date.\r\n * @param date2 - The start date.\r\n * @returns A FunctionNode representing the DATE_DIFF SQL function.\r\n */\r\nexport const dateDiff = (date1: OperandInput, date2: OperandInput): FunctionNode => fn('DATE_DIFF', [date1, date2]);\r\n\r\n/**\r\n * Converts a date or datetime value to a formatted string.\r\n * @param date - The date or datetime value to format.\r\n * @param format - The format string (dialect-specific).\r\n * @returns A FunctionNode representing the DATE_FORMAT SQL function.\r\n */\r\nexport const dateFormat = (date: OperandInput, format: OperandInput): FunctionNode => fn('DATE_FORMAT', [date, format]);\r\n\r\n/**\r\n * Returns the current Unix timestamp (seconds since 1970-01-01 00:00:00 UTC).\r\n * @returns A FunctionNode representing the UNIX_TIMESTAMP SQL function.\r\n */\r\nexport const unixTimestamp = (): FunctionNode => fn('UNIX_TIMESTAMP', []);\r\n\r\n/**\r\n * Converts a Unix timestamp (seconds since 1970-01-01 00:00:00 UTC) to a date.\r\n * @param timestamp - Unix timestamp in seconds.\r\n * @returns A FunctionNode representing the FROM_UNIXTIME SQL function.\r\n */\r\nexport const fromUnixTime = (timestamp: OperandInput): FunctionNode => fn('FROM_UNIXTIME', [timestamp]);\r\n\r\n/**\r\n * Returns the last day of the month for a given date.\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the END_OF_MONTH SQL function.\r\n */\r\nexport const endOfMonth = (date: OperandInput): FunctionNode => fn('END_OF_MONTH', [date]);\r\n\r\n/**\r\n * Returns the index of the weekday for a given date (1 = Sunday, 2 = Monday, etc.).\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the DAY_OF_WEEK SQL function.\r\n */\r\nexport const dayOfWeek = (date: OperandInput): FunctionNode => fn('DAY_OF_WEEK', [date]);\r\n\r\n/**\r\n * Returns the week number of the year for a given date.\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the WEEK_OF_YEAR SQL function.\r\n */\r\nexport const weekOfYear = (date: OperandInput): FunctionNode => fn('WEEK_OF_YEAR', [date]);\r\n\r\n/**\r\n * Truncates a date or datetime value to a specified precision (e.g., first day of the month/year).\r\n * @param part - The truncation precision (e.g., 'YEAR', 'MONTH', 'DAY').\r\n * @param date - The date or datetime value to truncate.\r\n * @returns A FunctionNode representing the DATE_TRUNC SQL function.\r\n */\r\nexport const dateTrunc = (part: OperandInput, date: OperandInput): FunctionNode => fn('DATE_TRUNC', [part, date]);\r\n\r\n/**\r\n * Returns the difference between two timestamps as an interval.\r\n * @param timestamp - The end timestamp.\r\n * @param baseTimestamp - The start timestamp (optional, defaults to current time).\r\n * @returns A FunctionNode representing the AGE SQL function.\r\n */\r\nexport const age = (timestamp: OperandInput, baseTimestamp?: OperandInput): FunctionNode =>\r\n baseTimestamp === undefined ? fn('AGE', [timestamp]) : fn('AGE', [timestamp, baseTimestamp]);\r\n\r\n/**\r\n * Extracts the hour from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the HOUR SQL function.\r\n */\r\nexport const hour = (date: OperandInput): FunctionNode => fn('HOUR', [date]);\r\n\r\n/**\r\n * Extracts the minute from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the MINUTE SQL function.\r\n */\r\nexport const minute = (date: OperandInput): FunctionNode => fn('MINUTE', [date]);\r\n\r\n/**\r\n * Extracts the second from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the SECOND SQL function.\r\n */\r\nexport const second = (date: OperandInput): FunctionNode => fn('SECOND', [date]);\r\n\r\n/**\r\n * Extracts the quarter from a date or datetime value (1-4).\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the QUARTER SQL function.\r\n */\r\nexport const quarter = (date: OperandInput): FunctionNode => fn('QUARTER', [date]);\r\n\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Returns the first non-null value in a list.\r\n * @param args - The list of values to check.\r\n * @returns A FunctionNode representing the COALESCE SQL function.\r\n */\r\nexport const coalesce = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('coalesce() expects at least 2 arguments');\r\n return fn('COALESCE', args);\r\n};\r\n\r\n/**\r\n * Returns null if the two arguments are equal, otherwise returns the first argument.\r\n * @param val1 - The first value.\r\n * @param val2 - The second value.\r\n * @returns A FunctionNode representing the NULLIF SQL function.\r\n */\r\nexport const nullif = (val1: OperandInput, val2: OperandInput): FunctionNode => fn('NULLIF', [val1, val2]);\r\n\r\n/**\r\n * Returns the largest value in a list.\r\n * @param args - The list of values to compare.\r\n * @returns A FunctionNode representing the GREATEST SQL function.\r\n */\r\nexport const greatest = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('greatest() expects at least 2 arguments');\r\n return fn('GREATEST', args);\r\n};\r\n\r\n/**\r\n * Returns the smallest value in a list.\r\n * @param args - The list of values to compare.\r\n * @returns A FunctionNode representing the LEAST SQL function.\r\n */\r\nexport const least = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('least() expects at least 2 arguments');\r\n return fn('LEAST', args);\r\n};\r\n\r\n/**\r\n * Returns the first argument if it is not null, otherwise returns the second argument.\r\n * @param val - The value to check.\r\n * @param defaultValue - The default value to return if val is null.\r\n * @returns A FunctionNode representing the COALESCE SQL function.\r\n */\r\nexport const ifNull = (val: OperandInput, defaultValue: OperandInput): FunctionNode => coalesce(val, defaultValue);\r\n","// Pure AST Builders - No Dialect Logic Here!\n\nimport { ColumnDef } from '../../schema/column-types.js';\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\n\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\n\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\n\nconst toOperand = (input: OperandInput): OperandNode => {\n if (isOperandNode(input)) return input;\n if (isColumnDef(input)) return columnOperand(input);\n\n return valueToOperand(input);\n};\n\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\n type: 'Function',\n name: key,\n fn: key,\n args: args.map(toOperand)\n});\n\nexport const jsonLength = (target: OperandInput, path?: OperandInput): FunctionNode =>\n path === undefined ? fn('JSON_LENGTH', [target]) : fn('JSON_LENGTH', [target, path]);\n\nexport const jsonSet = (target: OperandInput, path: OperandInput, value: OperandInput): FunctionNode =>\n fn('JSON_SET', [target, path, value]);\n\nexport const jsonArrayAgg = (value: OperandInput): FunctionNode => fn('JSON_ARRAYAGG', [value]);\n\nexport const jsonContains = (\n target: OperandInput,\n candidate: OperandInput,\n path?: OperandInput\n): FunctionNode =>\n path === undefined ? fn('JSON_CONTAINS', [target, candidate]) : fn('JSON_CONTAINS', [target, candidate, path]);\r\n","// Pure AST Builders - No Dialect Logic Here!\n\nimport { ColumnDef } from '../../schema/column-types.js';\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\n\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\n\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\n\nconst toOperand = (input: OperandInput): OperandNode => {\n if (isOperandNode(input)) return input;\n if (isColumnDef(input)) return columnOperand(input);\n\n return valueToOperand(input);\n};\n\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\n type: 'Function',\n name: key,\n fn: key,\n args: args.map(toOperand)\n});\n\nexport const arrayAppend = (array: OperandInput, value: OperandInput): FunctionNode =>\n fn('ARRAY_APPEND', [array, value]);\r\n","// In a real Node environment: import { AsyncLocalStorage } from 'node:async_hooks';\r\n\r\n/**\r\n * Browser-compatible implementation of AsyncLocalStorage.\r\n * Provides a simple in-memory store for browser environments while maintaining\r\n * Node.js AsyncLocalStorage API compatibility.\r\n * \r\n * @template T Type of the data stored in the async context\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback function within a context containing the specified store value.\r\n * The store value is only available during the callback's execution and is automatically\r\n * cleared afterward.\r\n * \r\n * @param store - The context value to make available during callback execution\r\n * @param callback - Function to execute with the store value available\r\n * @returns Result of the callback function execution\r\n * \r\n * @example\r\n * ```\r\n * const als = new AsyncLocalStorage<number>();\r\n * als.run(42, () => {\r\n * console.log(als.getStore()); // Outputs: 42\r\n * });\r\n * ```\r\n */\r\n run<R>(store: T, callback: () => R): R {\r\n this.store = store;\r\n try {\r\n return callback();\r\n } finally {\r\n this.store = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the current store value from the async context.\r\n * Returns undefined if called outside of a `run()` callback execution.\r\n * \r\n * @returns Current store value or undefined if no context exists\r\n * \r\n * @example\r\n * ```\r\n * const als = new AsyncLocalStorage<string>();\r\n * console.log(als.getStore()); // Outputs: undefined\r\n * \r\n * als.run('hello', () => {\r\n * console.log(als.getStore()); // Outputs: 'hello'\r\n * });\r\n * ```\r\n */\r\n getStore(): T | undefined {\r\n return this.store;\r\n }\r\n}\r\n","import { SQL_OPERATORS, SqlOperator } from './sql.js';\r\n\r\n/**\r\n * Configuration for how SQL operators map to TypeScript builder helpers\r\n */\r\nexport interface SqlOperatorConfig {\r\n /**\r\n * SQL operator literal\r\n */\r\n sql: SqlOperator;\r\n /**\r\n * Corresponding TypeScript helper name\r\n */\r\n tsName: string;\r\n}\r\n\r\n/**\r\n * Registry of supported SQL operators and their companion helper names\r\n */\r\nexport const SQL_OPERATOR_REGISTRY: Record<SqlOperator, SqlOperatorConfig> = {\r\n [SQL_OPERATORS.EQUALS]: { sql: SQL_OPERATORS.EQUALS, tsName: 'eq' },\r\n [SQL_OPERATORS.NOT_EQUALS]: { sql: SQL_OPERATORS.NOT_EQUALS, tsName: 'neq' },\r\n [SQL_OPERATORS.GREATER_THAN]: { sql: SQL_OPERATORS.GREATER_THAN, tsName: 'gt' },\r\n [SQL_OPERATORS.GREATER_OR_EQUAL]: { sql: SQL_OPERATORS.GREATER_OR_EQUAL, tsName: 'gte' },\r\n [SQL_OPERATORS.LESS_THAN]: { sql: SQL_OPERATORS.LESS_THAN, tsName: 'lt' },\r\n [SQL_OPERATORS.LESS_OR_EQUAL]: { sql: SQL_OPERATORS.LESS_OR_EQUAL, tsName: 'lte' },\r\n [SQL_OPERATORS.LIKE]: { sql: SQL_OPERATORS.LIKE, tsName: 'like' },\r\n [SQL_OPERATORS.NOT_LIKE]: { sql: SQL_OPERATORS.NOT_LIKE, tsName: 'notLike' },\r\n [SQL_OPERATORS.IN]: { sql: SQL_OPERATORS.IN, tsName: 'inList' },\r\n [SQL_OPERATORS.NOT_IN]: { sql: SQL_OPERATORS.NOT_IN, tsName: 'notInList' },\r\n [SQL_OPERATORS.IS_NULL]: { sql: SQL_OPERATORS.IS_NULL, tsName: 'isNull' },\r\n [SQL_OPERATORS.IS_NOT_NULL]: { sql: SQL_OPERATORS.IS_NOT_NULL, tsName: 'isNotNull' },\r\n [SQL_OPERATORS.AND]: { sql: SQL_OPERATORS.AND, tsName: 'and' },\r\n [SQL_OPERATORS.OR]: { sql: SQL_OPERATORS.OR, tsName: 'or' },\r\n [SQL_OPERATORS.BETWEEN]: { sql: SQL_OPERATORS.BETWEEN, tsName: 'between' },\r\n [SQL_OPERATORS.NOT_BETWEEN]: { sql: SQL_OPERATORS.NOT_BETWEEN, tsName: 'notBetween' },\r\n [SQL_OPERATORS.EXISTS]: { sql: SQL_OPERATORS.EXISTS, tsName: 'exists' },\r\n [SQL_OPERATORS.NOT_EXISTS]: { sql: SQL_OPERATORS.NOT_EXISTS, tsName: 'notExists' }\r\n};\r\n","import type { TableNode, FunctionTableNode, DerivedTableNode, TableSourceNode } from '../core/ast/query.js';\nimport type { ColumnNode } from '../core/ast/expression.js';\r\n\r\n/**\r\n * Strategy interface for converting database names to TypeScript identifiers\r\n */\r\nexport interface NamingStrategy {\r\n /**\r\n * Converts a table name to a TypeScript symbol name\r\n * @param table - Table node, function table node, or name\n * @returns Valid TypeScript identifier\n */\n tableToSymbol(table: TableSourceNode | string): string;\n\r\n /**\r\n * Converts a column reference to a property name\r\n * @param column - Column node\r\n * @returns Valid TypeScript property name\r\n */\r\n columnToProperty(column: ColumnNode): string;\r\n}\r\n\r\n/**\r\n * Default naming strategy that maintains backward compatibility\r\n * with the original capitalize() behavior\r\n */\r\nexport class DefaultNamingStrategy implements NamingStrategy {\r\n /**\r\n * Converts table names to TypeScript symbols\r\n * @param table - Table node, function table node, or string name\n * @returns Capitalized table name (handles schema-qualified names)\n */\n tableToSymbol(table: TableNode | FunctionTableNode | DerivedTableNode | string): string {\n const tableName =\n typeof table === 'string'\n ? table\n : table.type === 'DerivedTable'\n ? table.alias\n : table.type === 'FunctionTable'\n ? table.alias ?? table.name\n : table.name;\n\r\n // Handle schema-qualified names (e.g., \"auth.user\" → \"AuthUser\")\r\n if (tableName.includes('.')) {\r\n return tableName.split('.')\r\n .map(part => this.capitalize(part))\r\n .join('');\r\n }\r\n\r\n return this.capitalize(tableName);\r\n }\r\n\r\n /**\r\n * Converts column references to property names\r\n * @param column - Column node\r\n * @returns Column name as-is (for backward compatibility)\r\n */\r\n columnToProperty(column: ColumnNode): string {\r\n return column.name;\r\n }\r\n\r\n /**\r\n * Capitalizes the first letter of a string\r\n * @param s - String to capitalize\r\n * @returns Capitalized string\r\n */\r\n private capitalize(s: string): string {\r\n if (!s) return s;\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n }\r\n}\r\n","import { OrderingTerm, SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n OperandNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n InExpressionNode,\r\n NullExpressionNode,\r\n JsonPathNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ArithmeticExpressionNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n AliasRefNode,\r\n CastExpressionNode,\r\n CollateExpressionNode,\r\n ExpressionVisitor,\r\n OperandVisitor,\r\n visitExpression,\r\n visitOperand\r\n} from '../core/ast/expression.js';\r\nimport { SQL_OPERATOR_REGISTRY } from '../core/sql/sql-operator-config.js';\r\nimport { SqlOperator } from '../core/sql/sql.js';\r\nimport { isRelationAlias } from '../query-builder/relation-alias.js';\r\nimport { HydrationMetadata } from '../core/hydration/types.js';\r\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\r\nimport { NamingStrategy, DefaultNamingStrategy } from './naming-strategy.js';\r\n\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled SQL operator: ${value}`);\r\n};\r\n\r\n/**\r\n * Generates TypeScript code from query AST nodes\r\n */\r\ntype SelectionColumn =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode\r\n | CastExpressionNode;\r\n\r\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\r\n constructor(private namingStrategy: NamingStrategy = new DefaultNamingStrategy()) { }\r\n\r\n /**\r\n * Generates TypeScript code from a query AST\r\n * @param ast - Query AST to generate code from\r\n * @returns Generated TypeScript code\r\n */\r\n generate(ast: SelectQueryNode): string {\r\n const chainLines = this.buildSelectLines(ast);\r\n const lines = chainLines.map((line, index) => (index === 0 ? `const query = ${line}` : line));\r\n lines.push(';', '', 'await query.execute();');\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Builds TypeScript method chain lines from query AST\r\n * @param ast - Query AST\r\n * @returns Array of TypeScript method chain lines\r\n */\r\n private buildSelectLines(ast: SelectQueryNode): string[] {\r\n const lines: string[] = [];\r\n const hydration = (ast.meta as HydrationMetadata | undefined)?.hydration;\r\n const hydratedRelations = new Set(hydration?.relations?.map(r => r.name) ?? []);\r\n\r\n const selections = ast.columns\r\n .filter((col): col is SelectionColumn => !(hydration && isRelationAlias(col.alias)))\r\n .map((col, index) => `${this.getSelectionKey(col, index)}: ${this.printOperand(col)}`);\r\n\r\n lines.push(`db.select({`);\r\n selections.forEach((sel, index) => {\r\n lines.push(` ${sel}${index < selections.length - 1 ? ',' : ''}`);\r\n });\r\n lines.push(`})`);\r\n lines.push(`.from(${this.namingStrategy.tableToSymbol(ast.from)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n const relationName = getJoinRelationName(join);\r\n if (relationName && hydratedRelations.has(relationName)) {\r\n return;\r\n }\r\n\r\n if (relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = this.namingStrategy.tableToSymbol(join.table);\r\n const cond = this.printExpression(join.condition);\r\n let method = 'innerJoin';\r\n if (join.kind === 'LEFT') method = 'leftJoin';\r\n if (join.kind === 'RIGHT') method = 'rightJoin';\r\n lines.push(`.${method}(${table}, ${cond})`);\r\n }\r\n });\r\n\r\n if (hydration?.relations?.length) {\r\n hydration.relations.forEach(rel => {\r\n const options: string[] = [];\r\n if (rel.columns.length) options.push(`columns: [${rel.columns.map(c => `'${c}'`).join(', ')}]`);\r\n if (rel.aliasPrefix !== rel.name) options.push(`aliasPrefix: '${rel.aliasPrefix}'`);\r\n const opts = options.length ? `, { ${options.join(', ')} }` : '';\r\n lines.push(`.include('${rel.name}'${opts})`);\r\n });\r\n }\r\n\r\n if (ast.where) {\r\n lines.push(`.where(${this.printExpression(ast.where)})`);\r\n }\r\n\r\n if (ast.groupBy && ast.groupBy.length) {\r\n const cols = ast.groupBy.map(term => this.printOrderingTerm(term)).join(', ');\r\n lines.push(`.groupBy(${cols})`);\r\n }\r\n\r\n if (ast.having) {\r\n lines.push(`.having(${this.printExpression(ast.having)})`);\r\n }\r\n\r\n if (ast.orderBy && ast.orderBy.length) {\r\n ast.orderBy.forEach(o => {\r\n const term = this.printOrderingTerm(o.term);\r\n const opts: string[] = [`direction: '${o.direction}'`];\r\n if (o.nulls) opts.push(`nulls: '${o.nulls}'`);\r\n if (o.collation) opts.push(`collation: '${o.collation}'`);\r\n const hasOpts = opts.length > 1;\r\n if (hasOpts) {\r\n lines.push(`.orderBy(${term}, { ${opts.join(', ')} })`);\r\n } else {\r\n lines.push(`.orderBy(${term}, '${o.direction}')`);\r\n }\r\n });\r\n }\r\n\r\n if (ast.limit) lines.push(`.limit(${ast.limit})`);\r\n if (ast.offset) lines.push(`.offset(${ast.offset})`);\r\n\r\n return lines;\r\n }\r\n\r\n /**\r\n * Prints an expression node to TypeScript code\r\n * @param expr - Expression node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printExpression(expr: ExpressionNode): string {\r\n return visitExpression(expr, this);\r\n }\r\n\r\n /**\r\n * Prints an operand node to TypeScript code\r\n * @param node - Operand node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printOperand(node: OperandNode): string {\r\n return visitOperand(node, this);\r\n }\r\n\r\n /**\r\n * Prints an ordering term (operand/expression/alias) to TypeScript code.\r\n */\r\n private printOrderingTerm(term: OrderingTerm): string {\r\n if (!term || !('type' in term)) {\r\n throw new Error('Unsupported ordering term');\r\n }\r\n\r\n switch (term.type) {\r\n case 'Column':\r\n return `${this.namingStrategy.tableToSymbol(term.table)}.${term.name}`;\r\n case 'AliasRef':\r\n return this.visitAliasRef(term);\r\n case 'Literal':\r\n case 'Function':\r\n case 'JsonPath':\r\n case 'ScalarSubquery':\r\n case 'CaseExpression':\r\n case 'WindowFunction':\r\n case 'Cast':\r\n case 'Collate':\r\n return this.printOperand(term);\r\n default:\r\n return this.printExpression(term);\r\n }\r\n }\r\n\r\n private getSelectionKey(selection: SelectionColumn, index: number): string {\r\n if (selection.alias) {\r\n return selection.alias;\r\n }\r\n if (this.isNamedSelection(selection)) {\r\n return selection.name;\r\n }\r\n return `selection${index + 1}`;\r\n }\r\n\r\n private isNamedSelection(selection: SelectionColumn): selection is ColumnNode | FunctionNode | WindowFunctionNode {\r\n return 'name' in selection;\r\n }\r\n\r\n public visitBinaryExpression(binary: BinaryExpressionNode): string {\r\n return this.printBinaryExpression(binary);\r\n }\r\n\r\n public visitLogicalExpression(logical: LogicalExpressionNode): string {\r\n return this.printLogicalExpression(logical);\r\n }\r\n\r\n public visitNullExpression(nullExpr: NullExpressionNode): string {\r\n return this.printNullExpression(nullExpr);\r\n }\r\n\r\n public visitInExpression(inExpr: InExpressionNode): string {\r\n return this.printInExpression(inExpr);\r\n }\r\n\r\n public visitExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n return this.printExistsExpression(existsExpr);\r\n }\r\n\r\n public visitBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n return this.printBetweenExpression(betweenExpr);\r\n }\r\n\r\n public visitArithmeticExpression(arithExpr: ArithmeticExpressionNode): string {\r\n return this.printArithmeticExpression(arithExpr);\r\n }\r\n\r\n public visitColumn(node: ColumnNode): string {\r\n return this.printColumnOperand(node);\r\n }\r\n\r\n public visitLiteral(node: LiteralNode): string {\r\n return this.printLiteralOperand(node);\r\n }\r\n\r\n public visitFunction(node: FunctionNode): string {\r\n return this.printFunctionOperand(node);\r\n }\r\n\r\n public visitJsonPath(node: JsonPathNode): string {\r\n return this.printJsonPathOperand(node);\r\n }\r\n\r\n public visitScalarSubquery(node: ScalarSubqueryNode): string {\r\n return this.printScalarSubqueryOperand(node);\r\n }\r\n\r\n public visitCaseExpression(node: CaseExpressionNode): string {\r\n return this.printCaseExpressionOperand(node);\r\n }\r\n\r\n public visitWindowFunction(node: WindowFunctionNode): string {\r\n return this.printWindowFunctionOperand(node);\r\n }\r\n\r\n public visitCast(node: CastExpressionNode): string {\r\n return this.printCastOperand(node);\r\n }\r\n\r\n public visitCollate(node: CollateExpressionNode): string {\r\n return this.printCollateOperand(node);\r\n }\r\n\r\n public visitAliasRef(node: AliasRefNode): string {\r\n return `aliasRef('${node.name}')`;\r\n }\r\n\r\n /**\r\n * Prints a binary expression to TypeScript code\r\n * @param binary - Binary expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBinaryExpression(binary: BinaryExpressionNode): string {\r\n const left = this.printOperand(binary.left);\r\n const right = this.printOperand(binary.right);\r\n const fn = this.mapOp(binary.operator);\r\n const args = [left, right];\r\n if (binary.escape) {\r\n args.push(this.printOperand(binary.escape));\r\n }\r\n return `${fn}(${args.join(', ')})`;\r\n }\r\n\r\n /**\r\n * Prints a logical expression to TypeScript code\r\n * @param logical - Logical expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printLogicalExpression(logical: LogicalExpressionNode): string {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.printExpression(op);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return `${this.mapOp(logical.operator)}(\\n ${parts.join(',\\n ')}\\n )`;\r\n }\r\n\r\n private printArithmeticExpression(expr: ArithmeticExpressionNode): string {\r\n const left = this.printOperand(expr.left);\r\n const right = this.printOperand(expr.right);\r\n return `${left} ${expr.operator} ${right}`;\r\n }\r\n\r\n /**\r\n * Prints an IN expression to TypeScript code\r\n * @param inExpr - IN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printInExpression(inExpr: InExpressionNode): string {\r\n const left = this.printOperand(inExpr.left);\r\n const fn = this.mapOp(inExpr.operator);\r\n if (Array.isArray(inExpr.right)) {\r\n const values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n return `${fn}(${left}, [${values}])`;\r\n }\r\n const subquery = this.inlineChain(this.buildSelectLines(inExpr.right.query));\r\n return `${fn}(${left}, (${subquery}))`;\r\n }\r\n\r\n /**\r\n * Prints a null expression to TypeScript code\r\n * @param nullExpr - Null expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printNullExpression(nullExpr: NullExpressionNode): string {\r\n const left = this.printOperand(nullExpr.left);\r\n const fn = this.mapOp(nullExpr.operator);\r\n return `${fn}(${left})`;\r\n }\r\n\r\n /**\r\n * Prints a BETWEEN expression to TypeScript code\r\n * @param betweenExpr - BETWEEN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n const left = this.printOperand(betweenExpr.left);\r\n const lower = this.printOperand(betweenExpr.lower);\r\n const upper = this.printOperand(betweenExpr.upper);\r\n return `${this.mapOp(betweenExpr.operator)}(${left}, ${lower}, ${upper})`;\r\n }\r\n\r\n /**\r\n * Prints an EXISTS expression to TypeScript code\r\n * @param existsExpr - EXISTS expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(existsExpr.subquery));\r\n return `${this.mapOp(existsExpr.operator)}(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a column operand to TypeScript code\r\n * @param column - Column node\r\n * @returns TypeScript code representation\r\n */\r\n private printColumnOperand(column: ColumnNode): string {\r\n return `${this.namingStrategy.tableToSymbol(column.table)}.${column.name}`;\r\n }\r\n\r\n /**\r\n * Prints a literal operand to TypeScript code\r\n * @param literal - Literal node\r\n * @returns TypeScript code representation\r\n */\r\n private printLiteralOperand(literal: LiteralNode): string {\r\n if (literal.value === null) return 'null';\r\n return typeof literal.value === 'string' ? `'${literal.value}'` : String(literal.value);\r\n }\r\n\r\n /**\r\n * Prints a function operand to TypeScript code\r\n * @param fn - Function node\r\n * @returns TypeScript code representation\r\n */\r\n private printFunctionOperand(fn: FunctionNode): string {\r\n const args = fn.args.map(a => this.printOperand(a)).join(', ');\r\n return `${fn.name.toLowerCase()}(${args})`;\r\n }\r\n\r\n /**\r\n * Prints a JSON path operand to TypeScript code\r\n * @param json - JSON path node\r\n * @returns TypeScript code representation\r\n */\r\n private printJsonPathOperand(json: JsonPathNode): string {\r\n return `jsonPath(${this.namingStrategy.tableToSymbol(json.column.table)}.${json.column.name}, '${json.path}')`;\r\n }\r\n\r\n /**\r\n * Prints a scalar subquery operand to TypeScript code\r\n * @param node - Scalar subquery node\r\n * @returns TypeScript code representation\r\n */\r\n private printScalarSubqueryOperand(node: ScalarSubqueryNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(node.query));\r\n return `(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a CASE expression operand to TypeScript code\r\n * @param node - CASE expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printCaseExpressionOperand(node: CaseExpressionNode): string {\r\n const clauses = node.conditions.map(\r\n condition =>\r\n `{ when: ${this.printExpression(condition.when)}, then: ${this.printOperand(condition.then)} }`\r\n );\r\n const elseValue = node.else ? `, ${this.printOperand(node.else)}` : '';\r\n return `caseWhen([${clauses.join(', ')}]${elseValue})`;\r\n }\r\n\r\n /**\r\n * Prints a window function operand to TypeScript code\r\n * @param node - Window function node\r\n * @returns TypeScript code representation\r\n */\r\n private printWindowFunctionOperand(node: WindowFunctionNode): string {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.printOperand(arg)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause =\r\n 'PARTITION BY ' + node.partitionBy.map(col => `${this.namingStrategy.tableToSymbol(col.table)}.${col.name}`).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause =\r\n 'ORDER BY ' +\r\n node.orderBy\r\n .map(o => {\r\n const term = this.printOrderingTerm(o.term);\r\n const collation = o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n })\r\n .join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n }\r\n\r\n private printCastOperand(node: CastExpressionNode): string {\r\n const typeLiteral = node.castType.replace(/'/g, \"\\\\'\");\r\n return `cast(${this.printOperand(node.expression)}, '${typeLiteral}')`;\r\n }\r\n\r\n private printCollateOperand(node: CollateExpressionNode): string {\r\n return `collate(${this.printOperand(node.expression)}, '${node.collation}')`;\r\n }\r\n\r\n /**\r\n * Converts method chain lines to inline format\r\n * @param lines - Method chain lines\r\n * @returns Inline method chain string\r\n */\r\n private inlineChain(lines: string[]): string {\r\n return lines\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0)\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * Maps SQL operators to TypeScript function names\r\n * @param op - SQL operator\r\n * @returns TypeScript function name\r\n */\r\n private mapOp(op: SqlOperator): string {\r\n const config = SQL_OPERATOR_REGISTRY[op];\r\n if (!config) {\r\n return assertNever(op as never);\r\n }\r\n return config.tsName;\r\n }\r\n}\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Simple identity map for tracking entities within a session.\r\n * Ensures that the same database record is represented by a single entity instance.\r\n */\r\nexport class IdentityMap {\r\n private readonly buckets = new Map<string, Map<string, TrackedEntity>>();\r\n\r\n get bucketsMap(): Map<string, Map<string, TrackedEntity>> {\r\n return this.buckets;\r\n }\r\n\r\n /**\r\n * Retrieves an entity from the identity map if it exists.\r\n * @param table The table definition of the entity.\r\n * @param pk The primary key value.\r\n * @returns The entity instance if found, undefined otherwise.\r\n */\r\n getEntity(table: TableDef, pk: string | number): unknown | undefined {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket?.get(this.toIdentityKey(pk))?.entity;\r\n }\r\n\r\n /**\r\n * Registers a tracked entity in the identity map.\r\n * @param tracked The tracked entity metadata and instance.\r\n */\r\n register(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name) ?? new Map<string, TrackedEntity>();\r\n bucket.set(this.toIdentityKey(tracked.pk), tracked);\r\n this.buckets.set(tracked.table.name, bucket);\r\n }\r\n\r\n remove(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name);\r\n bucket?.delete(this.toIdentityKey(tracked.pk));\r\n }\r\n\r\n /**\r\n * Returns all tracked entities for a specific table.\r\n * @param table The table definition.\r\n * @returns Array of tracked entities.\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket ? Array.from(bucket.values()) : [];\r\n }\r\n\r\n clear(): void {\r\n this.buckets.clear();\r\n }\r\n\r\n private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\r\n}\r\n","import { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\n/**\r\n * Entity status enum representing the lifecycle state of an entity\r\n */\r\nexport enum EntityStatus {\r\n /** Entity is newly created and not yet persisted */\r\n New = 'new',\r\n /** Entity is managed by the ORM and synchronized with the database */\r\n Managed = 'managed',\r\n /** Entity has been modified but not yet persisted */\r\n Dirty = 'dirty',\r\n /** Entity has been marked for removal */\r\n Removed = 'removed',\r\n /** Entity is detached from the ORM context */\r\n Detached = 'detached'\r\n}\r\n\r\n/**\r\n * Represents an entity being tracked by the ORM\r\n */\r\nexport interface TrackedEntity {\r\n /** The table definition this entity belongs to */\r\n table: TableDef;\r\n /** The actual entity instance */\r\n entity: unknown;\r\n /** Primary key value of the entity */\r\n pk: string | number | null;\r\n /** Current status of the entity */\r\n status: EntityStatus;\r\n /** Original values of the entity when it was loaded */\r\n original: Record<string, unknown> | null;\r\n}\r\n\r\n/**\r\n * Type representing a key for relation navigation\r\n */\r\nexport type RelationKey = string;\r\n\r\n/**\r\n * Represents a change operation on a relation\r\n * @typeParam T - Type of the related entity\r\n */\r\nexport type RelationChange<T> =\r\n | { kind: 'add'; entity: T }\r\n | { kind: 'attach'; entity: T }\r\n | { kind: 'remove'; entity: T }\r\n | { kind: 'detach'; entity: T };\r\n\r\n/**\r\n * Represents a relation change entry in the unit of work\r\n */\r\nexport interface RelationChangeEntry {\r\n /** Root entity that owns the relation */\r\n root: unknown;\r\n /** Key of the relation being changed */\r\n relationKey: RelationKey;\r\n /** Table definition of the root entity */\r\n rootTable: TableDef;\r\n /** Name of the relation */\r\n relationName: string;\r\n /** Relation definition */\r\n relation: RelationDef;\r\n /** The change being applied */\r\n change: RelationChange<unknown>;\r\n}\r\n\r\n/**\r\n * Represents a domain event that can be emitted by entities\r\n * @typeParam TType - Type of the event (string literal)\r\n */\r\nexport interface DomainEvent<TType extends string = string> {\r\n /** Type identifier for the event */\r\n readonly type: TType;\r\n /** Timestamp when the event occurred */\r\n readonly occurredAt?: Date;\r\n}\r\n\r\n/**\r\n * Type representing any domain event\r\n */\r\nexport type AnyDomainEvent = DomainEvent<string>;\r\n\r\n/**\r\n * Type representing ORM-specific domain events\r\n */\r\nexport type OrmDomainEvent = AnyDomainEvent;\r\n\r\n/**\r\n * Interface for entities that can emit domain events\r\n * @typeParam E - Type of domain events this entity can emit\r\n */\r\nexport interface HasDomainEvents<E extends DomainEvent = AnyDomainEvent> {\r\n /** Array of domain events emitted by this entity */\r\n domainEvents?: E[];\r\n}\r\n","import { ColumnNode, eq } from '../core/ast/expression.js';\r\nimport type { Dialect, CompiledQuery } from '../core/dialect/abstract.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { UpdateQueryBuilder } from '../query-builder/update.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { TableDef, TableHooks } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { EntityStatus } from './runtime-types.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Unit of Work pattern implementation for tracking entity changes.\r\n */\r\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<unknown, TrackedEntity>();\r\n\r\n /**\r\n * Creates a new UnitOfWork instance.\r\n * @param dialect - The database dialect\r\n * @param executor - The database executor\r\n * @param identityMap - The identity map\r\n * @param hookContext - Function to get the hook context\r\n */\r\n constructor(\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor,\r\n private readonly identityMap: IdentityMap,\r\n private readonly hookContext: () => unknown\r\n ) { }\r\n\r\n /**\r\n * Gets the identity buckets map.\r\n */\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n /**\r\n * Gets all tracked entities.\r\n * @returns Array of tracked entities\r\n */\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n /**\r\n * Gets an entity by table and primary key.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @returns The entity or undefined if not found\r\n */\r\n getEntity(table: TableDef, pk: string | number): unknown | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n /**\r\n * Gets all tracked entities for a specific table.\r\n * @param table - The table definition\r\n * @returns Array of tracked entities\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n /**\r\n * Finds a tracked entity.\r\n * @param entity - The entity to find\r\n * @returns The tracked entity or undefined if not found\r\n */\r\n findTracked(entity: unknown): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n /**\r\n * Sets an entity in the identity map.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n setEntity(table: TableDef, pk: string | number, entity: unknown): void {\r\n if (pk === null || pk === undefined) return;\r\n let tracked = this.trackedEntities.get(entity);\r\n if (!tracked) {\r\n tracked = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity as Record<string, unknown>)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n } else {\r\n tracked.pk = pk;\r\n }\r\n\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n /**\r\n * Tracks a new entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @param pk - Optional primary key value\r\n */\r\n trackNew(table: TableDef, entity: unknown, pk?: string | number): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk: pk ?? null,\r\n status: EntityStatus.New,\r\n original: null\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n if (pk != null) {\r\n this.registerIdentity(tracked);\r\n }\r\n }\r\n\r\n /**\r\n * Tracks a managed entity.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n trackManaged(table: TableDef, pk: string | number, entity: unknown): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity as Record<string, unknown>)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n /**\r\n * Marks an entity as dirty (modified).\r\n * @param entity - The entity to mark as dirty\r\n */\r\n markDirty(entity: unknown): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n if (tracked.status === EntityStatus.New || tracked.status === EntityStatus.Removed) return;\r\n tracked.status = EntityStatus.Dirty;\r\n }\r\n\r\n /**\r\n * Marks an entity as removed.\r\n * @param entity - The entity to mark as removed\r\n */\r\n markRemoved(entity: unknown): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n tracked.status = EntityStatus.Removed;\r\n }\r\n\r\n /**\r\n * Flushes pending changes to the database.\r\n */\r\n async flush(): Promise<void> {\r\n const toFlush = Array.from(this.trackedEntities.values());\r\n for (const tracked of toFlush) {\r\n switch (tracked.status) {\r\n case EntityStatus.New:\r\n await this.flushInsert(tracked);\r\n break;\r\n case EntityStatus.Dirty:\r\n await this.flushUpdate(tracked);\r\n break;\r\n case EntityStatus.Removed:\r\n await this.flushDelete(tracked);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the unit of work by clearing all tracked entities and identity map.\r\n */\r\n reset(): void {\r\n this.trackedEntities.clear();\r\n this.identityMap.clear();\r\n }\r\n\r\n /**\r\n * Flushes an insert operation for a new entity.\r\n * @param tracked - The tracked entity to insert\r\n */\r\n private async flushInsert(tracked: TrackedEntity): Promise<void> {\r\n await this.runHook(tracked.table.hooks?.beforeInsert, tracked);\r\n\r\n const payload = this.extractColumns(tracked.table, tracked.entity as Record<string, unknown>);\r\n let builder = new InsertQueryBuilder(tracked.table).values(payload);\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity as Record<string, unknown>);\r\n tracked.pk = this.getPrimaryKeyValue(tracked);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterInsert, tracked);\r\n }\r\n\r\n /**\r\n * Flushes an update operation for a modified entity.\r\n * @param tracked - The tracked entity to update\r\n */\r\n private async flushUpdate(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n const changes = this.computeChanges(tracked);\r\n if (!Object.keys(changes).length) {\r\n tracked.status = EntityStatus.Managed;\r\n return;\r\n }\r\n\r\n await this.runHook(tracked.table.hooks?.beforeUpdate, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n let builder = new UpdateQueryBuilder(tracked.table)\r\n .set(changes)\r\n .where(eq(pkColumn, tracked.pk));\r\n\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity as Record<string, unknown>);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\r\n\r\n /**\r\n * Flushes a delete operation for a removed entity.\r\n * @param tracked - The tracked entity to delete\r\n */\r\n private async flushDelete(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n await this.runHook(tracked.table.hooks?.beforeDelete, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n const builder = new DeleteQueryBuilder(tracked.table).where(eq(pkColumn, tracked.pk));\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Detached;\r\n this.trackedEntities.delete(tracked.entity);\r\n this.identityMap.remove(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterDelete, tracked);\r\n }\r\n\r\n /**\r\n * Runs a table hook if defined.\r\n * @param hook - The hook function\r\n * @param tracked - The tracked entity\r\n */\r\n private async runHook(\r\n hook: TableHooks[keyof TableHooks] | undefined,\r\n tracked: TrackedEntity\r\n ): Promise<void> {\r\n if (!hook) return;\r\n await hook(this.hookContext(), tracked.entity);\r\n }\r\n\r\n /**\r\n * Computes changes between current entity state and original snapshot.\r\n * @param tracked - The tracked entity\r\n * @returns Object with changed column values\r\n */\r\n private computeChanges(tracked: TrackedEntity): Record<string, unknown> {\r\n const snapshot = tracked.original ?? {};\r\n const changes: Record<string, unknown> = {};\r\n for (const column of Object.keys(tracked.table.columns)) {\r\n const current = tracked.entity[column];\r\n if (snapshot[column] !== current) {\r\n changes[column] = current;\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Extracts column values from an entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @returns Object with column values\r\n */\r\n private extractColumns(table: TableDef, entity: Record<string, unknown>): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n if (entity[column] === undefined) continue;\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n /**\r\n * Executes a compiled query.\r\n * @param compiled - The compiled query\r\n * @returns Query results\r\n */\r\n private async executeCompiled(compiled: CompiledQuery): Promise<QueryResult[]> {\r\n return this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Gets columns for RETURNING clause.\r\n * @param table - The table definition\r\n * @returns Array of column nodes\r\n */\r\n private getReturningColumns(table: TableDef): ColumnNode[] {\r\n return Object.values(table.columns).map(column => ({\r\n type: 'Column',\r\n table: table.name,\r\n name: column.name,\r\n alias: column.name\r\n }));\r\n }\r\n\r\n /**\r\n * Applies RETURNING clause results to the tracked entity.\r\n * @param tracked - The tracked entity\r\n * @param results - Query results\r\n */\r\n private applyReturningResults(tracked: TrackedEntity, results: QueryResult[]): void {\r\n if (!this.dialect.supportsReturning()) return;\r\n const first = results[0];\r\n if (!first || first.values.length === 0) return;\r\n\r\n const row = first.values[0];\r\n for (let i = 0; i < first.columns.length; i++) {\r\n const columnName = this.normalizeColumnName(first.columns[i]);\r\n if (!(columnName in tracked.table.columns)) continue;\r\n tracked.entity[columnName] = row[i];\r\n }\r\n }\r\n\r\n /**\r\n * Normalizes a column name by removing quotes and table prefixes.\r\n * @param column - The column name to normalize\r\n * @returns Normalized column name\r\n */\r\n private normalizeColumnName(column: string): string {\r\n const parts = column.split('.');\r\n const candidate = parts[parts.length - 1];\r\n return candidate.replace(/^[\"`[\\]]+|[\"`[\\]]+$/g, '');\r\n }\r\n\r\n /**\r\n * Registers an entity in the identity map.\r\n * @param tracked - The tracked entity to register\r\n */\r\n private registerIdentity(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n this.identityMap.register(tracked);\r\n }\r\n\r\n /**\r\n * Creates a snapshot of an entity's current state.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @returns Object with entity state\r\n */\r\n private createSnapshot(table: TableDef, entity: Record<string, unknown>): Record<string, unknown> {\r\n const snapshot: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n snapshot[column] = entity[column];\r\n }\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Gets the primary key value from a tracked entity.\r\n * @param tracked - The tracked entity\r\n * @returns Primary key value or null\r\n */\r\n private getPrimaryKeyValue(tracked: TrackedEntity): string | number | null {\r\n const key = findPrimaryKey(tracked.table);\r\n const val = tracked.entity[key];\r\n if (val === undefined || val === null) return null;\r\n return val;\r\n }\r\n}\r\n","import type { DomainEvent, HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Extracts domain events of a specific type.\r\n * @template E - The domain event type\r\n * @template TType - The specific event type\r\n */\r\ntype EventOfType<E extends DomainEvent, TType extends E['type']> =\r\n Extract<E, { type: TType }>;\r\n\r\n/**\r\n * Domain event handler function.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n * @param event - The domain event\r\n * @param ctx - The context\r\n */\r\nexport type DomainEventHandler<E extends DomainEvent, Context> =\r\n (event: E, ctx: Context) => Promise<void> | void;\r\n\r\n/**\r\n * Initial handlers for domain events.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n */\r\nexport type InitialHandlers<E extends DomainEvent, Context> = {\r\n [K in E['type']]?: DomainEventHandler<EventOfType<E, K>, Context>[];\r\n};\r\n\r\n/**\r\n * Domain event bus for managing and dispatching domain events.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n */\r\nexport class DomainEventBus<E extends DomainEvent, Context> {\r\n private readonly handlers = new Map<E['type'], DomainEventHandler<E, Context>[]>();\r\n\r\n /**\r\n * Creates a new DomainEventBus instance.\r\n * @param initialHandlers - Optional initial event handlers\r\n */\r\n constructor(initialHandlers?: InitialHandlers<E, Context>) {\r\n if (initialHandlers) {\r\n for (const key in initialHandlers) {\r\n const type = key as E['type'];\r\n const list = initialHandlers[type] ?? [];\r\n this.handlers.set(type, [...(list as DomainEventHandler<E, Context>[])]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Registers an event handler for a specific event type.\r\n * @template TType - The event type\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n on<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n const key = type as E['type'];\r\n const existing = this.handlers.get(key) ?? [];\r\n existing.push(handler as unknown as DomainEventHandler<E, Context>);\r\n this.handlers.set(key, existing);\r\n }\r\n\r\n /**\r\n * Registers an event handler for a specific event type (alias for on).\r\n * @template TType - The event type\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n register<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n this.on(type, handler);\r\n }\r\n\r\n /**\r\n * Dispatches domain events for tracked entities.\r\n * @param trackedEntities - Iterable of tracked entities\r\n * @param ctx - The context to pass to handlers\r\n */\r\n async dispatch(trackedEntities: Iterable<TrackedEntity>, ctx: Context): Promise<void> {\r\n for (const tracked of trackedEntities) {\r\n const entity = tracked.entity as HasDomainEvents<E>;\r\n if (!entity.domainEvents?.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const handlers = this.handlers.get(event.type as E['type']);\r\n if (!handlers?.length) continue;\r\n\r\n for (const handler of handlers) {\r\n await handler(event, ctx);\r\n }\r\n }\r\n\r\n entity.domainEvents = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Adds a domain event to an entity.\r\n * @template E - The domain event type\r\n * @param entity - The entity to add the event to\r\n * @param event - The domain event to add\r\n */\r\nexport const addDomainEvent = <E extends DomainEvent>(\r\n entity: HasDomainEvents<E>,\r\n event: E\r\n): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import { and, eq } from '../core/ast/expression.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { BelongsToManyRelation, HasManyRelation, HasOneRelation } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\n/**\r\n * Processes relation changes for entity relationships.\r\n */\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\r\n\r\n /**\r\n * Creates a new RelationChangeProcessor instance.\r\n * @param unitOfWork - The unit of work instance\r\n * @param dialect - The database dialect\r\n * @param executor - The database executor\r\n */\r\n constructor(\r\n private readonly unitOfWork: UnitOfWork,\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor\r\n ) { }\r\n\r\n /**\r\n * Registers a relation change for processing.\r\n * @param entry - The relation change entry\r\n */\r\n registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\r\n\r\n /**\r\n * Resets the relation change processor by clearing all pending changes.\r\n */\r\n reset(): void {\r\n this.relationChanges.length = 0;\r\n }\r\n\r\n /**\r\n * Processes all pending relation changes.\r\n */\r\n async process(): Promise<void> {\r\n if (!this.relationChanges.length) return;\r\n const entries = [...this.relationChanges];\r\n this.relationChanges.length = 0;\r\n\r\n for (const entry of entries) {\r\n switch (entry.relation.type) {\r\n case RelationKinds.HasMany:\r\n await this.handleHasManyChange(entry);\r\n break;\r\n case RelationKinds.HasOne:\r\n await this.handleHasOneChange(entry);\r\n break;\r\n case RelationKinds.BelongsToMany:\r\n await this.handleBelongsToManyChange(entry);\r\n break;\r\n case RelationKinds.BelongsTo:\r\n await this.handleBelongsToChange(entry);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for has-many relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleHasManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasManyRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'add' || entry.change.kind === 'attach') {\r\n this.assignHasManyForeignKey(tracked.entity as Record<string, unknown>, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasManyChild(tracked.entity as Record<string, unknown>, relation);\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for has-one relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleHasOneChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasOneRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n this.assignHasOneForeignKey(tracked.entity as Record<string, unknown>, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasOneChild(tracked.entity as Record<string, unknown>, relation);\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for belongs-to relations.\r\n * @param _entry - The relation change entry (reserved for future use)\r\n */\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n void _entry;\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\r\n\r\n /**\r\n * Handles changes for belongs-to-many relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleBelongsToManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as BelongsToManyRelation;\r\n const rootKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootId = entry.root[rootKey];\r\n if (rootId === undefined || rootId === null) return;\r\n\r\n const targetId = this.resolvePrimaryKeyValue(entry.change.entity as Record<string, unknown>, relation.target);\r\n if (targetId === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n await this.insertPivotRow(relation, rootId, targetId);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'detach' || entry.change.kind === 'remove') {\r\n await this.deletePivotRow(relation, rootId, targetId);\r\n\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(entry.change.entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Assigns a foreign key for has-many relations.\r\n * @param child - The child entity\r\n * @param relation - The has-many relation\r\n * @param rootValue - The root entity's primary key value\r\n */\r\n private assignHasManyForeignKey(child: Record<string, unknown>, relation: HasManyRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n /**\r\n * Detaches a child entity from has-many relations.\r\n * @param child - The child entity\r\n * @param relation - The has-many relation\r\n */\r\n private detachHasManyChild(child: Record<string, unknown>, relation: HasManyRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n /**\r\n * Assigns a foreign key for has-one relations.\r\n * @param child - The child entity\r\n * @param relation - The has-one relation\r\n * @param rootValue - The root entity's primary key value\r\n */\r\n private assignHasOneForeignKey(child: Record<string, unknown>, relation: HasOneRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n /**\r\n * Detaches a child entity from has-one relations.\r\n * @param child - The child entity\r\n * @param relation - The has-one relation\r\n */\r\n private detachHasOneChild(child: Record<string, unknown>, relation: HasOneRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n /**\r\n * Inserts a pivot row for belongs-to-many relations.\r\n * @param relation - The belongs-to-many relation\r\n * @param rootId - The root entity's primary key value\r\n * @param targetId - The target entity's primary key value\r\n */\r\n private async insertPivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const payload = {\r\n [relation.pivotForeignKeyToRoot]: rootId,\r\n [relation.pivotForeignKeyToTarget]: targetId\r\n };\r\n const builder = new InsertQueryBuilder(relation.pivotTable).values(payload);\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Deletes a pivot row for belongs-to-many relations.\r\n * @param relation - The belongs-to-many relation\r\n * @param rootId - The root entity's primary key value\r\n * @param targetId - The target entity's primary key value\r\n */\r\n private async deletePivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const rootCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n const targetCol = relation.pivotTable.columns[relation.pivotForeignKeyToTarget];\r\n if (!rootCol || !targetCol) return;\r\n\r\n const builder = new DeleteQueryBuilder(relation.pivotTable).where(\r\n and(eq(rootCol, rootId), eq(targetCol, targetId))\r\n );\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Resolves the primary key value from an entity.\r\n * @param entity - The entity\r\n * @param table - The table definition\r\n * @returns The primary key value or null\r\n */\r\n private resolvePrimaryKeyValue(entity: Record<string, unknown>, table: TableDef): string | number | null {\r\n if (!entity) return null;\r\n const key = findPrimaryKey(table);\r\n const value = entity[key];\r\n if (value === undefined || value === null) return null;\r\n return (value as string | number | null | undefined) ?? null;\r\n }\r\n}\r\n","import type { DbExecutor } from '../core/execution/db-executor.js';\n\n/**\n * Represents a single SQL query log entry\n */\nexport interface QueryLogEntry {\n /** The SQL query that was executed */\n sql: string;\n /** Parameters used in the query */\n params?: unknown[];\n}\n\n/**\n * Function type for query logging callbacks\n * @param entry - The query log entry to process\n */\nexport type QueryLogger = (entry: QueryLogEntry) => void;\n\n/**\n * Creates a wrapped database executor that logs all SQL queries\n * @param executor - Original database executor to wrap\n * @param logger - Optional logger function to receive query log entries\n * @returns Wrapped executor that logs queries before execution\n */\nexport const createQueryLoggingExecutor = (\n executor: DbExecutor,\n logger?: QueryLogger\n): DbExecutor => {\n if (!logger) {\n return executor;\n }\n\n const wrapped: DbExecutor = {\n capabilities: executor.capabilities,\n async executeSql(sql, params) {\n logger({ sql, params });\n return executor.executeSql(sql, params);\n }\n ,\n beginTransaction: () => executor.beginTransaction(),\n commitTransaction: () => executor.commitTransaction(),\n rollbackTransaction: () => executor.rollbackTransaction(),\n dispose: () => executor.dispose(),\n };\n\n return wrapped;\n};\n","import type { DbExecutor } from '../core/execution/db-executor.js';\r\n\r\n/**\r\n * Executes a function within a database transaction\r\n * @param executor - Database executor to use for transaction operations\r\n * @param action - Function to execute within the transaction\r\n * @returns Promise that resolves when the transaction is complete\r\n * @throws Re-throws any errors that occur during the transaction (after rolling back)\r\n */\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.capabilities.transactions) {\r\n await action();\r\n return;\r\n }\r\n\r\n await executor.beginTransaction();\r\n try {\r\n await action();\r\n await executor.commitTransaction();\r\n } catch (error) {\r\n await executor.rollbackTransaction();\r\n throw error;\r\n }\r\n};\r\n","import type {\n EntityInstance,\n HasManyCollection,\n HasOneReference,\n BelongsToReference,\n ManyToManyCollection\n} from '../schema/types.js';\nimport { normalizeColumnType, type ColumnDef } from '../schema/column-types.js';\nimport {\n RelationKinds,\n type BelongsToManyRelation,\n type BelongsToRelation,\n type HasManyRelation,\n type HasOneRelation,\r\n type RelationDef\r\n} from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport { createEntityFromRow } from './entity.js';\r\nimport type { EntityConstructor } from './entity-metadata.js';\r\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\r\nimport type { OrmSession } from './orm-session.js';\r\n\r\n/**\r\n * Options for controlling the behavior of save graph operations.\r\n */\r\nexport interface SaveGraphOptions {\n /** Remove existing collection members that are not present in the payload */\n pruneMissing?: boolean;\n /**\n * Coerce JSON-friendly input values into DB-friendly primitives.\n * Currently:\n * - Date -> ISO string (for DATE/DATETIME/TIMESTAMP/TIMESTAMPTZ columns)\n */\n coerce?: 'json';\n}\n\r\n/** Represents an entity object with arbitrary properties. */\r\n\r\n/** Represents an entity object with arbitrary properties. */\r\n\r\ntype AnyEntity = Record<string, unknown>;\r\n\r\n/**\r\n\r\n * Converts a value to a string key, returning an empty string for null or undefined.\r\n\r\n * @param value - The value to convert.\r\n\r\n * @returns The string representation or empty string.\r\n\r\n */\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst coerceColumnValue = (\n table: TableDef,\n columnName: string,\n value: unknown,\n options: SaveGraphOptions\n): unknown => {\n if (options.coerce !== 'json') return value;\n if (value === null || value === undefined) return value;\n\n const column = table.columns[columnName] as unknown as ColumnDef | undefined;\n if (!column) return value;\n\n const normalized = normalizeColumnType(column.type);\n\n const isDateLikeColumn =\n normalized === 'date' ||\n normalized === 'datetime' ||\n normalized === 'timestamp' ||\n normalized === 'timestamptz';\n\n if (isDateLikeColumn && value instanceof Date) {\n return value.toISOString();\n }\n\n // Future coercions can be added here based on `normalized`.\n return value;\n};\n\nconst pickColumns = (table: TableDef, payload: AnyEntity, options: SaveGraphOptions): Record<string, unknown> => {\n const columns: Record<string, unknown> = {};\n for (const key of Object.keys(table.columns)) {\n if (payload[key] !== undefined) {\n columns[key] = coerceColumnValue(table, key, payload[key], options);\n }\n }\n return columns;\n};\n\r\nconst ensureEntity = <TTable extends TableDef>(\n session: OrmSession,\n table: TTable,\n payload: AnyEntity,\n options: SaveGraphOptions\n): EntityInstance<TTable> => {\n const pk = findPrimaryKey(table);\n const row = pickColumns(table, payload, options);\n const pkValue = payload[pk];\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = session.getEntity(table, pkValue);\r\n if (tracked) {\r\n return tracked as EntityInstance<TTable>;\r\n }\r\n // Seed the stub with PK to track a managed entity when updating.\r\n if (row[pk] === undefined) {\r\n row[pk] = pkValue;\r\n }\r\n }\r\n\r\n return createEntityFromRow(session, table, row) as EntityInstance<TTable>;\n};\n\nconst assignColumns = (table: TableDef, entity: AnyEntity, payload: AnyEntity, options: SaveGraphOptions): void => {\n for (const key of Object.keys(table.columns)) {\n if (payload[key] !== undefined) {\n entity[key] = coerceColumnValue(table, key, payload[key], options);\n }\n }\n};\n\r\nconst isEntityInCollection = (items: AnyEntity[], pkName: string, entity: AnyEntity): boolean => {\r\n if (items.includes(entity)) return true;\r\n const entityPk = entity[pkName];\r\n if (entityPk === undefined || entityPk === null) return false;\r\n return items.some(item => toKey(item[pkName]) === toKey(entityPk));\r\n};\r\n\r\nconst findInCollectionByPk = (items: AnyEntity[], pkName: string, pkValue: unknown): AnyEntity | undefined => {\r\n if (pkValue === undefined || pkValue === null) return undefined;\r\n return items.find(item => toKey(item[pkName]) === toKey(pkValue));\r\n};\r\n\r\nconst handleHasMany = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: HasManyRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n if (!Array.isArray(payload)) return;\r\n const collection = root[relationName] as unknown as HasManyCollection<unknown>;\r\n await collection.load();\r\n\r\n const targetTable = relation.target;\r\n const targetPk = findPrimaryKey(targetTable);\r\n const existing = collection.getItems() as unknown as AnyEntity[];\r\n const seen = new Set<string>();\r\n\r\n for (const item of payload) {\r\n if (item === null || item === undefined) continue;\r\n const asObj = typeof item === 'object' ? (item as AnyEntity) : { [targetPk]: item };\r\n const pkValue = asObj[targetPk];\r\n\r\n const current =\n findInCollectionByPk(existing, targetPk, pkValue) ??\n (pkValue !== undefined && pkValue !== null ? session.getEntity(targetTable, pkValue) : undefined);\n\n const entity = current ?? ensureEntity(session, targetTable, asObj, options);\n assignColumns(targetTable, entity as AnyEntity, asObj, options);\n await applyGraphToEntity(session, targetTable, entity as AnyEntity, asObj, options);\n\r\n if (!isEntityInCollection(collection.getItems() as unknown as AnyEntity[], targetPk, entity as unknown as AnyEntity)) {\r\n collection.attach(entity);\r\n }\r\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n seen.add(toKey(pkValue));\r\n }\r\n }\r\n\r\n if (options.pruneMissing) {\r\n for (const item of [...collection.getItems()]) {\r\n const pkValue = item[targetPk];\r\n if (pkValue !== undefined && pkValue !== null && !seen.has(toKey(pkValue))) {\r\n collection.remove(item);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst handleHasOne = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: HasOneRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n const ref = root[relationName] as unknown as HasOneReference<unknown>;\r\n if (payload === undefined) return;\r\n if (payload === null) {\r\n ref.set(null);\r\n return;\r\n }\r\n const pk = findPrimaryKey(relation.target);\r\n if (typeof payload === 'number' || typeof payload === 'string') {\r\n const entity = ref.set({ [pk]: payload });\r\n if (entity) {\r\n await applyGraphToEntity(session, relation.target, entity as AnyEntity, { [pk]: payload }, options);\r\n }\r\n return;\r\n }\r\n const attached = ref.set(payload as AnyEntity);\n if (attached) {\n await applyGraphToEntity(session, relation.target, attached as AnyEntity, payload as AnyEntity, options);\n }\n};\n\r\nconst handleBelongsTo = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: BelongsToRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n const ref = root[relationName] as unknown as BelongsToReference<unknown>;\r\n if (payload === undefined) return;\r\n if (payload === null) {\r\n ref.set(null);\r\n return;\r\n }\r\n const pk = relation.localKey || findPrimaryKey(relation.target);\r\n if (typeof payload === 'number' || typeof payload === 'string') {\r\n const entity = ref.set({ [pk]: payload });\r\n if (entity) {\r\n await applyGraphToEntity(session, relation.target, entity as AnyEntity, { [pk]: payload }, options);\r\n }\r\n return;\r\n }\r\n const attached = ref.set(payload as AnyEntity);\n if (attached) {\n await applyGraphToEntity(session, relation.target, attached as AnyEntity, payload as AnyEntity, options);\n }\n};\n\r\nconst handleBelongsToMany = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n if (!Array.isArray(payload)) return;\r\n const collection = root[relationName] as unknown as ManyToManyCollection<unknown>;\r\n await collection.load();\r\n\r\n const targetTable = relation.target;\r\n const targetPk = relation.targetKey || findPrimaryKey(targetTable);\r\n const seen = new Set<string>();\r\n\r\n for (const item of payload) {\r\n if (item === null || item === undefined) continue;\r\n if (typeof item === 'number' || typeof item === 'string') {\r\n const id = item;\r\n collection.attach(id);\r\n seen.add(toKey(id));\r\n continue;\r\n }\r\n\r\n const asObj = item as AnyEntity;\n const pkValue = asObj[targetPk];\n const entity = pkValue !== undefined && pkValue !== null\n ? session.getEntity(targetTable, pkValue) ?? ensureEntity(session, targetTable, asObj, options)\n : ensureEntity(session, targetTable, asObj, options);\n\n assignColumns(targetTable, entity as AnyEntity, asObj, options);\n await applyGraphToEntity(session, targetTable, entity as AnyEntity, asObj, options);\n\r\n if (!isEntityInCollection(collection.getItems() as unknown as AnyEntity[], targetPk, entity as unknown as AnyEntity)) {\r\n collection.attach(entity);\r\n }\r\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n seen.add(toKey(pkValue));\r\n }\r\n }\r\n\r\n if (options.pruneMissing) {\r\n for (const item of [...collection.getItems()] as unknown as AnyEntity[]) {\r\n const pkValue = item[targetPk];\r\n if (pkValue !== undefined && pkValue !== null && !seen.has(toKey(pkValue))) {\r\n collection.detach(item);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst applyRelation = async (\r\n session: OrmSession,\r\n table: TableDef,\r\n entity: AnyEntity,\r\n relationName: string,\r\n relation: RelationDef,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\r\n return handleHasMany(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.HasOne:\r\n return handleHasOne(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.BelongsTo:\r\n return handleBelongsTo(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.BelongsToMany:\r\n return handleBelongsToMany(session, entity, relationName, relation, payload, options);\r\n }\r\n};\r\n\r\nconst applyGraphToEntity = async (\n session: OrmSession,\n table: TableDef,\n entity: AnyEntity,\n payload: AnyEntity,\n options: SaveGraphOptions\n): Promise<void> => {\n assignColumns(table, entity, payload, options);\n\n for (const [relationName, relation] of Object.entries(table.relations)) {\n if (!(relationName in payload)) continue;\n await applyRelation(session, table, entity, relationName, relation as RelationDef, payload[relationName], options);\n }\n};\n\r\nexport const saveGraph = async <TTable extends TableDef>(\n session: OrmSession,\n entityClass: EntityConstructor,\n payload: AnyEntity,\n options: SaveGraphOptions = {}\n): Promise<EntityInstance<TTable>> => {\n const table = getTableDefFromEntity(entityClass);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n\r\n const root = ensureEntity<TTable>(session, table as TTable, payload, options);\n await applyGraphToEntity(session, table, root as AnyEntity, payload, options);\n return root;\n};\n\r\n/**\r\n\r\n * Internal version of saveGraph with typed return based on the constructor.\r\n\r\n * @param session - The ORM session.\r\n\r\n * @param entityClass - The entity constructor.\r\n\r\n * @param payload - The payload data for the root entity and its relations.\r\n\r\n * @param options - Options for the save operation.\r\n\r\n * @returns The root entity instance.\r\n\r\n */\r\n\r\nexport const saveGraphInternal = async <TCtor extends EntityConstructor>(\n\r\n session: OrmSession,\r\n\r\n entityClass: TCtor,\r\n\r\n payload: AnyEntity,\r\n\r\n options: SaveGraphOptions = {}\r\n\r\n): Promise<InstanceType<TCtor>> => {\r\n\r\n const table = getTableDefFromEntity(entityClass);\n\r\n if (!table) {\r\n\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n\r\n }\r\n\r\n const root = ensureEntity(session, table, payload, options);\n\n await applyGraphToEntity(session, table, root as AnyEntity, payload, options);\n\n return root as unknown as InstanceType<TCtor>;\n\n};\n","import { Dialect } from '../core/dialect/abstract.js';\r\nimport { eq } from '../core/ast/expression.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { ColumnDef } from '../schema/column-types.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport { EntityInstance } from '../schema/types.js';\r\nimport { RelationDef } from '../schema/relation.js';\r\n\r\nimport { selectFromEntity, getTableDefFromEntity } from '../decorators/bootstrap.js';\r\nimport type { EntityConstructor } from './entity-metadata.js';\r\nimport { Orm } from './orm.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\nimport { DomainEventBus, DomainEventHandler, InitialHandlers } from './domain-event-bus.js';\r\nimport { RelationChangeProcessor } from './relation-change-processor.js';\r\nimport { createQueryLoggingExecutor, QueryLogger } from './query-logger.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport type { HydrationContext } from './hydration-context.js';\r\nimport type { EntityContext } from './entity-context.js';\r\nimport {\r\n DomainEvent,\r\n OrmDomainEvent,\r\n RelationChange,\r\n RelationChangeEntry,\r\n RelationKey,\r\n TrackedEntity\r\n} from './runtime-types.js';\r\nimport { executeHydrated } from './execute.js';\nimport { runInTransaction } from './transaction-runner.js';\nimport { saveGraphInternal, SaveGraphOptions } from './save-graph.js';\nimport type { SaveGraphInputPayload } from './save-graph-types.js';\n\r\n/**\r\n * Interface for ORM interceptors that allow hooking into the flush lifecycle.\r\n */\r\nexport interface OrmInterceptor {\r\n /**\r\n * Called before the flush operation begins.\r\n * @param ctx - The entity context\r\n */\r\n beforeFlush?(ctx: EntityContext): Promise<void> | void;\r\n\r\n /**\r\n * Called after the flush operation completes.\r\n * @param ctx - The entity context\r\n */\r\n afterFlush?(ctx: EntityContext): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Options for creating an OrmSession instance.\r\n * @template E - The domain event type\r\n */\r\nexport interface OrmSessionOptions<E extends DomainEvent = OrmDomainEvent> {\r\n /** The ORM instance */\r\n orm: Orm<E>;\r\n /** The database executor */\r\n executor: DbExecutor;\r\n /** Optional query logger for debugging */\r\n queryLogger?: QueryLogger;\r\n /** Optional interceptors for flush lifecycle hooks */\r\n interceptors?: OrmInterceptor[];\r\n /** Optional domain event handlers */\r\n domainEventHandlers?: InitialHandlers<E, OrmSession<E>>;\r\n}\r\n\r\n/**\r\n * ORM Session that manages entity lifecycle, identity mapping, and database operations.\r\n * @template E - The domain event type\r\n */\r\nexport class OrmSession<E extends DomainEvent = OrmDomainEvent> implements EntityContext {\r\n /** The ORM instance */\r\n readonly orm: Orm<E>;\r\n /** The database executor */\r\n readonly executor: DbExecutor;\r\n /** The identity map for tracking entity instances */\r\n readonly identityMap: IdentityMap;\r\n /** The unit of work for tracking entity changes */\r\n readonly unitOfWork: UnitOfWork;\r\n /** The domain event bus */\r\n readonly domainEvents: DomainEventBus<E, OrmSession<E>>;\r\n /** The relation change processor */\r\n readonly relationChanges: RelationChangeProcessor;\r\n\r\n private readonly interceptors: OrmInterceptor[];\r\n\r\n /**\r\n * Creates a new OrmSession instance.\r\n * @param opts - Session options\r\n */\r\n constructor(opts: OrmSessionOptions<E>) {\r\n this.orm = opts.orm;\r\n this.executor = createQueryLoggingExecutor(opts.executor, opts.queryLogger);\r\n this.interceptors = [...(opts.interceptors ?? [])];\r\n\r\n this.identityMap = new IdentityMap();\r\n this.unitOfWork = new UnitOfWork(this.orm.dialect, this.executor, this.identityMap, () => this);\r\n this.relationChanges = new RelationChangeProcessor(this.unitOfWork, this.orm.dialect, this.executor);\r\n this.domainEvents = new DomainEventBus<E, OrmSession<E>>(opts.domainEventHandlers);\r\n }\r\n\r\n /**\r\n * Releases resources associated with this session (executor/pool leases) and resets tracking.\r\n * Must be safe to call multiple times.\r\n */\r\n async dispose(): Promise<void> {\r\n try {\r\n await this.executor.dispose();\r\n } finally {\r\n // Always reset in-memory tracking.\r\n this.unitOfWork.reset();\r\n this.relationChanges.reset();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the database dialect.\r\n */\r\n get dialect(): Dialect {\r\n return this.orm.dialect;\r\n }\r\n\r\n /**\r\n * Gets the identity buckets map.\r\n */\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.unitOfWork.identityBuckets;\r\n }\r\n\r\n /**\r\n * Gets all tracked entities.\r\n */\r\n get tracked(): TrackedEntity[] {\r\n return this.unitOfWork.getTracked();\r\n }\r\n\r\n /**\r\n * Gets an entity by table and primary key.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @returns The entity or undefined if not found\r\n */\r\n getEntity(table: TableDef, pk: unknown): unknown | undefined {\r\n return this.unitOfWork.getEntity(table, pk as string | number);\r\n }\r\n\r\n /**\r\n * Sets an entity in the identity map.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n setEntity(table: TableDef, pk: unknown, entity: unknown): void {\r\n this.unitOfWork.setEntity(table, pk as string | number, entity);\r\n }\r\n\r\n /**\r\n * Tracks a new entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @param pk - Optional primary key value\r\n */\r\n trackNew(table: TableDef, entity: unknown, pk?: unknown): void {\r\n this.unitOfWork.trackNew(table, entity, pk as string | number);\r\n }\r\n\r\n /**\r\n * Tracks a managed entity.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n trackManaged(table: TableDef, pk: unknown, entity: unknown): void {\r\n this.unitOfWork.trackManaged(table, pk as string | number, entity);\r\n }\r\n\r\n /**\r\n * Marks an entity as dirty (modified).\r\n * @param entity - The entity to mark as dirty\r\n */\r\n markDirty(entity: unknown): void {\r\n this.unitOfWork.markDirty(entity);\r\n }\r\n\r\n /**\r\n * Marks an entity as removed.\r\n * @param entity - The entity to mark as removed\r\n */\r\n markRemoved(entity: unknown): void {\r\n this.unitOfWork.markRemoved(entity);\r\n }\r\n\r\n /**\r\n * Registers a relation change.\r\n * @param root - The root entity\r\n * @param relationKey - The relation key\r\n * @param rootTable - The root table definition\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param change - The relation change\r\n */\r\n registerRelationChange = (\r\n root: unknown,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<unknown>\r\n ): void => {\r\n this.relationChanges.registerChange(\r\n buildRelationChangeEntry(root, relationKey, rootTable, relationName, relation, change)\r\n );\r\n };\r\n\r\n /**\r\n * Gets all tracked entities for a specific table.\r\n * @param table - The table definition\r\n * @returns Array of tracked entities\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.unitOfWork.getEntitiesForTable(table);\r\n }\r\n\r\n /**\r\n * Registers an interceptor for flush lifecycle hooks.\r\n * @param interceptor - The interceptor to register\r\n */\r\n registerInterceptor(interceptor: OrmInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n /**\r\n * Registers a domain event handler.\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n registerDomainEventHandler<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<Extract<E, { type: TType }>, OrmSession<E>>\r\n ): void {\r\n this.domainEvents.on(type, handler);\r\n }\r\n\r\n /**\r\n * Finds an entity by its primary key.\r\n * @template TCtor - The entity constructor type\r\n * @param entityClass - The entity constructor\r\n * @param id - The primary key value\r\n * @returns The entity instance or null if not found\r\n * @throws If entity metadata is not bootstrapped or table has no primary key\r\n */\r\n async find<TCtor extends EntityConstructor<object>>(\r\n entityClass: TCtor,\r\n id: unknown\r\n ): Promise<InstanceType<TCtor> | null> {\r\n const table = getTableDefFromEntity(entityClass);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n const primaryKey = findPrimaryKey(table);\r\n const column = table.columns[primaryKey];\r\n if (!column) {\r\n throw new Error('Entity table does not expose a primary key');\r\n }\r\n const columnSelections = Object.values(table.columns).reduce<Record<string, ColumnDef>>((acc, col) => {\r\n acc[col.name] = col;\r\n return acc;\r\n }, {});\r\n const qb = selectFromEntity(entityClass)\r\n .select(columnSelections)\r\n .where(eq(column, id as string | number))\r\n .limit(1);\r\n const rows = await executeHydrated(this, qb);\r\n return (rows[0] ?? null) as InstanceType<TCtor> | null;\r\n }\r\n\r\n /**\r\n * Finds a single entity using a query builder.\r\n * @template TTable - The table type\r\n * @param qb - The query builder\r\n * @returns The first entity instance or null if not found\r\n */\r\n async findOne<TTable extends TableDef>(qb: SelectQueryBuilder<unknown, TTable>): Promise<EntityInstance<TTable> | null> {\r\n const limited = qb.limit(1);\r\n const rows = await executeHydrated(this, limited);\r\n return rows[0] ?? null;\r\n }\r\n\r\n /**\r\n * Finds multiple entities using a query builder.\r\n * @template TTable - The table type\r\n * @param qb - The query builder\r\n * @returns Array of entity instances\r\n */\r\n async findMany<TTable extends TableDef>(qb: SelectQueryBuilder<unknown, TTable>): Promise<EntityInstance<TTable>[]> {\r\n return executeHydrated(this, qb);\r\n }\r\n\r\n /**\n * Saves an entity graph (root + nested relations) based on a DTO-like payload.\n * @param entityClass - Root entity constructor\n * @param payload - DTO payload containing column values and nested relations\n * @param options - Graph save options\n * @returns The root entity instance\n */\n async saveGraph<TCtor extends EntityConstructor<object>>(\n entityClass: TCtor,\n payload: SaveGraphInputPayload<InstanceType<TCtor>>,\n options?: SaveGraphOptions & { transactional?: boolean }\n ): Promise<InstanceType<TCtor>>;\n async saveGraph<TCtor extends EntityConstructor<object>>(\n entityClass: TCtor,\n payload: Record<string, unknown>,\n options?: SaveGraphOptions & { transactional?: boolean }\n ): Promise<InstanceType<TCtor>> {\n const { transactional = true, ...graphOptions } = options ?? {};\n const execute = () => saveGraphInternal(this, entityClass, payload, graphOptions);\n if (!transactional) {\n return execute();\n }\n return this.transaction(() => execute());\n }\n\r\n /**\r\n * Persists an entity (either inserts or updates).\r\n * @param entity - The entity to persist\r\n * @throws If entity metadata is not bootstrapped\r\n */\r\n async persist(entity: object): Promise<void> {\r\n if (this.unitOfWork.findTracked(entity)) {\r\n return;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const table = getTableDefFromEntity((entity as { constructor: EntityConstructor }).constructor);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n const primaryKey = findPrimaryKey(table);\r\n const pkValue = (entity as Record<string, unknown>)[primaryKey];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n this.trackManaged(table, pkValue, entity);\r\n } else {\r\n this.trackNew(table, entity);\r\n }\r\n }\r\n\r\n /**\r\n * Marks an entity for removal.\r\n * @param entity - The entity to remove\r\n */\r\n async remove(entity: object): Promise<void> {\r\n this.markRemoved(entity);\r\n }\r\n\r\n /**\n * Flushes pending changes to the database without session hooks, relation processing, or domain events.\n */\n async flush(): Promise<void> {\n await this.unitOfWork.flush();\n }\n\r\n /**\r\n * Flushes pending changes with interceptors and relation processing.\r\n */\r\n private async flushWithHooks(): Promise<void> {\r\n for (const interceptor of this.interceptors) {\r\n await interceptor.beforeFlush?.(this);\r\n }\r\n\r\n await this.unitOfWork.flush();\r\n await this.relationChanges.process();\r\n await this.unitOfWork.flush();\r\n\r\n for (const interceptor of this.interceptors) {\r\n await interceptor.afterFlush?.(this);\r\n }\r\n }\r\n\r\n /**\r\n * Commits the current transaction.\r\n */\r\n async commit(): Promise<void> {\r\n await runInTransaction(this.executor, async () => {\r\n await this.flushWithHooks();\r\n });\r\n\r\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n }\r\n\r\n /**\r\n * Executes a function within a transaction.\r\n * @template T - The return type\r\n * @param fn - The function to execute\r\n * @returns The result of the function\r\n * @throws If the transaction fails\r\n */\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n // If the executor can't do transactions, just run and commit once.\r\n if (!this.executor.capabilities.transactions) {\r\n const result = await fn(this);\r\n await this.commit();\r\n return result;\r\n }\r\n\r\n await this.executor.beginTransaction();\r\n try {\r\n const result = await fn(this);\r\n await this.flushWithHooks();\r\n await this.executor.commitTransaction();\r\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n return result;\r\n } catch (err) {\r\n await this.rollback();\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Rolls back the current transaction.\r\n */\r\n async rollback(): Promise<void> {\r\n if (this.executor.capabilities.transactions) {\r\n await this.executor.rollbackTransaction();\r\n }\r\n this.unitOfWork.reset();\r\n this.relationChanges.reset();\r\n }\r\n\r\n /**\r\n * Gets the execution context.\r\n * @returns The execution context\r\n */\r\n getExecutionContext(): ExecutionContext {\r\n return {\r\n dialect: this.orm.dialect,\r\n executor: this.executor,\r\n interceptors: this.orm.interceptors\r\n };\r\n }\r\n\r\n /**\r\n * Gets the hydration context.\r\n * @returns The hydration context\r\n */\r\n getHydrationContext(): HydrationContext<E> {\r\n return {\r\n identityMap: this.identityMap,\r\n unitOfWork: this.unitOfWork,\r\n domainEvents: this.domainEvents,\r\n relationChanges: this.relationChanges,\r\n entityContext: this\r\n };\r\n }\r\n}\r\n\r\nconst buildRelationChangeEntry = (\r\n root: unknown,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<unknown>\r\n): RelationChangeEntry => ({\r\n root,\r\n relationKey,\r\n rootTable,\r\n relationName,\r\n relation,\r\n change\r\n});\r\n\r\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\n\r\nexport interface QueryContext {\r\n sql: string;\r\n params: unknown[];\r\n // maybe metadata like entity type, operation type, etc.\r\n}\r\n\r\nexport type QueryInterceptor = (ctx: QueryContext, next: () => Promise<QueryResult[]>) => Promise<QueryResult[]>;\r\n\r\n/**\r\n * Pipeline for query interceptors.\r\n * Interceptors can wrap query execution to add logging, tracing, caching, etc.\r\n */\r\nexport class InterceptorPipeline {\r\n private interceptors: QueryInterceptor[] = [];\r\n\r\n use(interceptor: QueryInterceptor) {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async run(ctx: QueryContext, executor: DbExecutor): Promise<QueryResult[]> {\r\n let i = 0;\r\n const dispatch = async (): Promise<QueryResult[]> => {\r\n const interceptor = this.interceptors[i++];\r\n if (!interceptor) {\r\n return executor.executeSql(ctx.sql, ctx.params);\r\n }\r\n return interceptor(ctx, dispatch);\r\n };\r\n return dispatch();\r\n }\r\n}\r\n","import type { DomainEvent, OrmDomainEvent } from './runtime-types.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { NamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { InterceptorPipeline } from './interceptor-pipeline.js';\r\nimport { DefaultNamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { OrmSession } from './orm-session.js';\r\n\r\n/**\r\n * Options for creating an ORM instance.\r\n */\r\nexport interface OrmOptions {\r\n /** The database dialect */\r\n dialect: Dialect;\r\n /** The database executor factory */\r\n executorFactory: DbExecutorFactory;\r\n /** Optional interceptors pipeline */\r\n interceptors?: InterceptorPipeline;\r\n /** Optional naming strategy */\r\n namingStrategy?: NamingStrategy;\r\n // model registrations etc.\r\n}\r\n\r\n/**\r\n * Database executor factory interface.\r\n */\r\nexport interface DbExecutorFactory {\r\n /**\r\n * Creates a database executor.\r\n * @returns The database executor\r\n */\r\n createExecutor(): DbExecutor;\r\n\r\n /**\r\n * Creates a transactional database executor.\r\n * @returns The transactional database executor\r\n */\r\n createTransactionalExecutor(): DbExecutor;\r\n\r\n /**\r\n * Disposes any underlying resources (connection pools, background timers, etc).\r\n */\r\n dispose(): Promise<void>;\r\n}\r\n\r\n/**\r\n * ORM (Object-Relational Mapping) main class.\r\n * @template E - The domain event type\r\n */\r\nexport class Orm<E extends DomainEvent = OrmDomainEvent> {\r\n /** The database dialect */\r\n readonly dialect: Dialect;\r\n /** The interceptors pipeline */\r\n readonly interceptors: InterceptorPipeline;\r\n /** The naming strategy */\r\n readonly namingStrategy: NamingStrategy;\r\n private readonly executorFactory: DbExecutorFactory;\r\n\r\n /**\r\n * Creates a new ORM instance.\r\n * @param opts - ORM options\r\n */\r\n constructor(opts: OrmOptions) {\r\n this.dialect = opts.dialect;\r\n this.interceptors = opts.interceptors ?? new InterceptorPipeline();\r\n this.namingStrategy = opts.namingStrategy ?? new DefaultNamingStrategy();\r\n this.executorFactory = opts.executorFactory;\r\n }\r\n\r\n /**\r\n * Creates a new ORM session.\r\n * @param options - Optional session options\r\n * @returns The ORM session\r\n */\r\n createSession(): OrmSession<E> {\r\n // No implicit transaction binding; callers should use Orm.transaction() for transactional work.\r\n const executor = this.executorFactory.createExecutor();\r\n return new OrmSession<E>({ orm: this, executor });\r\n }\r\n\r\n /**\r\n * Executes a function within a transaction.\r\n * @template T - The return type\r\n * @param fn - The function to execute\r\n * @returns The result of the function\r\n * @throws If the transaction fails\r\n */\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n const executor = this.executorFactory.createTransactionalExecutor();\r\n const session = new OrmSession<E>({ orm: this, executor });\r\n try {\r\n // A real transaction scope: begin before running user code, commit/rollback after.\r\n return await session.transaction(() => fn(session));\r\n } finally {\r\n await session.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Shuts down the ORM and releases underlying resources (pools, timers).\r\n */\r\n async dispose(): Promise<void> {\r\n await this.executorFactory.dispose();\r\n }\r\n}\r\n","export type JsonifyScalar<T> = T extends Date ? string : T;\n\n/**\n * Shallow JSON-friendly mapping:\n * - Date -> ISO string\n * - Everything else unchanged\n */\nexport type Jsonify<T> = {\n [K in keyof T]: JsonifyScalar<T[K]>;\n};\n\n/**\n * Creates a shallow, JSON-friendly copy of an object by converting `Date` values to ISO strings.\n * This intentionally does not deep-walk nested objects/relations.\n */\nexport const jsonify = <T extends object>(value: T): Jsonify<T> => {\n const record = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(record)) {\n const entry = record[key];\n result[key] = entry instanceof Date ? entry.toISOString() : entry;\n }\n\n return result as Jsonify<T>;\n};\n\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\n/**\n * Context object provided by standard decorators in newer TypeScript versions.\n */\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n static?: boolean;\n private?: boolean;\n}\n\n/**\n * Dual-mode property decorator that supports both legacy and standard decorator syntax.\n */\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\n/**\n * Dual-mode class decorator that supports both legacy and standard decorator syntax.\n */\nexport interface DualModeClassDecorator {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n <TFunction extends Function>(value: TFunction): void | TFunction;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\n/**\n * Bag for storing decorator metadata during the decoration phase.\n */\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\n/**\n * Checks if a value is a StandardDecoratorContext.\n * @param value - The value to check.\n * @returns True if the value is a StandardDecoratorContext.\n */\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as object);\n};\n\n/**\n * Gets or creates a metadata bag for the given decorator context.\n * @param context - The decorator context.\n * @returns The metadata bag.\n */\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\n/**\n * Reads the metadata bag from the given decorator context.\n * @param context - The decorator context.\n * @returns The metadata bag if present.\n */\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\n/**\n * Reads the metadata bag from a decorated constructor when using standard decorators.\n * @param ctor - The entity constructor.\n * @returns The metadata bag if present.\n */\nexport const readMetadataBagFromConstructor = (ctor: object): DecoratorMetadataBag | undefined => {\n const metadataSymbol = (Symbol as { metadata?: symbol }).metadata;\n if (!metadataSymbol) return undefined;\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\n/**\n * Public helper to read decorator metadata from a class constructor.\n * Standard decorators only; legacy metadata is intentionally ignored.\n * @param ctor - The entity constructor.\n * @returns The metadata bag if present.\n */\nexport const getDecoratorMetadata = (ctor: object): DecoratorMetadataBag | undefined =>\n readMetadataBagFromConstructor(ctor);\n","import { TableHooks } from '../schema/table.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\n/**\n * Options for defining an entity.\n */\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: EntityConstructor<unknown>): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\n/**\n * Class decorator to mark a class as an entity and configure its table mapping.\n * @param options - Configuration options for the entity.\n * @returns A class decorator that registers the entity metadata.\n */\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (meta.columns[entry.propertyName]) {\n throw new Error(\n `Column '${entry.propertyName}' is already defined on entity '${ctor.name}'.`\n );\n }\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n for (const entry of bag.relations) {\n if (meta.relations[entry.propertyName]) {\n throw new Error(\n `Relation '${entry.propertyName}' is already defined on entity '${ctor.name}'.`\n );\n }\n const relationCopy =\n entry.relation.kind === RelationKinds.BelongsToMany\n ? {\n ...entry.relation,\n defaultPivotColumns: entry.relation.defaultPivotColumns\n ? [...entry.relation.defaultPivotColumns]\n : undefined\n }\n : { ...entry.relation };\n addRelationMetadata(ctor, entry.propertyName, relationCopy);\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column-types.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\n/**\n * Options for defining a column in an entity.\n */\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n dialectTypes?: ColumnDef['dialectTypes'];\n notNull?: boolean;\n primary?: boolean;\n tsType?: ColumnDef['tsType'];\n}\n\n/**\n * Input type for column definitions, either as options object or direct ColumnDef.\n */\nexport type ColumnInput = ColumnOptions | ColumnDef;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n dialectTypes: asOptions.dialectTypes ?? asDefinition.dialectTypes,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n tsType: asDefinition.tsType ?? asOptions.tsType,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as { constructor: unknown }).constructor === 'function') {\n return (target as { constructor: unknown }).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n};\n\n/**\n * Decorator to define a column on an entity property.\n * @param definition - The column definition or options.\n * @returns A property decorator that registers the column metadata.\n */\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\n/**\n * Decorator to define a primary key column on an entity property.\n * Sets the primary flag to true and delegates to Column decorator.\n * @param definition - The column definition or options.\n * @returns A property decorator that registers the primary key column metadata.\n */\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\n/**\n * Options for HasMany relation.\n */\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for HasOne relation.\n */\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for BelongsTo relation.\n */\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for BelongsToMany relation.\n */\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as { constructor: new (...args: unknown[]) => unknown }).constructor === 'function') {\n return (instanceOrCtor as { constructor: new (...args: unknown[]) => unknown }).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\n/**\n * Decorator to define a HasMany relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a HasOne relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a BelongsTo relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a BelongsToMany relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","// src/core/execution/db-executor.ts\r\n\r\n// low-level canonical shape\r\nexport type QueryResult = {\r\n columns: string[];\r\n values: unknown[][];\r\n};\r\n\r\nexport interface DbExecutor {\r\n /** Capability flags so the runtime can make correct decisions without relying on optional methods. */\r\n readonly capabilities: {\r\n /** True if begin/commit/rollback are real and should be used to provide atomicity. */\r\n transactions: boolean;\r\n };\r\n\r\n executeSql(sql: string, params?: unknown[]): Promise<QueryResult[]>;\r\n\r\n beginTransaction(): Promise<void>;\r\n commitTransaction(): Promise<void>;\r\n rollbackTransaction(): Promise<void>;\r\n\r\n /** Release any underlying resources (connections, pool leases, etc). Must be idempotent. */\r\n dispose(): Promise<void>;\r\n}\r\n\r\n// --- helpers ---\r\n\r\n/**\r\n * Convert an array of row objects into a QueryResult.\r\n */\r\nexport function rowsToQueryResult(\r\n rows: Array<Record<string, unknown>>\r\n): QueryResult {\r\n if (rows.length === 0) {\r\n return { columns: [], values: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]);\r\n const values = rows.map(row => columns.map(c => row[c]));\r\n return { columns, values };\r\n}\r\n\r\n/**\r\n * Minimal contract that most SQL clients can implement.\r\n */\r\nexport interface SimpleQueryRunner {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n\r\n /** Optional: used to support real transactions. */\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n\r\n /** Optional: release resources (connection close, pool lease release, etc). */\r\n dispose?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Generic factory: turn any SimpleQueryRunner into a DbExecutor.\r\n */\r\nexport function createExecutorFromQueryRunner(\r\n runner: SimpleQueryRunner\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof runner.beginTransaction === 'function' &&\r\n typeof runner.commitTransaction === 'function' &&\r\n typeof runner.rollbackTransaction === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const rows = await runner.query(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.beginTransaction!.call(runner);\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.commitTransaction!.call(runner);\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.rollbackTransaction!.call(runner);\r\n },\r\n async dispose() {\r\n await runner.dispose?.call(runner);\r\n },\r\n };\r\n}\r\n","import type { PoolAdapter, PoolLease, PoolOptions } from './pool-types.js';\r\n\r\n/**\r\n * Node.js Timer with optional unref method (for preventing event loop from staying alive)\r\n */\r\ntype NodeTimer = ReturnType<typeof setInterval> & {\r\n unref?: () => void;\r\n};\r\n\r\ntype Deferred<T> = {\r\n promise: Promise<T>;\r\n resolve: (value: T) => void;\r\n reject: (err: unknown) => void;\r\n};\r\n\r\nconst deferred = <T>(): Deferred<T> => {\r\n let resolve!: (value: T) => void;\r\n let reject!: (err: unknown) => void;\r\n const promise = new Promise<T>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n return { promise, resolve, reject };\r\n};\r\n\r\ntype IdleEntry<T> = {\r\n resource: T;\r\n lastUsedAt: number;\r\n};\r\n\r\nexport class Pool<TResource> {\r\n private readonly adapter: PoolAdapter<TResource>;\r\n private readonly options: Required<Pick<PoolOptions, 'max'>> & PoolOptions;\r\n\r\n private destroyed = false;\r\n private creating = 0;\r\n private leased = 0;\r\n private readonly idle: IdleEntry<TResource>[] = [];\r\n private readonly waiters: Array<Deferred<PoolLease<TResource>>> = [];\r\n private reapTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n constructor(adapter: PoolAdapter<TResource>, options: PoolOptions) {\r\n if (!Number.isFinite(options.max) || options.max <= 0) {\r\n throw new Error('Pool options.max must be a positive number');\r\n }\r\n\r\n this.adapter = adapter;\r\n this.options = { max: options.max, ...options };\r\n\r\n const idleTimeout = this.options.idleTimeoutMillis;\r\n if (idleTimeout && idleTimeout > 0) {\r\n const interval =\r\n this.options.reapIntervalMillis ?? Math.max(1_000, Math.floor(idleTimeout / 2));\r\n this.reapTimer = setInterval(() => {\r\n void this.reapIdle();\r\n }, interval);\r\n\r\n // Best-effort: avoid keeping the event loop alive.\r\n (this.reapTimer as NodeTimer).unref?.();\r\n }\r\n\r\n // Best-effort warmup.\r\n const min = this.options.min ?? 0;\r\n if (min > 0) {\r\n void this.warm(min);\r\n }\r\n }\r\n\r\n /**\r\n * Acquire a resource lease.\r\n * The returned lease MUST be released or destroyed.\r\n */\r\n async acquire(): Promise<PoolLease<TResource>> {\r\n if (this.destroyed) {\r\n throw new Error('Pool is destroyed');\r\n }\r\n\r\n // 1) Prefer idle.\r\n const idle = await this.takeIdleValidated();\r\n if (idle) {\r\n this.leased++;\r\n return this.makeLease(idle);\r\n }\r\n\r\n // 2) Create if capacity allows.\r\n if (this.totalLive() < this.options.max) {\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.leased++;\r\n return this.makeLease(created);\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n\r\n // 3) Wait.\r\n const waiter = deferred<PoolLease<TResource>>();\r\n this.waiters.push(waiter);\r\n\r\n const timeout = this.options.acquireTimeoutMillis;\r\n let timer: NodeTimer | null = null;\r\n if (timeout && timeout > 0) {\r\n timer = setTimeout(() => {\r\n // Remove from queue if still waiting.\r\n const idx = this.waiters.indexOf(waiter);\r\n if (idx >= 0) this.waiters.splice(idx, 1);\r\n waiter.reject(new Error('Pool acquire timeout'));\r\n }, timeout) as NodeTimer;\r\n // Best-effort: avoid keeping the event loop alive.\r\n timer.unref?.();\r\n }\r\n\r\n try {\r\n return await waiter.promise;\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n /** Destroy pool and all idle resources; waits for in-flight creations to settle. */\r\n async destroy(): Promise<void> {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n if (this.reapTimer) {\r\n clearInterval(this.reapTimer);\r\n this.reapTimer = null;\r\n }\r\n\r\n // Reject all waiters.\r\n while (this.waiters.length) {\r\n this.waiters.shift()!.reject(new Error('Pool destroyed'));\r\n }\r\n\r\n // Destroy idle resources.\r\n while (this.idle.length) {\r\n const entry = this.idle.shift()!;\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n\r\n private totalLive(): number {\r\n return this.idle.length + this.leased + this.creating;\r\n }\r\n\r\n private makeLease(resource: TResource): PoolLease<TResource> {\r\n let done = false;\r\n return {\r\n resource,\r\n release: async () => {\r\n if (done) return;\r\n done = true;\r\n await this.releaseResource(resource);\r\n },\r\n destroy: async () => {\r\n if (done) return;\r\n done = true;\r\n await this.destroyResource(resource);\r\n },\r\n };\r\n }\r\n\r\n private async releaseResource(resource: TResource): Promise<void> {\r\n this.leased = Math.max(0, this.leased - 1);\r\n if (this.destroyed) {\r\n await this.adapter.destroy(resource);\r\n return;\r\n }\r\n\r\n // Prefer handing directly to waiters.\r\n const next = this.waiters.shift();\r\n if (next) {\r\n this.leased++;\r\n next.resolve(this.makeLease(resource));\r\n return;\r\n }\r\n\r\n this.idle.push({ resource, lastUsedAt: Date.now() });\r\n await this.trimToMinMax();\r\n }\r\n\r\n private async destroyResource(resource: TResource): Promise<void> {\r\n this.leased = Math.max(0, this.leased - 1);\r\n await this.adapter.destroy(resource);\r\n\r\n // If there are waiters and we have capacity, create a replacement.\r\n if (!this.destroyed && this.waiters.length && this.totalLive() < this.options.max) {\r\n const waiter = this.waiters.shift()!;\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.leased++;\r\n waiter.resolve(this.makeLease(created));\r\n } catch (err) {\r\n waiter.reject(err);\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n }\r\n\r\n private async takeIdleValidated(): Promise<TResource | null> {\r\n while (this.idle.length) {\r\n const entry = this.idle.pop()!;\r\n if (!this.adapter.validate) {\r\n return entry.resource;\r\n }\r\n const ok = await this.adapter.validate(entry.resource);\r\n if (ok) {\r\n return entry.resource;\r\n }\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n return null;\r\n }\r\n\r\n private async reapIdle(): Promise<void> {\r\n if (this.destroyed) return;\r\n const idleTimeout = this.options.idleTimeoutMillis;\r\n if (!idleTimeout || idleTimeout <= 0) return;\r\n\r\n const now = Date.now();\r\n const min = this.options.min ?? 0;\r\n\r\n // Remove expired resources beyond min.\r\n const keep: IdleEntry<TResource>[] = [];\r\n const kill: IdleEntry<TResource>[] = [];\r\n for (const entry of this.idle) {\r\n const expired = now - entry.lastUsedAt >= idleTimeout;\r\n if (expired) kill.push(entry);\r\n else keep.push(entry);\r\n }\r\n\r\n // Keep at least `min`.\r\n while (keep.length < min && kill.length) {\r\n keep.push(kill.pop()!);\r\n }\r\n\r\n this.idle.length = 0;\r\n this.idle.push(...keep);\r\n\r\n for (const entry of kill) {\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n\r\n private async warm(targetMin: number): Promise<void> {\r\n const min = Math.max(0, targetMin);\r\n while (!this.destroyed && this.idle.length < min && this.totalLive() < this.options.max) {\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.idle.push({ resource: created, lastUsedAt: Date.now() });\r\n } catch {\r\n // If warmup fails, stop trying.\r\n break;\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n }\r\n\r\n private async trimToMinMax(): Promise<void> {\r\n const max = this.options.max;\r\n const min = this.options.min ?? 0;\r\n\r\n // Ensure we don't exceed max in idle (best-effort; leased/creating already counted elsewhere).\r\n while (this.totalLive() > max && this.idle.length > min) {\r\n const entry = this.idle.shift();\r\n if (!entry) break;\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n}\r\n","// src/core/execution/executors/postgres-executor.ts\r\nimport {\r\n DbExecutor,\r\n createExecutorFromQueryRunner\r\n} from '../db-executor.js';\r\n\r\nexport interface PostgresClientLike {\r\n query(\r\n text: string,\r\n params?: unknown[]\r\n ): Promise<{ rows: Array<Record<string, unknown>> }>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for PostgreSQL.\r\n * @param client A PostgreSQL client or pool instance.\r\n * @returns A DbExecutor implementation for Postgres.\r\n */\r\nexport function createPostgresExecutor(\r\n client: PostgresClientLike\r\n): DbExecutor {\r\n return createExecutorFromQueryRunner({\r\n async query(sql, params) {\r\n const { rows } = await client.query(sql, params);\r\n return rows;\r\n },\r\n async beginTransaction() {\r\n await client.query('BEGIN');\r\n },\r\n async commitTransaction() {\r\n await client.query('COMMIT');\r\n },\r\n async rollbackTransaction() {\r\n await client.query('ROLLBACK');\r\n },\r\n });\r\n}\r\n","// src/core/execution/executors/mysql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MysqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<[unknown, unknown?]>; // rows, metadata\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for MySQL.\r\n * @param client A MySQL client instance.\r\n * @returns A DbExecutor implementation for MySQL.\r\n */\r\nexport function createMysqlExecutor(\r\n client: MysqlClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commit === 'function' &&\r\n typeof client.rollback === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const [rows] = await client.query(sql, params);\r\n\r\n if (!Array.isArray(rows)) {\r\n // e.g. insert/update returning only headers, treat as no rows\r\n return [{ columns: [], values: [] }];\r\n }\r\n\r\n const result = rowsToQueryResult(\r\n rows as Array<Record<string, unknown>>\r\n );\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commit!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollback!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/sqlite-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface SqliteClientLike {\r\n all(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n run?(sql: string, params?: unknown[]): Promise<unknown>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for SQLite.\r\n * @param client A SQLite client instance.\r\n * @returns A DbExecutor implementation for SQLite.\r\n */\r\nexport function createSqliteExecutor(\r\n client: SqliteClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commitTransaction === 'function' &&\r\n typeof client.rollbackTransaction === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const rows = await client.all(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commitTransaction!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollbackTransaction!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/mssql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MssqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<{ recordset: Array<Record<string, unknown>> }>;\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for Microsoft SQL Server.\r\n * @param client A SQL Server client instance.\r\n * @returns A DbExecutor implementation for MSSQL.\r\n */\r\nexport function createMssqlExecutor(\r\n client: MssqlClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commit === 'function' &&\r\n typeof client.rollback === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const { recordset } = await client.query(sql, params);\r\n const result = rowsToQueryResult(recordset ?? []);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commit!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollback!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tedious integration helper (driver adapter)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface TediousColumn {\r\n metadata: { colName: string };\r\n value: unknown;\r\n}\r\n\r\nexport interface TediousRequest {\r\n addParameter(name: string, type: unknown, value: unknown): void;\r\n on(event: 'row', listener: (columns: TediousColumn[]) => void): void;\r\n}\r\n\r\nexport interface TediousRequestCtor {\r\n new(sql: string, callback: (err?: Error | null) => void): TediousRequest;\r\n}\r\n\r\nexport interface TediousTypes {\r\n NVarChar: unknown;\r\n Int: unknown;\r\n Float: unknown;\r\n BigInt: unknown;\r\n Bit: unknown;\r\n DateTime: unknown;\r\n VarBinary: unknown;\r\n}\r\n\r\nexport interface TediousModule {\r\n Request: TediousRequestCtor;\r\n TYPES: TediousTypes;\r\n}\r\n\r\nexport interface TediousConnectionLike {\r\n execSql(request: TediousRequest): void;\r\n beginTransaction?(cb: (err?: Error | null) => void): void;\r\n commitTransaction?(cb: (err?: Error | null) => void): void;\r\n rollbackTransaction?(cb: (err?: Error | null) => void): void;\r\n}\r\n\r\nexport interface CreateTediousClientOptions {\r\n inferType?(value: unknown, TYPES: TediousTypes): unknown;\r\n}\r\n\r\nconst defaultInferType = (value: unknown, TYPES: TediousTypes): unknown => {\r\n if (value === null || value === undefined) return TYPES.NVarChar;\r\n if (typeof value === 'number') {\r\n return Number.isInteger(value) ? TYPES.Int : TYPES.Float;\r\n }\r\n if (typeof value === 'bigint') return TYPES.BigInt;\r\n if (typeof value === 'boolean') return TYPES.Bit;\r\n if (value instanceof Date) return TYPES.DateTime;\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\r\n return TYPES.VarBinary;\r\n }\r\n return TYPES.NVarChar;\r\n};\r\n\r\nexport function createTediousMssqlClient(\r\n connection: TediousConnectionLike,\r\n { Request, TYPES }: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): MssqlClientLike {\r\n const inferType = options?.inferType ?? defaultInferType;\r\n\r\n return {\r\n async query(sql: string, params: unknown[] = []) {\r\n const rows = await new Promise<Array<Record<string, unknown>>>(\r\n (resolve, reject) => {\r\n const collected: Record<string, unknown>[] = [];\r\n\r\n const request = new Request(sql, err => {\r\n if (err) return reject(err);\r\n resolve(collected);\r\n });\r\n\r\n params.forEach((value, idx) => {\r\n const sqlType = inferType(value, TYPES);\r\n request.addParameter(\r\n `p${idx + 1}`,\r\n sqlType,\r\n value as unknown\r\n );\r\n });\r\n\r\n request.on('row', cols => {\r\n const row: Record<string, unknown> = {};\r\n for (const col of cols) {\r\n row[col.metadata.colName] = col.value;\r\n }\r\n collected.push(row);\r\n });\r\n\r\n connection.execSql(request);\r\n }\r\n );\r\n\r\n return { recordset: rows };\r\n },\r\n\r\n beginTransaction: connection.beginTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.beginTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n commit: connection.commitTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.commitTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n rollback: connection.rollbackTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.rollbackTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n };\r\n}\r\n\r\nexport function createTediousExecutor(\r\n connection: TediousConnectionLike,\r\n module: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): DbExecutor {\r\n const client = createTediousMssqlClient(connection, module, options);\r\n return createMssqlExecutor(client);\r\n}\r\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { rowsToQueryResult } from '../core/execution/db-executor.js';\r\nimport type { Pool } from '../core/execution/pooling/pool.js';\r\nimport type { DbExecutorFactory } from './orm.js';\r\n\r\nexport interface PooledConnectionAdapter<TConn> {\r\n query(\r\n conn: TConn,\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n\r\n beginTransaction(conn: TConn): Promise<void>;\r\n commitTransaction(conn: TConn): Promise<void>;\r\n rollbackTransaction(conn: TConn): Promise<void>;\r\n}\r\n\r\ntype PooledExecutorFactoryOptions<TConn> = {\r\n pool: Pool<TConn>;\r\n adapter: PooledConnectionAdapter<TConn>;\r\n};\r\n\r\n/**\r\n * Creates a first-class DbExecutorFactory backed by MetalORM's Pool.\r\n *\r\n * Design goals:\r\n * - No leaks by default: pool leases are always released in `finally`.\r\n * - Correct transactions: one leased connection per transaction.\r\n * - Session-friendly: createExecutor() supports transactions without permanently leasing a connection.\r\n */\r\nexport function createPooledExecutorFactory<TConn>(\r\n opts: PooledExecutorFactoryOptions<TConn>\r\n): DbExecutorFactory {\r\n const { pool, adapter } = opts;\r\n\r\n const makeExecutor = (mode: 'session' | 'sticky'): DbExecutor => {\r\n let lease: Awaited<ReturnType<typeof pool.acquire>> | null = null;\r\n\r\n const getLease = async () => {\r\n if (lease) return lease;\r\n lease = await pool.acquire();\r\n return lease;\r\n };\r\n\r\n const executeWithConn = async (\r\n conn: TConn,\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<QueryResult[]> => {\r\n const rows = await adapter.query(conn, sql, params);\r\n return [rowsToQueryResult(rows)];\r\n };\r\n\r\n return {\r\n capabilities: { transactions: true },\r\n\r\n async executeSql(sql, params) {\r\n // Sticky mode: always reuse a leased connection.\r\n if (mode === 'sticky') {\r\n const l = await getLease();\r\n return executeWithConn(l.resource, sql, params);\r\n }\r\n\r\n // Session mode: use the leased connection if we're currently in a transaction;\r\n // otherwise acquire/release per call.\r\n if (lease) {\r\n return executeWithConn(lease.resource, sql, params);\r\n }\r\n\r\n const l = await pool.acquire();\r\n try {\r\n return await executeWithConn(l.resource, sql, params);\r\n } finally {\r\n await l.release();\r\n }\r\n },\r\n\r\n async beginTransaction() {\r\n const l = await getLease();\r\n await adapter.beginTransaction(l.resource);\r\n },\r\n\r\n async commitTransaction() {\r\n if (!lease) {\r\n throw new Error('commitTransaction called without an active transaction');\r\n }\r\n const l = lease;\r\n try {\r\n await adapter.commitTransaction(l.resource);\r\n } finally {\r\n lease = null;\r\n await l.release();\r\n }\r\n },\r\n\r\n async rollbackTransaction() {\r\n if (!lease) {\r\n // Nothing to rollback; keep idempotent semantics.\r\n return;\r\n }\r\n const l = lease;\r\n try {\r\n await adapter.rollbackTransaction(l.resource);\r\n } finally {\r\n lease = null;\r\n await l.release();\r\n }\r\n },\r\n\r\n async dispose() {\r\n if (!lease) return;\r\n const l = lease;\r\n lease = null;\r\n await l.release();\r\n },\r\n };\r\n };\r\n\r\n return {\r\n createExecutor() {\r\n return makeExecutor('session');\r\n },\r\n createTransactionalExecutor() {\r\n return makeExecutor('sticky');\r\n },\r\n async dispose() {\r\n await pool.destroy();\r\n },\r\n };\r\n}\r\n\r\n"],"mappings":"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","names":["col","lower","length","col","left","right","lower","upper","col","col","col","col","registry","upper","left","right","lower","col","fn","col","col","fn","left","right","col","col","left","right","col","col","col","col","col","col","tableRef","col","state","hydration","relationSelectionResult","tableRef","col","col","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasOne","hasMany","belongsTo","col","sub","col","isTableSourceNode","col","col","col","executeSchemaPlan","col","columnNode","col","toOperand","length","count","toOperandNode","fn","tableNode","columnNode","combineConditions","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","assertNever","col","sel","left","right","fn","lower","upper","EntityStatus","toKey","col","fn","fn","normalizePropertyName","resolveConstructor","propertyName","min","now","max","col","l"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/ddl/schema-plan-executor.ts","../src/schema/table.ts","../src/schema/column-types.ts","../src/schema/relation.ts","../src/core/ast/expression-nodes.ts","../src/core/ast/expression-builders.ts","../src/core/ast/window-functions.ts","../src/core/sql/sql.ts","../src/core/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/core/ast/adapters.ts","../src/core/ast/builders.ts","../src/core/functions/function-registry.ts","../src/core/functions/definitions/helpers.ts","../src/core/functions/definitions/aggregate.ts","../src/core/functions/definitions/string.ts","../src/core/functions/definitions/datetime.ts","../src/core/functions/definitions/numeric.ts","../src/core/functions/definitions/control-flow.ts","../src/core/functions/definitions/json.ts","../src/core/functions/group-concat-helpers.ts","../src/core/functions/standard-strategy.ts","../src/core/functions/standard-table-strategy.ts","../src/core/dialect/abstract.ts","../src/core/dialect/base/function-table-formatter.ts","../src/core/dialect/base/pagination-strategy.ts","../src/core/dialect/base/cte-compiler.ts","../src/core/dialect/base/returning-strategy.ts","../src/core/dialect/base/join-compiler.ts","../src/core/dialect/base/groupby-compiler.ts","../src/core/dialect/base/orderby-compiler.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/postgres/functions.ts","../src/core/dialect/postgres/table-functions.ts","../src/core/dialect/postgres/index.ts","../src/core/dialect/mysql/functions.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/sqlite/functions.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/mssql/functions.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/dialect-factory.ts","../src/query-builder/select-query-state.ts","../src/core/ast/join-node.ts","../src/query-builder/hydration-manager.ts","../src/query-builder/relation-alias.ts","../src/query-builder/relation-utils.ts","../src/query-builder/hydration-planner.ts","../src/query-builder/raw-column-parser.ts","../src/query-builder/query-ast-service.ts","../src/query-builder/relation-projection-helper.ts","../src/query-builder/relation-conditions.ts","../src/core/ast/join-metadata.ts","../src/query-builder/relation-service.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/query-builder/select-query-builder-deps.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.ts","../src/orm/relations/has-one.ts","../src/orm/relations/belongs-to.ts","../src/orm/relations/many-to-many.ts","../src/orm/lazy-batch.ts","../src/orm/entity.ts","../src/orm/execute.ts","../src/query-builder/query-resolution.ts","../src/query-builder/select.ts","../src/schema/table-guards.ts","../src/orm/entity-metadata.ts","../src/decorators/bootstrap.ts","../src/query-builder/select-helpers.ts","../src/query-builder/insert-query-state.ts","../src/query-builder/insert.ts","../src/query-builder/update-query-state.ts","../src/query-builder/update.ts","../src/query-builder/delete-query-state.ts","../src/query-builder/delete.ts","../src/core/ddl/sql-writing.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/naming-strategy.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/catalogs/postgres.ts","../src/core/ddl/introspect/run-select.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/catalogs/mysql.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/catalogs/mssql.ts","../src/core/functions/text.ts","../src/core/ddl/introspect/functions/mssql.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/introspect/registry.ts","../src/core/ddl/schema-introspect.ts","../src/core/functions/numeric.ts","../src/core/functions/datetime.ts","../src/core/functions/control-flow.ts","../src/core/functions/json.ts","../src/core/functions/array.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/naming-strategy.ts","../src/codegen/typescript.ts","../src/orm/identity-map.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/domain-event-bus.ts","../src/orm/relation-change-processor.ts","../src/orm/query-logger.ts","../src/orm/transaction-runner.ts","../src/orm/save-graph.ts","../src/orm/orm-session.ts","../src/orm/interceptor-pipeline.ts","../src/orm/orm.ts","../src/orm/jsonify.ts","../src/decorators/decorator-metadata.ts","../src/decorators/entity.ts","../src/decorators/column-decorator.ts","../src/decorators/relations.ts","../src/core/execution/db-executor.ts","../src/core/execution/pooling/pool.ts","../src/core/execution/executors/postgres-executor.ts","../src/core/execution/executors/mysql-executor.ts","../src/core/execution/executors/sqlite-executor.ts","../src/core/execution/executors/mssql-executor.ts","../src/orm/pooled-executor-factory.ts"],"sourcesContent":["import { DbExecutor } from '../execution/db-executor.js';\nimport type { SchemaPlan, SynchronizeOptions } from './schema-diff.js';\n\n/**\n * Executes a schema plan by running the SQL statements.\n * @param plan - The schema plan to execute.\n * @param executor - The database executor.\n * @param options - Options for synchronization.\n */\nexport const executeSchemaPlan = async (\n plan: SchemaPlan,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<void> => {\n for (const change of plan.changes) {\n if (!change.statements.length) continue;\n if (!change.safe && !options.allowDestructive) continue;\n for (const stmt of change.statements) {\n if (!stmt.trim()) continue;\n await executor.executeSql(stmt);\n }\n }\n};\n","import type { ColumnDef } from './column-types.js';\r\nimport type { RelationDef } from './relation.js';\r\n\r\nexport interface IndexColumn {\r\n column: string;\r\n order?: 'ASC' | 'DESC';\r\n nulls?: 'FIRST' | 'LAST';\r\n}\r\n\r\nexport interface IndexDef {\r\n name?: string;\r\n columns: (string | IndexColumn)[];\r\n unique?: boolean;\r\n where?: string;\r\n}\r\n\r\nexport interface CheckConstraint {\r\n name?: string;\r\n expression: string;\r\n}\r\n\r\nexport interface TableOptions {\r\n schema?: string;\r\n primaryKey?: string[];\r\n indexes?: IndexDef[];\r\n checks?: CheckConstraint[];\r\n comment?: string;\r\n engine?: string;\r\n charset?: string;\r\n collation?: string;\r\n}\r\n\r\nexport interface TableHooks {\r\n beforeInsert?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterInsert?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n beforeUpdate?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterUpdate?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n beforeDelete?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: unknown): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Definition of a database table with its columns and relationships\r\n * @typeParam T - Type of the columns record\r\n */\r\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\r\n /** Name of the table */\r\n name: string;\r\n /** Optional schema/catalog name */\r\n schema?: string;\r\n /** Record of column definitions keyed by column name */\r\n columns: T;\r\n /** Record of relationship definitions keyed by relation name */\r\n relations: Record<string, RelationDef>;\r\n /** Optional lifecycle hooks */\r\n hooks?: TableHooks;\r\n /** Composite primary key definition (falls back to column.primary flags) */\r\n primaryKey?: string[];\r\n /** Secondary indexes */\r\n indexes?: IndexDef[];\r\n /** Table-level check constraints */\r\n checks?: CheckConstraint[];\r\n /** Table comment/description */\r\n comment?: string;\r\n /** Dialect-specific options */\r\n engine?: string;\r\n charset?: string;\r\n collation?: string;\r\n}\r\n\r\n/**\r\n * Creates a table definition with columns and relationships\r\n * @typeParam T - Type of the columns record\r\n * @param name - Name of the table\r\n * @param columns - Record of column definitions\r\n * @param relations - Record of relationship definitions (optional)\r\n * @returns Complete table definition with runtime-filled column metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * const usersTable = defineTable('users', {\r\n * id: col.primaryKey(col.int()),\r\n * name: col.varchar(255),\r\n * email: col.varchar(255)\r\n * });\r\n * ```\r\n */\r\nexport const defineTable = <T extends Record<string, ColumnDef>>(\r\n name: string,\r\n columns: T,\r\n relations: Record<string, RelationDef> = {},\r\n hooks?: TableHooks,\r\n options: TableOptions = {}\r\n): TableDef<T> => {\r\n // Runtime mutability to assign names to column definitions for convenience\r\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\r\n const colDef = { ...def, name: key, table: name };\r\n (acc as Record<string, unknown>)[key] = colDef;\r\n return acc;\r\n }, {} as T);\r\n\r\n return {\r\n name,\r\n schema: options.schema,\r\n columns: colsWithNames,\r\n relations,\r\n hooks,\r\n primaryKey: options.primaryKey,\r\n indexes: options.indexes,\r\n checks: options.checks,\r\n comment: options.comment,\r\n engine: options.engine,\r\n charset: options.charset,\r\n collation: options.collation\r\n };\r\n};\r\n\r\ntype DirectColumnKeys<T extends TableDef> =\r\n Exclude<keyof T[\"columns\"] & string, keyof T | \"$\">;\r\n\r\nexport type TableRef<T extends TableDef> =\r\n T &\r\n { [K in DirectColumnKeys<T>]: T[\"columns\"][K] } & {\r\n /**\r\n * Escape hatch for collisions:\r\n * - tref.name => table name (string)\r\n * - tref.$.name => column def for \"name\"\r\n */\r\n $: T[\"columns\"];\r\n };\r\n\r\nconst TABLE_REF_CACHE: WeakMap<object, unknown> = new WeakMap();\r\n\r\nconst withColumnProps = <T extends TableDef>(table: T): TableRef<T> => {\r\n const cached = TABLE_REF_CACHE.get(table);\r\n if (cached) return cached as TableRef<T>;\r\n\r\n const proxy = new Proxy(table as object, {\r\n get(target, prop, receiver) {\r\n const t = target as TableDef;\r\n if (prop === \"$\") return t.columns;\r\n\r\n // Prefer real table fields first (prevents collision surprises)\r\n if (Reflect.has(target, prop)) return Reflect.get(target, prop, receiver);\r\n\r\n // Fall back to columns bag\r\n if (typeof prop === \"string\" && prop in t.columns) return t.columns[prop];\r\n\r\n return undefined;\r\n },\r\n\r\n has(target, prop) {\r\n const t = target as TableDef;\r\n return (\r\n prop === \"$\" ||\r\n Reflect.has(target, prop) ||\r\n (typeof prop === \"string\" && prop in t.columns)\r\n );\r\n },\r\n\r\n ownKeys(target) {\r\n const t = target as TableDef;\r\n const base = Reflect.ownKeys(target);\r\n const cols = Object.keys(t.columns);\r\n\r\n for (const k of cols) {\r\n if (!base.includes(k)) base.push(k);\r\n }\r\n if (!base.includes(\"$\")) base.push(\"$\");\r\n return base;\r\n },\r\n\r\n getOwnPropertyDescriptor(target, prop) {\r\n if (prop === \"$\") {\r\n return {\r\n configurable: true,\r\n enumerable: false,\r\n get() {\r\n return (target as TableDef).columns;\r\n },\r\n };\r\n }\r\n\r\n if (\r\n typeof prop === \"string\" &&\r\n prop in (target as TableDef).columns &&\r\n !Reflect.has(target, prop)\r\n ) {\r\n return {\r\n configurable: true,\r\n enumerable: true,\r\n value: (target as TableDef).columns[prop],\r\n writable: false,\r\n };\r\n }\r\n\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n }) as TableRef<T>;\r\n\r\n TABLE_REF_CACHE.set(table, proxy);\r\n return proxy;\r\n};\r\n\r\n/**\r\n * Public API: opt-in ergonomic table reference.\r\n * Usage:\r\n * const t = tableRef(todos);\r\n * qb.where(eq(t.done, false)).orderBy(t.id, \"ASC\");\r\n * Collisions:\r\n * t.name is the table name (real field)\r\n * t.$.name is the \"name\" column (escape hatch)\r\n */\r\nexport const tableRef = <T extends TableDef>(table: T): TableRef<T> => withColumnProps(table);\r\n\r\n/**\r\n * Public API: dynamic column lookup by string key.\r\n *\r\n * Useful when the column name is only known at runtime, or when a column name\r\n * collides with a real table field (e.g. \"name\").\r\n *\r\n * @example\r\n * ```ts\r\n * const t = tableRef(todos);\r\n * const key = runtimeKey();\r\n * where(eq(getColumn(t, key), 123));\r\n * // or: t.$.name (escape hatch)\r\n * ```\r\n */\r\nexport function getColumn<T extends TableDef, K extends keyof T['columns'] & string>(table: T, key: K): T['columns'][K];\r\nexport function getColumn<T extends TableDef>(table: T, key: string): ColumnDef;\r\nexport function getColumn<T extends TableDef>(table: T, key: string): ColumnDef {\r\n const col = table.columns[key] as ColumnDef | undefined;\r\n if (!col) {\r\n const tableName = table.name || '<unknown>';\r\n throw new Error(`Column '${key}' does not exist on table '${tableName}'`);\r\n }\r\n return col;\r\n}\r\n","/**\r\n * Canonical, dialect-agnostic column data types.\r\n * Keep this intentionally small; dialect-specific names should be expressed via `dialectTypes`.\r\n */\r\nexport const STANDARD_COLUMN_TYPES = [\r\n 'INT',\r\n 'INTEGER',\r\n 'BIGINT',\r\n 'VARCHAR',\r\n 'TEXT',\r\n 'JSON',\r\n 'ENUM',\r\n 'DECIMAL',\r\n 'FLOAT',\r\n 'DOUBLE',\r\n 'UUID',\r\n 'BINARY',\r\n 'VARBINARY',\r\n 'BLOB',\r\n 'DATE',\r\n 'DATETIME',\r\n 'TIMESTAMP',\r\n 'TIMESTAMPTZ',\r\n 'BOOLEAN'\r\n] as const;\r\n\r\n/** Known logical types the ORM understands. */\r\nexport type StandardColumnType = (typeof STANDARD_COLUMN_TYPES)[number];\r\n\r\n/**\r\n * Column type value.\r\n * We allow arbitrary strings so new/dialect-specific types don't require touching this module.\r\n */\r\nexport type ColumnType = StandardColumnType | (string & {});\r\n\r\nconst STANDARD_TYPE_SET = new Set<string>(STANDARD_COLUMN_TYPES.map(t => t.toLowerCase()));\r\n\r\n/**\r\n * Normalizes a column type to its canonical lowercase form when it's one of the known logical types.\r\n * Unknown/custom types are returned untouched to avoid clobbering dialect-specific casing.\r\n */\r\nexport const normalizeColumnType = (type: ColumnType): ColumnType => {\r\n if (typeof type !== 'string') return type;\r\n const lower = type.toLowerCase();\r\n return STANDARD_TYPE_SET.has(lower) ? lower : type;\r\n};\r\n\r\n/**\r\n * Renders a raw SQL type name with optional parameters.\r\n */\r\nexport const renderTypeWithArgs = (sqlType: string, args?: unknown[]): string => {\r\n if (!args || args.length === 0) return sqlType;\r\n return `${sqlType}(${args.join(', ')})`;\r\n};\r\n\r\nexport type ReferentialAction =\r\n | 'NO ACTION'\r\n | 'RESTRICT'\r\n | 'CASCADE'\r\n | 'SET NULL'\r\n | 'SET DEFAULT';\r\n\r\nexport interface RawDefaultValue {\r\n raw: string;\r\n}\r\n\r\nexport type DefaultValue = unknown | RawDefaultValue;\r\n\r\nexport interface ForeignKeyReference {\r\n /** Target table name */\r\n table: string;\r\n /** Target column name */\r\n column: string;\r\n /** Optional constraint name */\r\n name?: string;\r\n /** ON DELETE action */\r\n onDelete?: ReferentialAction;\r\n /** ON UPDATE action */\r\n onUpdate?: ReferentialAction;\r\n /** Whether the constraint is deferrable (Postgres) */\r\n deferrable?: boolean;\r\n}\r\n\r\n/**\r\n * Definition of a database column\r\n */\r\nexport interface ColumnDef<T extends ColumnType = ColumnType, TRuntime = unknown> {\r\n /** Column name (filled at runtime by defineTable) */\r\n name: string;\r\n /** Data type of the column */\r\n type: T;\r\n /** Optional explicit SQL type per dialect (e.g., { postgres: 'bytea' }) */\r\n dialectTypes?: Partial<Record<string, string>>;\r\n /** Optional override for the inferred TypeScript type */\r\n tsType?: TRuntime;\r\n /** Whether this column is a primary key */\r\n primary?: boolean;\r\n /** Whether this column cannot be null */\r\n notNull?: boolean;\r\n /** Whether this column must be unique (or name of the unique constraint) */\r\n unique?: boolean | string;\r\n /** Default value for the column */\r\n default?: DefaultValue;\r\n /** Whether the column auto-increments / identity */\r\n autoIncrement?: boolean;\r\n /** Identity strategy where supported */\r\n generated?: 'always' | 'byDefault';\r\n /** Inline check constraint expression */\r\n check?: string;\r\n /** Foreign key reference */\r\n references?: ForeignKeyReference;\r\n /** Column comment/description */\r\n comment?: string;\r\n /** Additional arguments for the column type (e.g., VARCHAR length) */\r\n args?: unknown[];\r\n /** Table name this column belongs to (filled at runtime by defineTable) */\r\n table?: string;\r\n}\r\n\r\n/**\r\n * Factory for creating column definitions with common data types\r\n */\r\nexport const col = {\r\n /**\r\n * Creates an integer column definition\r\n * @returns ColumnDef with INT type\r\n */\r\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\r\n\r\n /**\r\n * Creates a big integer column definition\r\n */\r\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\r\n\r\n /**\r\n * Creates a variable character column definition\r\n * @param length - Maximum length of the string\n * @returns ColumnDef with VARCHAR type\n */\n varchar: (length: number): ColumnDef<'VARCHAR'> => ({ name: '', type: 'VARCHAR', args: [length] }),\n\n /**\n * Creates a text column definition\n */\n text: (): ColumnDef<'TEXT'> => ({ name: '', type: 'TEXT' }),\n\n /**\n * Creates a fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\r\n type: 'DECIMAL',\r\n args: [precision, scale]\r\n }),\r\n\r\n /**\r\n * Creates a floating point column definition\r\n */\r\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\r\n name: '',\r\n type: 'FLOAT',\r\n args: precision !== undefined ? [precision] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a UUID column definition\r\n */\r\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\r\n\r\n /**\r\n * Creates a binary large object column definition\r\n */\r\n blob: (): ColumnDef<'BLOB'> => ({ name: '', type: 'BLOB' }),\r\n\r\n /**\r\n * Creates a fixed-length binary column definition\r\n */\r\n binary: (length?: number): ColumnDef<'BINARY'> => ({\r\n name: '',\r\n type: 'BINARY',\r\n args: length !== undefined ? [length] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a variable-length binary column definition\r\n */\r\n varbinary: (length?: number): ColumnDef<'VARBINARY'> => ({\r\n name: '',\r\n type: 'VARBINARY',\r\n args: length !== undefined ? [length] : undefined\r\n }),\r\n\r\n /**\r\n * Creates a Postgres bytea column definition\r\n */\r\n bytea: (): ColumnDef<'BYTEA'> => ({\r\n name: '',\r\n type: 'BYTEA'\r\n }),\r\n\r\n /**\r\n * Creates a timestamp column definition\r\n */\r\n timestamp: <TRuntime = string>(): ColumnDef<'TIMESTAMP', TRuntime> => ({ name: '', type: 'TIMESTAMP' }),\r\n\r\n /**\r\n * Creates a timestamptz column definition\r\n */\r\n timestamptz: <TRuntime = string>(): ColumnDef<'TIMESTAMPTZ', TRuntime> => ({ name: '', type: 'TIMESTAMPTZ' }),\r\n\r\n /**\r\n * Creates a date column definition\r\n */\r\n date: <TRuntime = string>(): ColumnDef<'DATE', TRuntime> => ({ name: '', type: 'DATE' }),\r\n\r\n /**\r\n * Creates a datetime column definition\r\n */\r\n datetime: <TRuntime = string>(): ColumnDef<'DATETIME', TRuntime> => ({ name: '', type: 'DATETIME' }),\r\n\r\n /**\r\n * Creates a JSON column definition\r\n * @returns ColumnDef with JSON type\r\n */\r\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\r\n\r\n /**\r\n * Creates a boolean column definition\r\n * @returns ColumnDef with BOOLEAN type\r\n */\r\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\r\n\r\n /**\r\n * Creates an enum column definition\r\n * @param values - Enum values\r\n */\r\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\r\n\r\n /**\r\n * Creates a column definition with a custom SQL type.\r\n * Useful for dialect-specific types without polluting the standard set.\r\n */\r\n custom: (type: string, opts: { dialect?: string; args?: unknown[]; tsType?: unknown } = {}): ColumnDef => ({\r\n name: '',\r\n type,\r\n args: opts.args,\r\n tsType: opts.tsType,\r\n dialectTypes: opts.dialect ? { [opts.dialect]: type } : undefined\r\n }),\r\n\r\n /**\r\n * Marks a column definition as a primary key\r\n * @param def - Column definition to modify\r\n * @returns Modified ColumnDef with primary: true\r\n */\r\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\r\n ({ ...def, primary: true }),\r\n\r\n /**\r\n * Marks a column as NOT NULL\r\n */\r\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\r\n ({ ...def, notNull: true }),\r\n\r\n /**\r\n * Marks a column as UNIQUE\r\n */\r\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n unique: name ?? true\r\n }),\r\n\r\n /**\r\n * Sets a default value for the column\r\n */\r\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n default: value\r\n }),\r\n\r\n /**\r\n * Sets a raw SQL default value for the column\r\n */\r\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n default: { raw: expression }\r\n }),\r\n\r\n /**\r\n * Marks a column as auto-increment / identity\r\n */\r\n autoIncrement: <T extends ColumnType>(\r\n def: ColumnDef<T>,\r\n strategy: ColumnDef['generated'] = 'byDefault'\r\n ): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n autoIncrement: true,\r\n generated: strategy\r\n }),\r\n\r\n /**\r\n * Adds a foreign key reference\r\n */\r\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n references: ref\r\n }),\r\n\r\n /**\r\n * Adds a check constraint to the column\r\n */\r\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\r\n ({\r\n ...def,\r\n check: expression\r\n })\r\n};\r\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator, BitwiseOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a reference to a SELECT alias (for ORDER BY / GROUP BY).\r\n */\r\nexport interface AliasRefNode {\r\n type: 'AliasRef';\r\n /** Alias name to reference */\r\n name: string;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\r\n type: 'Column';\r\n /** Table name the column belongs to */\r\n table: string;\r\n /** Column name */\r\n name: string;\r\n /** Optional alias for the column */\r\n alias?: string;\r\n /** Optional scope marker (e.g., 'outer' for correlated references) */\r\n scope?: 'outer' | 'default';\r\n}\r\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\r\n type: 'Function';\r\n /** Function name (e.g., COUNT, SUM) */\r\n name: string;\r\n /** Optional canonical function key for dialect-aware rendering */\r\n fn?: string;\r\n /** Function arguments */\r\n args: OperandNode[];\r\n /** Optional alias for the function result */\r\n alias?: string;\r\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\r\n orderBy?: OrderByNode[];\r\n /** Optional separator argument used by GROUP_CONCAT-like functions */\r\n separator?: OperandNode;\r\n /** Optional DISTINCT modifier */\r\n distinct?: boolean;\r\n}\r\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\nexport type InExpressionRight = OperandNode[] | ScalarSubqueryNode;\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CAST expression (CAST(value AS type)).\r\n */\r\nexport interface CastExpressionNode {\r\n type: 'Cast';\r\n /** Expression being cast */\r\n expression: OperandNode;\r\n /** SQL type literal, e.g. \"varchar(255)\" */\r\n castType: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a COLLATE expression (expression COLLATE collationName).\r\n */\r\nexport interface CollateExpressionNode {\r\n type: 'Collate';\r\n /** Expression to be collated */\r\n expression: OperandNode;\r\n /** Collation name */\r\n collation: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing an arithmetic expression (e.g., a + b)\r\n */\r\nexport interface ArithmeticExpressionNode {\r\n type: 'ArithmeticExpression';\r\n left: OperandNode;\r\n operator: '+' | '-' | '*' | '/';\r\n right: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | AliasRefNode\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | CastExpressionNode\r\n | WindowFunctionNode\r\n | ArithmeticExpressionNode\r\n | BitwiseExpressionNode\r\n | CollateExpressionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'AliasRef',\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'Cast',\r\n 'WindowFunction',\r\n 'ArithmeticExpression',\r\n 'BitwiseExpression',\r\n 'Collate'\r\n]);\r\n\r\nconst hasTypeProperty = (value: unknown): value is { type?: string } =>\r\n typeof value === 'object' && value !== null && 'type' in value;\r\n\r\nexport const isOperandNode = (node: unknown): node is OperandNode => {\r\n if (!hasTypeProperty(node)) return false;\r\n return operandTypes.has(node.type as OperandNode['type']);\r\n};\r\n\r\nexport const isFunctionNode = (node: unknown): node is FunctionNode =>\r\n isOperandNode(node) && node.type === 'Function';\r\nexport const isCaseExpressionNode = (node: unknown): node is CaseExpressionNode =>\r\n isOperandNode(node) && node.type === 'CaseExpression';\r\n\r\nexport const isCastExpressionNode = (node: unknown): node is CastExpressionNode =>\r\n isOperandNode(node) && node.type === 'Cast';\r\nexport const isCollateExpressionNode = (node: unknown): node is CollateExpressionNode =>\r\n isOperandNode(node) && node.type === 'Collate';\r\nexport const isWindowFunctionNode = (node: unknown): node is WindowFunctionNode =>\r\n isOperandNode(node) && node.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnRef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(node) || isCastExpressionNode(node) || isWindowFunctionNode(node);\r\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a bitwise expression (e.g., a & b)\r\n */\r\nexport interface BitwiseExpressionNode {\r\n type: 'BitwiseExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Bitwise operator */\r\n operator: BitwiseOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: InExpressionRight;\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode\r\n | ArithmeticExpressionNode\r\n | BitwiseExpressionNode;\r\n","import { SelectQueryNode } from './query.js';\r\nimport { SqlOperator, BitwiseOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\nimport {\r\n ColumnNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n CastExpressionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n InExpressionRight,\r\n ScalarSubqueryNode,\r\n BetweenExpressionNode,\r\n isOperandNode,\r\n AliasRefNode,\r\n ArithmeticExpressionNode,\r\n BitwiseExpressionNode,\r\n CollateExpressionNode\r\n} from './expression-nodes.js';\r\n\r\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Type guard to check if a value is a literal value\r\n */\r\nconst isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\n\r\n/**\r\n * Converts a primitive value to a LiteralNode\r\n */\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\n/**\r\n * Converts a ColumnRef to a ColumnNode\r\n * @throws Error if the ColumnRef doesn't have a table specified\r\n */\r\nconst columnRefToNode = (col: ColumnRef): ColumnNode => {\r\n if (!col.table) {\r\n throw new Error(\r\n `Column \"${col.name}\" requires a table reference. ` +\r\n `Use columnOperand with a fully qualified ColumnRef or ColumnNode.`\r\n );\r\n }\r\n return { type: 'Column', table: col.table, name: col.name };\r\n};\r\n\r\n/**\r\n * Unified conversion function: converts any valid input to an OperandNode\r\n * @param value - Value to convert (OperandNode, ColumnRef, or literal value)\r\n * @returns OperandNode representing the value\r\n */\r\nconst toOperandNode = (value: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n // Already an operand node\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n // Literal value\r\n if (isLiteralValue(value)) {\r\n return toLiteralNode(value);\r\n }\r\n\r\n // Must be ColumnRef\r\n return columnRefToNode(value as ColumnRef);\r\n};\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n return toLiteralNode(value);\r\n};\r\n\r\n/**\r\n * Converts various input types to an OperandNode\r\n */\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => toOperandNode(val);\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nexport type SelectQueryInput = SelectQueryNode | { getAST(): SelectQueryNode };\r\n\r\nconst hasQueryAst = (value: SelectQueryInput): value is { getAST(): SelectQueryNode } =>\r\n typeof (value as { getAST?: unknown }).getAST === 'function';\r\n\r\nconst resolveSelectQueryNode = (query: SelectQueryInput): SelectQueryNode =>\r\n hasQueryAst(query) ? query.getAST() : query;\r\n\r\nconst toScalarSubqueryNode = (query: SelectQueryInput): ScalarSubqueryNode => ({\r\n type: 'ScalarSubquery',\r\n query: resolveSelectQueryNode(query)\r\n});\r\n\r\n/**\r\n * Converts a ColumnRef or ColumnNode to a ColumnNode\r\n * @param col - Column reference or node\r\n * @returns ColumnNode\r\n * @throws Error if ColumnRef doesn't have a table specified\r\n */\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => {\r\n if (isOperandNode(col) && col.type === 'Column') {\r\n return col;\r\n }\r\n return columnRefToNode(col as ColumnRef);\r\n};\r\n\r\n/**\r\n * Marks a column reference as an outer-scope reference for correlated subqueries.\r\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\r\n */\r\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\r\n ...columnOperand(col),\r\n scope: 'outer'\r\n});\r\n\r\n/**\r\n * References a SELECT alias (useful for ORDER BY / GROUP BY).\r\n */\r\nexport const aliasRef = (name: string): AliasRefNode => ({\r\n type: 'AliasRef',\r\n name\r\n});\r\n\r\n/**\r\n * Creates an outer-scoped column reference using a specific table or alias name.\r\n */\r\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toOperandNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toOperandNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnRef,\r\n right: InExpressionRight\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n right\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values.map(v => toOperand(v)));\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values.map(v => toOperand(v)));\r\n\r\nexport const inSubquery = (left: OperandNode | ColumnRef, subquery: SelectQueryInput): InExpressionNode =>\r\n createInExpression('IN', left, toScalarSubqueryNode(subquery));\r\n\r\nexport const notInSubquery = (left: OperandNode | ColumnRef, subquery: SelectQueryInput): InExpressionNode =>\r\n createInExpression('NOT IN', left, toScalarSubqueryNode(subquery));\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toOperandNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\nconst createArithmeticExpression = (\r\n operator: '+' | '-' | '*' | '/',\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => ({\r\n type: 'ArithmeticExpression',\r\n left: toOperand(left),\r\n operator,\r\n right: toOperand(right)\r\n});\r\n\r\nexport const add = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('+', left, right);\r\n\r\nexport const sub = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('-', left, right);\r\n\r\nexport const mul = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('*', left, right);\r\n\r\nexport const div = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): ArithmeticExpressionNode => createArithmeticExpression('/', left, right);\r\n\r\nconst createBitwiseExpression = (\r\n operator: BitwiseOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => ({\r\n type: 'BitwiseExpression',\r\n left: toOperand(left),\r\n operator,\r\n right: toOperand(right)\r\n});\r\n\r\n/**\r\n * Creates a bitwise AND expression (left & right)\r\n */\r\nexport const bitAnd = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('&', left, right);\r\n\r\n/**\r\n * Creates a bitwise OR expression (left | right)\r\n */\r\nexport const bitOr = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('|', left, right);\r\n\r\n/**\r\n * Creates a bitwise XOR expression (left ^ right)\r\n */\r\nexport const bitXor = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('^', left, right);\r\n\r\n/**\r\n * Creates a bitwise shift left expression (left << right)\r\n */\r\nexport const shiftLeft = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('<<', left, right);\r\n\r\n/**\r\n * Creates a bitwise shift right expression (left >> right)\r\n */\r\nexport const shiftRight = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number\r\n): BitwiseExpressionNode => createBitwiseExpression('>>', left, right);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Builds a CAST expression node for casting values to SQL types.\r\n */\r\nexport const cast = (\r\n expression: OperandNode | ColumnRef | string | number | boolean | null,\r\n castType: string\r\n): CastExpressionNode => ({\r\n type: 'Cast',\r\n expression: toOperand(expression),\r\n castType\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a COLLATE expression (expression COLLATE collationName)\r\n * @param expression - Expression to be collated\r\n * @param collation - Collation name\r\n * @returns COLLATE expression node\r\n */\r\nexport const collate = (\r\n expression: OperandNode | ColumnRef | string | number | boolean | null,\r\n collation: string\r\n): CollateExpressionNode => ({\r\n type: 'Collate',\r\n expression: toOperand(expression),\r\n collation\r\n});\r\n","import { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\nimport { columnOperand } from './expression-builders.js';\nimport { OrderDirection } from '../sql/sql.js';\nimport { OrderByNode } from './query.js';\nimport { ColumnRef } from './types.js';\n\nconst buildWindowFunction = (\n name: string,\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: ColumnNode[],\n orderBy?: OrderByNode[]\n): WindowFunctionNode => {\n const node: WindowFunctionNode = {\n type: 'WindowFunction',\n name,\n args\n };\n\n if (partitionBy && partitionBy.length) {\n node.partitionBy = partitionBy;\n }\n\n if (orderBy && orderBy.length) {\n node.orderBy = orderBy;\n }\n\n return node;\n};\n\n/**\n * Creates a ROW_NUMBER window function\n * @returns Window function node for ROW_NUMBER\n */\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\n\n/**\n * Creates a RANK window function\n * @returns Window function node for RANK\n */\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\n\n/**\n * Creates a DENSE_RANK window function\n * @returns Window function node for DENSE_RANK\n */\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\n\n/**\n * Creates an NTILE window function\n * @param n - Number of buckets\n * @returns Window function node for NTILE\n */\nexport const ntile = (n: number): WindowFunctionNode =>\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\n\n/**\n * Creates a LAG window function\n * @param col - Column to lag\n * @param offset - Offset (defaults to 1)\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LAG\n */\nexport const lag = (\n col: ColumnRef | ColumnNode,\n offset: number = 1,\n defaultValue?: LiteralNode['value']\n): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\n args.push({ type: 'Literal', value: defaultValue });\n }\n return buildWindowFunction('LAG', args);\n};\n\n/**\n * Creates a LEAD window function\n * @param col - Column to lead\n * @param offset - Offset (defaults to 1)\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LEAD\n */\nexport const lead = (\n col: ColumnRef | ColumnNode,\n offset: number = 1,\n defaultValue?: LiteralNode['value']\n): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\n args.push({ type: 'Literal', value: defaultValue });\n }\n return buildWindowFunction('LEAD', args);\n};\n\n/**\n * Creates a FIRST_VALUE window function\n * @param col - Column to get first value from\n * @returns Window function node for FIRST_VALUE\n */\nexport const firstValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\n\n/**\n * Creates a LAST_VALUE window function\n * @param col - Column to get last value from\n * @returns Window function node for LAST_VALUE\n */\nexport const lastValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\n\n/**\n * Creates a custom window function\n * @param name - Window function name\n * @param args - Function arguments\n * @param partitionBy - Optional PARTITION BY columns\n * @param orderBy - Optional ORDER BY clauses\n * @returns Window function node\n */\nexport const windowFunction = (\n name: string,\n args: (ColumnRef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: (ColumnRef | ColumnNode)[],\n orderBy?: { column: ColumnRef | ColumnNode; direction: OrderDirection }[]\n): WindowFunctionNode => {\n const nodeArgs = args.map(arg => {\n if (typeof (arg as LiteralNode).value !== 'undefined') {\n return arg as LiteralNode;\n }\n if ('path' in arg) {\n return arg as JsonPathNode;\n }\n return columnOperand(arg as ColumnRef | ColumnNode);\n });\n\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\n type: 'OrderBy',\n term: columnOperand(o.column),\n direction: o.direction\n }));\n\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\n};\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\r\n /** Equality operator */\r\n EQUALS: '=',\r\n /** Not equals operator */\r\n NOT_EQUALS: '!=',\r\n /** Greater than operator */\r\n GREATER_THAN: '>',\r\n /** Greater than or equal operator */\r\n GREATER_OR_EQUAL: '>=',\r\n /** Less than operator */\r\n LESS_THAN: '<',\r\n /** Less than or equal operator */\r\n LESS_OR_EQUAL: '<=',\r\n /** LIKE pattern matching operator */\r\n LIKE: 'LIKE',\r\n /** NOT LIKE pattern matching operator */\r\n NOT_LIKE: 'NOT LIKE',\r\n /** IN membership operator */\r\n IN: 'IN',\r\n /** NOT IN membership operator */\r\n NOT_IN: 'NOT IN',\r\n /** BETWEEN range operator */\r\n BETWEEN: 'BETWEEN',\r\n /** NOT BETWEEN range operator */\r\n NOT_BETWEEN: 'NOT BETWEEN',\r\n /** IS NULL null check operator */\r\n IS_NULL: 'IS NULL',\r\n /** IS NOT NULL null check operator */\r\n IS_NOT_NULL: 'IS NOT NULL',\r\n /** Logical AND operator */\r\n AND: 'AND',\r\n /** Logical OR operator */\r\n OR: 'OR',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL bitwise operators\r\n */\r\nexport const BITWISE_OPERATORS = {\r\n /** Bitwise AND */\r\n AND: '&',\r\n /** Bitwise OR */\r\n OR: '|',\r\n /** Bitwise XOR */\r\n XOR: '^',\r\n /** Bitwise Shift Left */\r\n SHIFT_LEFT: '<<',\r\n /** Bitwise Shift Right */\r\n SHIFT_RIGHT: '>>'\r\n} as const;\r\n\r\n/**\r\n * Type representing supported bitwise operators\r\n */\r\nexport type BitwiseOperator = (typeof BITWISE_OPERATORS)[keyof typeof BITWISE_OPERATORS];\r\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\n/**\n * Creates a COUNT function expression\n * @param col - Column to count\n * @returns Function node with COUNT\n */\nexport const count = buildAggregate('COUNT');\n\n/**\n * Creates a SUM function expression\n * @param col - Column to sum\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\n/**\n * Creates an AVG function expression\n * @param col - Column to average\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\n/**\n * Creates a COUNT(*) function expression.\n * @returns Function node with COUNT(*)\n */\nexport const countAll = (): FunctionNode => ({\n type: 'Function',\n name: 'COUNT',\n args: []\n});\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n term: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n\n/**\n * Creates a STDDEV function expression\n * @param col - Column to calculate standard deviation for\n * @returns Function node with STDDEV\n */\nexport const stddev = buildAggregate('STDDEV');\n\n/**\n * Creates a VARIANCE function expression\n * @param col - Column to calculate variance for\n * @returns Function node with VARIANCE\n */\nexport const variance = buildAggregate('VARIANCE');\n","import {\n BinaryExpressionNode,\n LogicalExpressionNode,\n NullExpressionNode,\n InExpressionNode,\n ExistsExpressionNode,\n BetweenExpressionNode,\n ExpressionNode,\n OperandNode,\n ArithmeticExpressionNode,\n ColumnNode,\n LiteralNode,\n FunctionNode,\n JsonPathNode,\n ScalarSubqueryNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode,\n CollateExpressionNode,\n AliasRefNode,\n BitwiseExpressionNode\n} from './expression-nodes.js';\n\n/**\n * Visitor for expression nodes\n */\nexport interface ExpressionVisitor<R> {\n visitBinaryExpression?(node: BinaryExpressionNode): R;\n visitLogicalExpression?(node: LogicalExpressionNode): R;\n visitNullExpression?(node: NullExpressionNode): R;\n visitInExpression?(node: InExpressionNode): R;\n visitExistsExpression?(node: ExistsExpressionNode): R;\n visitBetweenExpression?(node: BetweenExpressionNode): R;\n visitArithmeticExpression?(node: ArithmeticExpressionNode): R;\n visitBitwiseExpression?(node: BitwiseExpressionNode): R;\n otherwise?(node: ExpressionNode): R;\n}\n\n/**\n * Visitor for operand nodes\n */\nexport interface OperandVisitor<R> {\n visitColumn?(node: ColumnNode): R;\n visitLiteral?(node: LiteralNode): R;\n visitFunction?(node: FunctionNode): R;\n visitJsonPath?(node: JsonPathNode): R;\n visitScalarSubquery?(node: ScalarSubqueryNode): R;\n visitCaseExpression?(node: CaseExpressionNode): R;\n visitCast?(node: CastExpressionNode): R;\n visitWindowFunction?(node: WindowFunctionNode): R;\n visitCollate?(node: CollateExpressionNode): R;\n visitAliasRef?(node: AliasRefNode): R;\n otherwise?(node: OperandNode): R;\n}\n\ntype ExpressionDispatch = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>) => R;\ntype OperandDispatch = <R>(node: OperandNode, visitor: OperandVisitor<R>) => R;\n\n/**\n * Registry class for managing dispatchers in an immutable way\n */\nclass DispatcherRegistry<T> {\n private readonly dispatchers: ReadonlyMap<string, T>;\n\n constructor(dispatchers: Map<string, T> = new Map()) {\n this.dispatchers = dispatchers;\n }\n\n /**\n * Registers a new dispatcher and returns a new registry instance\n */\n register(type: string, dispatcher: T): DispatcherRegistry<T> {\n const newMap = new Map(this.dispatchers);\n newMap.set(type, dispatcher);\n return new DispatcherRegistry(newMap);\n }\n\n /**\n * Gets a dispatcher for the given type\n */\n get(type: string): T | undefined {\n return this.dispatchers.get(type);\n }\n\n /**\n * Returns a new empty registry\n */\n clear(): DispatcherRegistry<T> {\n return new DispatcherRegistry();\n }\n}\n\nlet expressionRegistry = new DispatcherRegistry<ExpressionDispatch>();\nlet operandRegistry = new DispatcherRegistry<OperandDispatch>();\n\n/**\n * Registers a dispatcher for a custom expression node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerExpressionDispatcher = (type: string, dispatcher: ExpressionDispatch): void => {\n expressionRegistry = expressionRegistry.register(type, dispatcher);\n};\n\n/**\n * Registers a dispatcher for a custom operand node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerOperandDispatcher = (type: string, dispatcher: OperandDispatch): void => {\n operandRegistry = operandRegistry.register(type, dispatcher);\n};\n\n/**\n * Clears all registered dispatchers. Primarily for tests.\n */\nexport const clearExpressionDispatchers = (): void => {\n expressionRegistry = expressionRegistry.clear();\n};\n\nexport const clearOperandDispatchers = (): void => {\n operandRegistry = operandRegistry.clear();\n};\n\nconst getNodeType = (node: { type?: string } | null | undefined): string | undefined =>\n typeof node === 'object' && node !== null && typeof node.type === 'string' ? node.type : undefined;\n\nconst unsupportedExpression = (node: ExpressionNode): never => {\n throw new Error(`Unsupported expression type \"${getNodeType(node) ?? 'unknown'}\"`);\n};\n\nconst unsupportedOperand = (node: OperandNode): never => {\n throw new Error(`Unsupported operand type \"${getNodeType(node) ?? 'unknown'}\"`);\n};\n/**\n * Dispatches an expression node to the visitor\n * @param node - Expression node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\n const dynamic = expressionRegistry.get(node.type);\n if (dynamic) return dynamic(node, visitor);\n\n switch (node.type) {\n case 'BinaryExpression':\n if (visitor.visitBinaryExpression) return visitor.visitBinaryExpression(node);\n break;\n case 'LogicalExpression':\n if (visitor.visitLogicalExpression) return visitor.visitLogicalExpression(node);\n break;\n case 'NullExpression':\n if (visitor.visitNullExpression) return visitor.visitNullExpression(node);\n break;\n case 'InExpression':\n if (visitor.visitInExpression) return visitor.visitInExpression(node);\n break;\n case 'ExistsExpression':\n if (visitor.visitExistsExpression) return visitor.visitExistsExpression(node);\n break;\n case 'BetweenExpression':\n if (visitor.visitBetweenExpression) return visitor.visitBetweenExpression(node);\n break;\n case 'ArithmeticExpression':\n if (visitor.visitArithmeticExpression) return visitor.visitArithmeticExpression(node);\n break;\n case 'BitwiseExpression':\n if (visitor.visitBitwiseExpression) return visitor.visitBitwiseExpression(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedExpression(node);\n};\n\n/**\n * Dispatches an operand node to the visitor\n * @param node - Operand node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\n const dynamic = operandRegistry.get(node.type);\n if (dynamic) return dynamic(node, visitor);\n\n switch (node.type) {\n case 'Column':\n if (visitor.visitColumn) return visitor.visitColumn(node);\n break;\n case 'Literal':\n if (visitor.visitLiteral) return visitor.visitLiteral(node);\n break;\n case 'Function':\n if (visitor.visitFunction) return visitor.visitFunction(node);\n break;\n case 'JsonPath':\n if (visitor.visitJsonPath) return visitor.visitJsonPath(node);\n break;\n case 'ScalarSubquery':\n if (visitor.visitScalarSubquery) return visitor.visitScalarSubquery(node);\n break;\n case 'CaseExpression':\n if (visitor.visitCaseExpression) return visitor.visitCaseExpression(node);\n break;\n case 'WindowFunction':\n if (visitor.visitWindowFunction) return visitor.visitWindowFunction(node);\n break;\n case 'AliasRef':\n if (visitor.visitAliasRef) return visitor.visitAliasRef(node);\n break;\n case 'Cast':\n if (visitor.visitCast) return visitor.visitCast(node);\n break;\n case 'Collate':\n if (visitor.visitCollate) return visitor.visitCollate(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedOperand(node);\n};\n","import { ColumnDef } from '../../schema/column-types.js';\nimport { TableDef } from '../../schema/table.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Type guard to check if an object has an alias property\n */\nconst hasAlias = (obj: unknown): obj is { alias?: string } =>\n typeof obj === 'object' && obj !== null && 'alias' in obj;\n\n/**\n * Adapts a schema ColumnDef to an AST-friendly ColumnRef.\n */\nexport const toColumnRef = (col: ColumnRef | ColumnDef): ColumnRef => ({\n name: col.name,\n table: col.table,\n alias: hasAlias(col) ? col.alias : undefined\n});\n\n/**\n * Adapts a schema TableDef to an AST-friendly TableRef.\n */\nexport const toTableRef = (table: TableRef | TableDef): TableRef => ({\n name: table.name,\n schema: table.schema,\n alias: hasAlias(table) ? table.alias : undefined\n});\n\r\n","import { ColumnNode, OperandNode } from './expression-nodes.js';\r\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\r\nimport { ColumnRef, TableRef } from './types.js';\r\n\r\n/**\r\n * Type guard to check if a column is already a ColumnNode\r\n */\r\nconst isColumnNode = (col: ColumnRef | ColumnNode): col is ColumnNode =>\r\n 'type' in col && col.type === 'Column';\r\n\r\n/**\r\n * Resolves the appropriate table name for a column reference\r\n * @param def - Column reference definition\r\n * @param table - Table reference providing context\r\n * @returns The resolved table name to use\r\n */\r\nconst resolveTableName = (def: ColumnRef, table: TableRef): string => {\r\n // If column doesn't specify a table, use the table's alias or name\r\n if (!def.table) {\r\n return table.alias || table.name;\r\n }\r\n\r\n // If column specifies the base table name and table has an alias, use the alias\r\n if (table.alias && def.table === table.name) {\r\n return table.alias;\r\n }\r\n\r\n // Otherwise use the table specified in the column definition\r\n return def.table;\r\n};\r\n\r\n/**\r\n * Builds or normalizes a column AST node from a column definition or existing node\r\n * @param table - Table definition providing a default table name\r\n * @param column - Column definition or existing column node\r\n */\r\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\r\n if (isColumnNode(column)) {\r\n return column;\r\n }\r\n\r\n const def = column as ColumnRef;\r\n const baseTable = resolveTableName(def, table);\r\n\r\n return {\r\n type: 'Column',\r\n table: baseTable,\r\n name: def.name\r\n };\r\n};\r\n\r\n/**\r\n * Builds column AST nodes for a list of column names\r\n * @param table - Table definition providing the table name\r\n * @param names - Column names\r\n */\r\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: table.alias || table.name,\r\n name\r\n }));\r\n\r\n/**\r\n * Builds a table AST node for the provided table definition\r\n * @param table - Table definition\r\n */\r\nexport const createTableNode = (table: TableRef): TableNode => ({\r\n type: 'Table',\r\n name: table.name,\r\n schema: (table as unknown as { schema?: string }).schema\r\n});\r\n\r\n/**\r\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\r\n */\r\nexport const fnTable = (\n name: string,\n args: OperandNode[] = [],\n alias?: string,\n opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\n): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n// Dialect-aware table function (portable intent key, not a real SQL function name).\nexport const tvf = (\n key: string,\n args: OperandNode[] = [],\n alias?: string,\n opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\n): FunctionTableNode => ({\n type: 'FunctionTable',\n key,\n name: key,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\r\n alias: string,\r\n columnAliases?: string[]\r\n): DerivedTableNode => ({\r\n type: 'DerivedTable',\r\n query,\r\n alias,\r\n columnAliases\r\n});\r\n","import type { FunctionRenderer } from './types.js';\n\n/**\n * Definition for a SQL function renderer.\n */\nexport interface FunctionDefinition {\n name: string;\n renderer: FunctionRenderer;\n}\n\n/**\n * Registry that keeps track of function renderers and exposes them by name.\n */\nexport class FunctionRegistry {\n private readonly renderers: Map<string, FunctionRenderer> = new Map();\n\n /**\n * Registers or overrides a renderer for the given function name.\n */\n add(name: string, renderer: FunctionRenderer): void {\n this.renderers.set(name, renderer);\n }\n\n /**\n * Registers a batch of definitions.\n */\n register(definitions: Iterable<FunctionDefinition>): void {\n for (const definition of definitions) {\n this.add(definition.name, definition.renderer);\n }\n }\n\n /**\n * Merges another registry into this one, allowing overrides from the other source.\n */\n merge(other: FunctionRegistry): void {\n for (const [name, renderer] of other.renderers.entries()) {\n this.renderers.set(name, renderer);\n }\n }\n\n /**\n * Retrieves a renderer by function name.\n */\n get(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n}\n","import type { FunctionRenderer } from '../types.js';\n\n/**\n * Simple renderer for functions that take one argument.\n */\nexport function unaryRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs[0]})`;\n}\n\n/**\n * Simple renderer for functions that take two arguments.\n */\nexport function binaryRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs[0]}, ${compiledArgs[1]})`;\n}\n\n/**\n * Renders functions that simply join all provided arguments.\n */\nexport function variadicRenderer(name: string): FunctionRenderer {\n return ({ compiledArgs }) => `${name}(${compiledArgs.join(', ')})`;\n}\n\n/**\n * Renders parameterless functions that always include parentheses.\n */\nexport function noArgsRenderer(name: string): FunctionRenderer {\n return () => `${name}()`;\n}\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { unaryRenderer } from './helpers.js';\n\nexport const aggregateFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'COUNT',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length ? `COUNT(${compiledArgs.join(', ')})` : 'COUNT(*)'\n },\n { name: 'SUM', renderer: unaryRenderer('SUM') },\n { name: 'AVG', renderer: unaryRenderer('AVG') },\n { name: 'MIN', renderer: unaryRenderer('MIN') },\n { name: 'MAX', renderer: unaryRenderer('MAX') },\n { name: 'STDDEV', renderer: unaryRenderer('STDDEV') },\n { name: 'VARIANCE', renderer: unaryRenderer('VARIANCE') }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { binaryRenderer, unaryRenderer, variadicRenderer } from './helpers.js';\n\nexport const stringFunctionDefinitions: FunctionDefinition[] = [\n { name: 'UPPER', renderer: unaryRenderer('UPPER') },\n { name: 'LOWER', renderer: unaryRenderer('LOWER') },\n { name: 'LENGTH', renderer: unaryRenderer('LENGTH') },\n { name: 'CHAR_LENGTH', renderer: unaryRenderer('CHAR_LENGTH') },\n { name: 'CHARACTER_LENGTH', renderer: unaryRenderer('CHARACTER_LENGTH') },\n { name: 'TRIM', renderer: unaryRenderer('TRIM') },\n { name: 'LTRIM', renderer: unaryRenderer('LTRIM') },\n { name: 'RTRIM', renderer: unaryRenderer('RTRIM') },\n { name: 'SUBSTRING', renderer: variadicRenderer('SUBSTRING') },\n { name: 'SUBSTR', renderer: variadicRenderer('SUBSTR') },\n { name: 'CONCAT', renderer: variadicRenderer('CONCAT') },\n { name: 'CONCAT_WS', renderer: variadicRenderer('CONCAT_WS') },\n { name: 'ASCII', renderer: unaryRenderer('ASCII') },\n { name: 'CHAR', renderer: variadicRenderer('CHAR') },\n {\n name: 'POSITION',\n renderer: ({ compiledArgs }) => `POSITION(${compiledArgs[0]} IN ${compiledArgs[1]})`\n },\n { name: 'REPLACE', renderer: ({ compiledArgs }) => `REPLACE(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'REPEAT', renderer: binaryRenderer('REPEAT') },\n { name: 'LPAD', renderer: ({ compiledArgs }) => `LPAD(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'RPAD', renderer: ({ compiledArgs }) => `RPAD(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` },\n { name: 'LEFT', renderer: binaryRenderer('LEFT') },\n { name: 'RIGHT', renderer: binaryRenderer('RIGHT') },\n { name: 'INSTR', renderer: binaryRenderer('INSTR') },\n {\n name: 'LOCATE',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 3\n ? `LOCATE(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})`\n : `LOCATE(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n { name: 'SPACE', renderer: unaryRenderer('SPACE') },\n { name: 'REVERSE', renderer: unaryRenderer('REVERSE') },\n { name: 'INITCAP', renderer: unaryRenderer('INITCAP') },\n { name: 'MD5', renderer: unaryRenderer('MD5') },\n { name: 'SHA1', renderer: unaryRenderer('SHA1') },\n { name: 'SHA2', renderer: ({ compiledArgs }) => `SHA2(${compiledArgs[0]}, ${compiledArgs[1]})` }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { noArgsRenderer } from './helpers.js';\n\nexport const dateTimeFunctionDefinitions: FunctionDefinition[] = [\n { name: 'NOW', renderer: noArgsRenderer('NOW') },\n { name: 'CURRENT_DATE', renderer: () => 'CURRENT_DATE' },\n { name: 'CURRENT_TIME', renderer: () => 'CURRENT_TIME' },\n {\n name: 'EXTRACT',\n renderer: ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`\n },\n { name: 'YEAR', renderer: ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})` },\n { name: 'MONTH', renderer: ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})` },\n { name: 'DAY', renderer: ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})` },\n { name: 'HOUR', renderer: ({ compiledArgs }) => `EXTRACT(HOUR FROM ${compiledArgs[0]})` },\n { name: 'MINUTE', renderer: ({ compiledArgs }) => `EXTRACT(MINUTE FROM ${compiledArgs[0]})` },\n { name: 'SECOND', renderer: ({ compiledArgs }) => `EXTRACT(SECOND FROM ${compiledArgs[0]})` },\n { name: 'QUARTER', renderer: ({ compiledArgs }) => `EXTRACT(QUARTER FROM ${compiledArgs[0]})` },\n { name: 'DATE_ADD', renderer: ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})` },\n { name: 'DATE_SUB', renderer: ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})` },\n { name: 'DATE_DIFF', renderer: ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})` },\n { name: 'DATE_FORMAT', renderer: ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})` },\n { name: 'UNIX_TIMESTAMP', renderer: noArgsRenderer('UNIX_TIMESTAMP') },\n { name: 'FROM_UNIXTIME', renderer: ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})` },\n { name: 'END_OF_MONTH', renderer: ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})` },\n { name: 'DAY_OF_WEEK', renderer: ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})` },\n { name: 'WEEK_OF_YEAR', renderer: ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})` },\n { name: 'DATE_TRUNC', renderer: ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})` },\n {\n name: 'AGE',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 1 ? `AGE(${compiledArgs[0]})` : `AGE(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n { name: 'LOCALTIME', renderer: () => 'LOCALTIME' },\n { name: 'LOCALTIMESTAMP', renderer: () => 'LOCALTIMESTAMP' }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\nimport { binaryRenderer, noArgsRenderer, unaryRenderer } from './helpers.js';\n\nexport const numericFunctionDefinitions: FunctionDefinition[] = [\n { name: 'ABS', renderer: unaryRenderer('ABS') },\n { name: 'BIT_LENGTH', renderer: unaryRenderer('BIT_LENGTH') },\n { name: 'OCTET_LENGTH', renderer: unaryRenderer('OCTET_LENGTH') },\n { name: 'CHR', renderer: unaryRenderer('CHR') },\n { name: 'LOG2', renderer: unaryRenderer('LOG2') },\n { name: 'CBRT', renderer: unaryRenderer('CBRT') },\n { name: 'ACOS', renderer: unaryRenderer('ACOS') },\n { name: 'ASIN', renderer: unaryRenderer('ASIN') },\n { name: 'ATAN', renderer: unaryRenderer('ATAN') },\n { name: 'ATAN2', renderer: binaryRenderer('ATAN2') },\n { name: 'CEIL', renderer: unaryRenderer('CEIL') },\n { name: 'CEILING', renderer: unaryRenderer('CEILING') },\n { name: 'COS', renderer: unaryRenderer('COS') },\n { name: 'COT', renderer: unaryRenderer('COT') },\n { name: 'DEGREES', renderer: unaryRenderer('DEGREES') },\n { name: 'EXP', renderer: unaryRenderer('EXP') },\n { name: 'FLOOR', renderer: unaryRenderer('FLOOR') },\n { name: 'LN', renderer: unaryRenderer('LN') },\n {\n name: 'LOG',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `LOG(${compiledArgs[0]}, ${compiledArgs[1]})` : `LOG(${compiledArgs[0]})`\n },\n { name: 'LOG10', renderer: unaryRenderer('LOG10') },\n { name: 'LOG_BASE', renderer: binaryRenderer('LOG') },\n { name: 'MOD', renderer: binaryRenderer('MOD') },\n { name: 'PI', renderer: noArgsRenderer('PI') },\n { name: 'POWER', renderer: binaryRenderer('POWER') },\n { name: 'POW', renderer: binaryRenderer('POW') },\n { name: 'RADIANS', renderer: unaryRenderer('RADIANS') },\n { name: 'RANDOM', renderer: noArgsRenderer('RANDOM') },\n { name: 'RAND', renderer: noArgsRenderer('RAND') },\n {\n name: 'ROUND',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `ROUND(${compiledArgs[0]}, ${compiledArgs[1]})` : `ROUND(${compiledArgs[0]})`\n },\n { name: 'SIGN', renderer: unaryRenderer('SIGN') },\n { name: 'SIN', renderer: unaryRenderer('SIN') },\n { name: 'SQRT', renderer: unaryRenderer('SQRT') },\n { name: 'TAN', renderer: unaryRenderer('TAN') },\n {\n name: 'TRUNC',\n renderer: ({ compiledArgs }) =>\n compiledArgs.length === 2 ? `TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})` : `TRUNC(${compiledArgs[0]})`\n },\n {\n name: 'TRUNCATE',\n renderer: ({ compiledArgs }) => `TRUNCATE(${compiledArgs[0]}, ${compiledArgs[1]})`\n }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\n\nexport const controlFlowFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'COALESCE',\n renderer: ({ compiledArgs }) => `COALESCE(${compiledArgs.join(', ')})`\n },\n {\n name: 'NULLIF',\n renderer: ({ compiledArgs }) => `NULLIF(${compiledArgs[0]}, ${compiledArgs[1]})`\n },\n {\n name: 'GREATEST',\n renderer: ({ compiledArgs }) => `GREATEST(${compiledArgs.join(', ')})`\n },\n {\n name: 'LEAST',\n renderer: ({ compiledArgs }) => `LEAST(${compiledArgs.join(', ')})`\n },\n {\n name: 'IFNULL',\n renderer: ({ compiledArgs }) => `IFNULL(${compiledArgs[0]}, ${compiledArgs[1]})`\n }\n];\n","import type { FunctionDefinition } from '../function-registry.js';\n\nexport const jsonFunctionDefinitions: FunctionDefinition[] = [\n {\n name: 'JSON_LENGTH',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length === 0 || compiledArgs.length > 2) {\n throw new Error('JSON_LENGTH expects 1 or 2 arguments');\n }\n return `JSON_LENGTH(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'JSON_SET',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length < 3 || (compiledArgs.length - 1) % 2 !== 0) {\n throw new Error('JSON_SET expects a JSON document followed by one or more path/value pairs');\n }\n return `JSON_SET(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'JSON_ARRAYAGG',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) {\n throw new Error('JSON_ARRAYAGG expects exactly one argument');\n }\n return `JSON_ARRAYAGG(${compiledArgs[0]})`;\n }\n },\n {\n name: 'JSON_CONTAINS',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length < 2 || compiledArgs.length > 3) {\n throw new Error('JSON_CONTAINS expects two or three arguments');\n }\n return `JSON_CONTAINS(${compiledArgs.join(', ')})`;\n }\n },\n {\n name: 'ARRAY_APPEND',\n renderer: ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) {\n throw new Error('ARRAY_APPEND expects exactly two arguments');\n }\n return `ARRAY_APPEND(${compiledArgs[0]}, ${compiledArgs[1]})`;\n }\n }\n];\n","import type { FunctionRenderContext } from './types.js';\nimport { isOperandNode, type LiteralNode, type OperandNode } from '../ast/expression.js';\n\n/** Default separator used when GROUP_CONCAT has no explicit separator. */\nexport const DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n};\n\n/**\n * Builds an ORDER BY clause for functions that support ordering (e.g. GROUP_CONCAT).\n */\nexport function buildGroupConcatOrderBy(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => {\n const term = isOperandNode(order.term)\n ? ctx.compileOperand(order.term)\n : (() => {\n throw new Error('ORDER BY expressions inside functions must be operands');\n })();\n const collation = order.collation ? ` COLLATE ${order.collation}` : '';\n const nulls = order.nulls ? ` NULLS ${order.nulls}` : '';\n return `${term} ${order.direction}${collation}${nulls}`;\n });\n return `ORDER BY ${parts.join(', ')}`;\n}\n\n/**\n * Formats the SEPARATOR clause for GROUP_CONCAT.\n */\nexport function formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n}\n\n/**\n * Returns the operand used as the separator for GROUP_CONCAT.\n */\nexport function getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? DEFAULT_GROUP_CONCAT_SEPARATOR;\n}\n\n/**\n * Renders the default GROUP_CONCAT statement.\n */\nexport function renderStandardGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = buildGroupConcatOrderBy(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n}\n","\nimport { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport type { LiteralNode, OperandNode } from '../ast/expression.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport type { FunctionDefinition } from './function-registry.js';\nimport { aggregateFunctionDefinitions } from './definitions/aggregate.js';\nimport { stringFunctionDefinitions } from './definitions/string.js';\nimport { dateTimeFunctionDefinitions } from './definitions/datetime.js';\nimport { numericFunctionDefinitions } from './definitions/numeric.js';\nimport { controlFlowFunctionDefinitions } from './definitions/control-flow.js';\nimport { jsonFunctionDefinitions } from './definitions/json.js';\nimport {\n renderStandardGroupConcat,\n buildGroupConcatOrderBy as buildGroupConcatOrderByClause,\n formatGroupConcatSeparator as formatGroupConcatSeparatorClause,\n getGroupConcatSeparatorOperand as resolveGroupConcatSeparatorOperand,\n DEFAULT_GROUP_CONCAT_SEPARATOR as DEFAULT_GROUP_CONCAT_SEPARATOR_LITERAL\n} from './group-concat-helpers.js';\n\n/**\n * Standard implementation of FunctionStrategy for ANSI SQL functions.\n */\nexport class StandardFunctionStrategy implements FunctionStrategy {\n protected readonly registry: FunctionRegistry;\n\n /**\n * Creates a new StandardFunctionStrategy and registers standard functions.\n */\n constructor(registry?: FunctionRegistry) {\n this.registry = registry ?? new FunctionRegistry();\n this.registerStandard();\n }\n\n protected registerStandard(): void {\n this.registerDefinitions(aggregateFunctionDefinitions);\n this.registerDefinitions(stringFunctionDefinitions);\n this.registerDefinitions(dateTimeFunctionDefinitions);\n this.registerDefinitions(numericFunctionDefinitions);\n this.registerDefinitions(controlFlowFunctionDefinitions);\n this.registerDefinitions(jsonFunctionDefinitions);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\n\n protected registerDefinitions(definitions: FunctionDefinition[]): void {\n this.registry.register(definitions);\n }\n\n /**\n * Registers a renderer for a function name.\n * @param name - The function name.\n * @param renderer - The renderer function.\n */\n protected add(name: string, renderer: FunctionRenderer): void {\n this.registry.add(name, renderer);\n }\n\n /**\n * @inheritDoc\n */\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.registry.get(name);\n }\n\n /**\n * Renders the GROUP_CONCAT function with optional ORDER BY and SEPARATOR.\n * @param ctx - The function render context.\n * @returns The rendered SQL string.\n */\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n return renderStandardGroupConcat(ctx);\n }\n\n /**\n * Builds the ORDER BY clause for functions like GROUP_CONCAT.\n * @param ctx - The function render context.\n * @returns The ORDER BY SQL clause or empty string.\n */\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n return buildGroupConcatOrderByClause(ctx);\n }\n\n /**\n * Formats the SEPARATOR clause for GROUP_CONCAT.\n * @param ctx - The function render context.\n * @returns The SEPARATOR SQL clause or empty string.\n */\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n return formatGroupConcatSeparatorClause(ctx);\n }\n\n /**\n * Gets the separator operand for GROUP_CONCAT, defaulting to comma.\n * @param ctx - The function render context.\n * @returns The separator operand.\n */\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return resolveGroupConcatSeparatorOperand(ctx);\n }\n\n /** Default separator for GROUP_CONCAT, a comma. */\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = DEFAULT_GROUP_CONCAT_SEPARATOR_LITERAL;\n}\n","import type { TableFunctionRenderer, TableFunctionStrategy } from './table-types.js';\n\nexport class StandardTableFunctionStrategy implements TableFunctionStrategy {\n protected renderers: Map<string, TableFunctionRenderer> = new Map();\n\n protected add(key: string, renderer: TableFunctionRenderer) {\n this.renderers.set(key, renderer);\n }\n\n getRenderer(key: string): TableFunctionRenderer | undefined {\n return this.renderers.get(key);\n }\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode,\r\n OrderingTerm\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n CastExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode,\r\n ArithmeticExpressionNode,\r\n BitwiseExpressionNode,\r\n CollateExpressionNode,\r\n AliasRefNode,\r\n isOperandNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.js';\nimport type { TableFunctionStrategy } from '../functions/table-types.js';\nimport { StandardTableFunctionStrategy } from '../functions/standard-table-strategy.js';\n\r\n/**\r\n * Context for SQL compilation with parameter management\r\n */\r\nexport interface CompilerContext {\r\n /** Array of parameters */\r\n params: unknown[];\r\n /** Function to add a parameter and get its placeholder */\r\n addParameter(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Result of SQL compilation\r\n */\r\nexport interface CompiledQuery {\r\n /** Generated SQL string */\r\n sql: string;\r\n /** Parameters for the query */\r\n params: unknown[];\r\n}\r\n\r\nexport interface SelectCompiler {\r\n compileSelect(ast: SelectQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface InsertCompiler {\r\n compileInsert(ast: InsertQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface UpdateCompiler {\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface DeleteCompiler {\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery;\r\n}\r\n\r\n/**\r\n * Abstract base class for SQL dialect implementations\r\n */\r\nexport abstract class Dialect\r\n implements SelectCompiler, InsertCompiler, UpdateCompiler, DeleteCompiler {\r\n /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n _ctx: CompilerContext\r\n ): string {\r\n void _ctx;\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(_index: number): string {\r\n void _index;\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(_kind: SetOperationKind): boolean {\r\n void _kind;\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\n protected readonly functionStrategy: FunctionStrategy;\n protected readonly tableFunctionStrategy: TableFunctionStrategy;\n\n protected constructor(functionStrategy?: FunctionStrategy, tableFunctionStrategy?: TableFunctionStrategy) {\n this.expressionCompilers = new Map();\n this.operandCompilers = new Map();\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\n this.tableFunctionStrategy = tableFunctionStrategy || new StandardTableFunctionStrategy();\n this.registerDefaultOperandCompilers();\n this.registerDefaultExpressionCompilers();\n }\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy, tableFunctionStrategy?: TableFunctionStrategy): Dialect {\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy, tableFunctionStrategy);\n }\n\r\n /**\r\n * Registers an expression compiler for a specific node type\r\n * @param type - Expression node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerExpressionCompiler<T extends ExpressionNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.expressionCompilers.set(type, compiler as (node: ExpressionNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Registers an operand compiler for a specific node type\r\n * @param type - Operand node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerOperandCompiler<T extends OperandNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.operandCompilers.set(type, compiler as (node: OperandNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Compiles an expression node\r\n * @param node - Expression node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL expression\r\n */\r\n protected compileExpression(node: ExpressionNode, ctx: CompilerContext): string {\r\n const compiler = this.expressionCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported expression node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an operand node\r\n * @param node - Operand node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL operand\r\n */\r\n protected compileOperand(node: OperandNode, ctx: CompilerContext): string {\r\n const compiler = this.operandCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported operand node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an ordering term (operand, expression, or alias reference).\r\n */\r\n protected compileOrderingTerm(term: OrderingTerm, ctx: CompilerContext): string {\r\n if (isOperandNode(term)) {\r\n return this.compileOperand(term, ctx);\r\n }\r\n // At this point, term must be an ExpressionNode\r\n const expr = this.compileExpression(term as ExpressionNode, ctx);\r\n return `(${expr})`;\r\n }\r\n\r\n private registerDefaultExpressionCompilers(): void {\r\n this.registerExpressionCompiler('BinaryExpression', (binary: BinaryExpressionNode, ctx) => {\r\n const left = this.compileOperand(binary.left, ctx);\r\n const right = this.compileOperand(binary.right, ctx);\r\n const base = `${left} ${binary.operator} ${right}`;\r\n if (binary.escape) {\r\n const escapeOperand = this.compileOperand(binary.escape, ctx);\r\n return `${base} ESCAPE ${escapeOperand}`;\r\n }\r\n return base;\r\n });\r\n\r\n this.registerExpressionCompiler('LogicalExpression', (logical: LogicalExpressionNode, ctx) => {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.compileExpression(op, ctx);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return parts.join(` ${logical.operator} `);\r\n });\r\n\r\n this.registerExpressionCompiler('NullExpression', (nullExpr: NullExpressionNode, ctx) => {\r\n const left = this.compileOperand(nullExpr.left, ctx);\r\n return `${left} ${nullExpr.operator}`;\r\n });\r\n\r\n this.registerExpressionCompiler('InExpression', (inExpr: InExpressionNode, ctx) => {\r\n const left = this.compileOperand(inExpr.left, ctx);\r\n if (Array.isArray(inExpr.right)) {\r\n const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\r\n }\r\n const subquerySql = this.compileSelectAst(inExpr.right.query, ctx).trim().replace(/;$/, '');\r\n return `${left} ${inExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('ExistsExpression', (existsExpr: ExistsExpressionNode, ctx) => {\r\n const subquerySql = this.compileSelectForExists(existsExpr.subquery, ctx);\r\n return `${existsExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('BetweenExpression', (betweenExpr: BetweenExpressionNode, ctx) => {\r\n const left = this.compileOperand(betweenExpr.left, ctx);\r\n const lower = this.compileOperand(betweenExpr.lower, ctx);\r\n const upper = this.compileOperand(betweenExpr.upper, ctx);\r\n return `${left} ${betweenExpr.operator} ${lower} AND ${upper}`;\r\n });\r\n\r\n this.registerExpressionCompiler('ArithmeticExpression', (arith: ArithmeticExpressionNode, ctx) => {\r\n const left = this.compileOperand(arith.left, ctx);\r\n const right = this.compileOperand(arith.right, ctx);\r\n return `${left} ${arith.operator} ${right}`;\r\n });\r\n\r\n this.registerExpressionCompiler('BitwiseExpression', (bitwise: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(bitwise.left, ctx);\r\n const right = this.compileOperand(bitwise.right, ctx);\r\n return `${left} ${bitwise.operator} ${right}`;\r\n });\r\n }\r\n\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('AliasRef', (alias: AliasRefNode, _ctx) => {\r\n void _ctx;\r\n return this.quoteIdentifier(alias.name);\r\n });\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n void _ctx;\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) =>\r\n this.compileFunctionOperand(fnNode, ctx)\r\n );\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => {\r\n void _ctx;\r\n return this.compileJsonPath(path);\r\n });\r\n\r\n this.registerOperandCompiler('ScalarSubquery', (node: ScalarSubqueryNode, ctx) => {\r\n const sql = this.compileSelectAst(node.query, ctx).trim().replace(/;$/, '');\r\n return `(${sql})`;\r\n });\r\n\r\n this.registerOperandCompiler('CaseExpression', (node: CaseExpressionNode, ctx) => {\r\n const parts = ['CASE'];\r\n for (const { when, then } of node.conditions) {\r\n parts.push(`WHEN ${this.compileExpression(when, ctx)} THEN ${this.compileOperand(then, ctx)}`);\r\n }\r\n if (node.else) {\r\n parts.push(`ELSE ${this.compileOperand(node.else, ctx)}`);\r\n }\r\n parts.push('END');\r\n return parts.join(' ');\r\n });\r\n\r\n this.registerOperandCompiler('Cast', (node: CastExpressionNode, ctx) => {\r\n const value = this.compileOperand(node.expression, ctx);\r\n return `CAST(${value} AS ${node.castType})`;\r\n });\r\n\r\n this.registerOperandCompiler('WindowFunction', (node: WindowFunctionNode, ctx) => {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause = 'PARTITION BY ' + node.partitionBy.map(col =>\r\n `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`\r\n ).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause = 'ORDER BY ' + node.orderBy.map(o => {\r\n const term = this.compileOrderingTerm(o.term, ctx);\r\n const collation = o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n }).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n });\r\n this.registerOperandCompiler('ArithmeticExpression', (node: ArithmeticExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n return `(${left} ${node.operator} ${right})`;\r\n });\r\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n return `(${left} ${node.operator} ${right})`;\r\n });\r\n this.registerOperandCompiler('Collate', (node: CollateExpressionNode, ctx) => {\r\n const expr = this.compileOperand(node.expression, ctx);\r\n return `${expr} COLLATE ${node.collation}`;\r\n });\r\n }\r\n\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(_node: JsonPathNode): string {\r\n void _node;\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n\r\n /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\r\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\r\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\r\n if (renderer) {\r\n return renderer({\r\n node: fnNode,\r\n compiledArgs,\r\n compileOperand: operand => this.compileOperand(operand, ctx)\r\n });\r\n }\r\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\r\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { OperandNode } from '../../ast/expression.js';\nimport { FunctionTableNode } from '../../ast/query.js';\nimport { SqlDialectBase } from './sql-dialect.js';\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args);\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: OperandNode) => {\r\n if (ctx && dialect) {\r\n return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string): string {\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\n return `${schemaPart}${fn.name}(${args})${ordinality}`;\n }\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n void _ctx;\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { JoinNode } from '../../ast/join.js';\r\nimport { TableSourceNode } from '../../ast/query.js';\r\nimport { ExpressionNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n static compileJoins(\r\n joins: JoinNode[] | undefined,\r\n ctx: CompilerContext,\r\n compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,\r\n compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string\r\n ): string {\r\n if (!joins || joins.length === 0) return '';\r\n const parts = joins.map(j => {\r\n const table = compileFrom(j.table, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';\r\n\r\ntype TermRenderer = (term: OrderingTerm) => string;\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param renderTerm - Function to render a grouping term.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy.map(renderTerm).join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { OrderByNode, SelectQueryNode } from '../../ast/query.js';\r\n\r\ntype NullsRenderer = (order: OrderByNode) => string | undefined;\r\ntype CollationRenderer = (order: OrderByNode) => string | undefined;\r\ntype TermRenderer = (term: OrderByNode['term']) => string;\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param renderTerm - Function to render an ordering term.\r\n * @param renderNulls - Optional function to render NULLS FIRST/LAST.\r\n * @param renderCollation - Optional function to render COLLATE clause.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(\r\n ast: SelectQueryNode,\r\n renderTerm: TermRenderer,\r\n renderNulls?: NullsRenderer,\r\n renderCollation?: CollationRenderer\r\n ): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy.map(o => {\r\n const term = renderTerm(o.term);\r\n const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n }).join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\nimport {\n SelectQueryNode,\n InsertQueryNode,\n UpdateQueryNode,\n DeleteQueryNode,\n InsertSourceNode,\n TableSourceNode,\n DerivedTableNode,\n FunctionTableNode,\n OrderByNode,\n TableNode\n} from '../../ast/query.js';\nimport { ColumnNode, OperandNode } from '../../ast/expression.js';\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\nimport { CteCompiler } from './cte-compiler.js';\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\nimport { JoinCompiler } from './join-compiler.js';\nimport { GroupByCompiler } from './groupby-compiler.js';\nimport { OrderByCompiler } from './orderby-compiler.js';\n\n\n/**\n * Base class for SQL dialects.\n * Provides a common framework for compiling AST nodes into SQL strings.\n * Specific dialects should extend this class and implement dialect-specific logic.\n */\nexport abstract class SqlDialectBase extends Dialect {\n abstract quoteIdentifier(id: string): string;\n\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\n\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\n const ctes = CteCompiler.compileCtes(\n ast,\n ctx,\n this.quoteIdentifier.bind(this),\n this.compileSelectAst.bind(this),\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\n this.stripTrailingSemicolon.bind(this)\n );\n const baseAst: SelectQueryNode = hasSetOps\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\n : ast;\n const baseSelect = this.compileSelectCore(baseAst, ctx);\n if (!hasSetOps) {\n return `${ctes}${baseSelect}`;\n }\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\n }\n\n private compileSelectWithSetOps(\n ast: SelectQueryNode,\n baseSelect: string,\n ctes: string,\n ctx: CompilerContext\n ): string {\n const compound = ast.setOps!\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\n .join(' ');\n const orderBy = OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\n return `${ctes}${combined}${orderBy}${pagination}`;\n }\n\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\n if (!ast.columns.length) {\n throw new Error('INSERT queries must specify columns.');\n }\n\n const table = this.compileTableName(ast.into);\n const columnList = this.compileInsertColumnList(ast.columns);\n const source = this.compileInsertSource(ast.source, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `INSERT INTO ${table} (${columnList}) ${source}${returning}`;\n }\n\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n return this.returningStrategy.compileReturning(returning, ctx);\n }\n\n private compileInsertSource(source: InsertSourceNode, ctx: CompilerContext): string {\n if (source.type === 'InsertValues') {\n if (!source.rows.length) {\n throw new Error('INSERT ... VALUES requires at least one row.');\n }\n const values = source.rows\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\n .join(', ');\n return `VALUES ${values}`;\n }\n\n const normalized = this.normalizeSelectAst(source.query);\n return this.compileSelectAst(normalized, ctx).trim();\n }\n\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = this.compileSelectColumns(ast, ctx);\n const from = this.compileFrom(ast.from, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n const whereClause = this.compileWhere(ast.where, ctx);\n const groupBy = GroupByCompiler.compileGroupBy(ast, term => this.compileOrderingTerm(term, ctx));\n const having = this.compileHaving(ast, ctx);\n const orderBy = OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\n }\n\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\n const target = this.compileTableReference(ast.table);\n const assignments = this.compileUpdateAssignments(ast.set, ast.table, ctx);\n const fromClause = this.compileUpdateFromClause(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `UPDATE ${target} SET ${assignments}${fromClause}${whereClause}${returning}`;\n }\n\n private compileUpdateAssignments(\n assignments: { column: ColumnNode; value: OperandNode }[],\n table: TableNode,\n ctx: CompilerContext\n ): string {\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.compileQualifiedColumn(col, table);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\n protected compileQualifiedColumn(column: ColumnNode, table: TableNode): string {\n const baseTableName = table.name;\n const alias = table.alias;\n const columnTable = column.table ?? alias ?? baseTableName;\n const tableQualifier =\n alias && column.table === baseTableName ? alias : columnTable;\n\n if (!tableQualifier) {\n return this.quoteIdentifier(column.name);\n }\n\n return `${this.quoteIdentifier(tableQualifier)}.${this.quoteIdentifier(column.name)}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n const target = this.compileTableReference(ast.from);\n const usingClause = this.compileDeleteUsingClause(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE FROM ${target}${usingClause}${whereClause}${returning}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\n }\n\n protected compileDistinct(ast: SelectQueryNode): string {\n return ast.distinct ? 'DISTINCT ' : '';\n }\n\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\n return ast.columns.map(c => {\n const expr = this.compileOperand(c, ctx);\n if (c.alias) {\n if (c.alias.includes('(')) return c.alias;\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\n }\n return expr;\n }).join(', ');\n }\n\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n const key = fn.key ?? fn.name;\n\n if (ctx) {\n const renderer = this.tableFunctionStrategy.getRenderer(key);\n if (renderer) {\n const compiledArgs = (fn.args ?? []).map(arg => this.compileOperand(arg, ctx));\n return renderer({\n node: fn,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx),\n quoteIdentifier: this.quoteIdentifier.bind(this)\n });\n }\n\n if (fn.key) {\n throw new Error(`Table function \"${key}\" is not supported by dialect \"${this.dialect}\".`);\n }\n }\n\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string; alias?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\n protected compileTableReference(table: { name: string; schema?: string; alias?: string }): string {\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileUpdateFromClause(ast: UpdateQueryNode, ctx: CompilerContext): string {\n if (!ast.from && (!ast.joins || ast.joins.length === 0)) return '';\n if (!ast.from) {\n throw new Error('UPDATE with JOINs requires an explicit FROM clause.');\n }\n const from = this.compileFrom(ast.from, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n return ` FROM ${from}${joins}`;\n }\n\n private compileDeleteUsingClause(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (!ast.using && (!ast.joins || ast.joins.length === 0)) return '';\n if (!ast.using) {\n throw new Error('DELETE with JOINs requires a USING clause.');\n }\n const usingTable = this.compileFrom(ast.using, ctx);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n return ` USING ${usingTable}${joins}`;\n }\n\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.having) return '';\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\n }\n\n protected stripTrailingSemicolon(sql: string): string {\n return sql.trim().replace(/;$/, '');\n }\n\n protected wrapSetOperand(sql: string): string {\n const trimmed = this.stripTrailingSemicolon(sql);\n return `(${trimmed})`;\n }\n\n protected renderOrderByNulls(order: OrderByNode): string | undefined {\n return order.nulls ? ` NULLS ${order.nulls}` : '';\n }\n\n protected renderOrderByCollation(order: OrderByNode): string | undefined {\n return order.collation ? ` COLLATE ${order.collation}` : '';\n }\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * PostgreSQL specific function strategy.\r\n * Implements and overrides SQL function compilation rules for PostgreSQL.\r\n */\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATE_TRUNC('${partClean}', ${date})`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const orderClause = this.buildOrderByExpression(ctx);\r\n const orderSegment = orderClause ? ` ${orderClause}` : '';\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\r\n });\r\n\r\n this.add('CHR', ({ compiledArgs }) => `CHR(${compiledArgs[0]})`);\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `EXTRACT(HOUR FROM ${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `EXTRACT(MINUTE FROM ${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `EXTRACT(SECOND FROM ${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `EXTRACT(QUARTER FROM ${compiledArgs[0]})`);\n\n this.add('JSON_LENGTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('JSON_LENGTH expects 1 argument on PostgreSQL');\n return `jsonb_array_length(${compiledArgs[0]})`;\n });\n\n this.add('JSON_ARRAYAGG', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('JSON_ARRAYAGG expects 1 argument on PostgreSQL');\n return `jsonb_agg(${compiledArgs[0]})`;\n });\n\n this.add('JSON_CONTAINS', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('JSON_CONTAINS expects 2 arguments on PostgreSQL');\n return `(${compiledArgs[0]}::jsonb @> ${compiledArgs[1]}::jsonb)`;\n });\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments on PostgreSQL');\n return `array_append(${compiledArgs[0]}, ${compiledArgs[1]})`;\n });\n\n this.add('JSON_SET', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 3) throw new Error('JSON_SET expects exactly 3 arguments on PostgreSQL');\n const pathNode = node.args[1];\n if (pathNode.type !== 'Literal') {\n throw new Error('PostgreSQL JSON_SET currently supports literal paths only');\n }\n const pathArray = this.formatJsonbPathArray(pathNode);\n return `jsonb_set(${compiledArgs[0]}, ${pathArray}, ${compiledArgs[2]}::jsonb, true)`;\n });\n }\n\n private formatJsonbPathArray(pathNode: LiteralNode): string {\n const rawPath = String(pathNode.value ?? '');\n if (!rawPath.startsWith('$')) {\n throw new Error('PostgreSQL JSON_SET paths must start with \"$\"');\n }\n const trimmed = rawPath === '$' ? '' : rawPath.startsWith('$.') ? rawPath.slice(2) : rawPath.slice(1);\n if (!trimmed) {\n throw new Error('PostgreSQL JSON_SET requires a non-root path');\n }\n if (trimmed.includes('[') || trimmed.includes(']')) {\n throw new Error('PostgreSQL JSON_SET currently only supports simple dot-separated paths');\n }\n const segments = trimmed\n .split('.')\n .map(segment => segment.replace(/^['\"]?/, '').replace(/['\"]?$/, '').trim())\n .filter(Boolean);\n if (!segments.length) {\n throw new Error('PostgreSQL JSON_SET requires at least one path segment');\n }\n const escapedSegments = segments.map(segment => `'${segment.replace(/'/g, \"''\")}'`);\n return `ARRAY[${escapedSegments.join(', ')}]`;\n }\n}\n","import { StandardTableFunctionStrategy } from '../../functions/standard-table-strategy.js';\n\nexport class PostgresTableFunctionStrategy extends StandardTableFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\n private registerOverrides() {\n this.add('ARRAY_UNNEST', ({ node, compiledArgs, quoteIdentifier }) => {\n const lateral = node.lateral ?? true;\n const withOrd = node.withOrdinality ?? false;\n const base = `unnest(${compiledArgs.join(', ')})${withOrd ? ' WITH ORDINALITY' : ''}`;\n\n if (node.columnAliases?.length && !node.alias) {\n throw new Error('tvf(ARRAY_UNNEST) with columnAliases requires an alias.');\n }\n\n const alias = node.alias ? ` AS ${quoteIdentifier(node.alias)}` : '';\n const cols = node.columnAliases?.length\n ? `(${node.columnAliases.map(quoteIdentifier).join(', ')})`\n : '';\n\n return `${lateral ? 'LATERAL ' : ''}${base}${alias}${cols}`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode, BitwiseExpressionNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\nimport { PostgresFunctionStrategy } from './functions.js';\nimport { PostgresTableFunctionStrategy } from './table-functions.js';\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy(), new PostgresTableFunctionStrategy());\n this.registerExpressionCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n const op = node.operator === '^' ? '#' : node.operator;\r\n return `${left} ${op} ${right}`;\r\n });\r\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\r\n const left = this.compileOperand(node.left, ctx);\r\n const right = this.compileOperand(node.right, ctx);\r\n const op = node.operator === '^' ? '#' : node.operator;\r\n return `(${left} ${op} ${right})`;\r\n });\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n void ctx;\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * MySQL/MariaDB specific function strategy.\r\n * Implements and overrides SQL function compilation rules for MySQL.\r\n */\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `HOUR(${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `MINUTE(${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `SECOND(${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `QUARTER(${compiledArgs[0]})`);\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments (array, value)');\n return `JSON_ARRAY_APPEND(${compiledArgs[0]}, '$', ${compiledArgs[1]})`;\n });\n }\n}\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * SQLite specific function strategy.\r\n * Implements and overrides SQL function compilation rules for SQLite.\r\n */\r\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n return `GROUP_CONCAT(${arg}, ${separator})`;\r\n });\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `CAST(strftime('%H', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('MINUTE', ({ compiledArgs }) => `CAST(strftime('%M', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('SECOND', ({ compiledArgs }) => `CAST(strftime('%S', ${compiledArgs[0]}) AS INTEGER)`);\r\n this.add('QUARTER', ({ compiledArgs }) => `((CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER) + 2) / 3)`);\n\n this.add('JSON_LENGTH', ({ compiledArgs }) => {\n if (compiledArgs.length === 0 || compiledArgs.length > 2) {\n throw new Error('JSON_LENGTH expects 1 or 2 arguments on SQLite');\n }\n return `json_array_length(${compiledArgs.join(', ')})`;\n });\n\n this.add('JSON_ARRAYAGG', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) {\n throw new Error('JSON_ARRAYAGG expects 1 argument on SQLite');\n }\n return `json_group_array(${compiledArgs[0]})`;\n });\n\n this.add('JSON_CONTAINS', () => {\n throw new Error('JSON_CONTAINS is not supported on SQLite');\n });\n\n this.add('ARRAY_APPEND', ({ compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('ARRAY_APPEND expects 2 arguments (array, value)');\n return `json_array_append(${compiledArgs[0]}, '$', ${compiledArgs[1]})`;\n });\n\n this.add('CHR', ({ compiledArgs }) => `CHAR(${compiledArgs[0]})`);\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode, BitwiseExpressionNode } from '../../ast/expression.js';\nimport { TableNode } from '../../ast/query.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\nimport { SqliteFunctionStrategy } from './functions.js';\n\n/**\n * SQLite dialect implementation\n */\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n this.registerExpressionCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\n const left = this.compileOperand(node.left, ctx);\n const right = this.compileOperand(node.right, ctx);\n if (node.operator === '^') {\n return `(${left} | ${right}) & ~(${left} & ${right})`;\n }\n return `${left} ${node.operator} ${right}`;\n });\n this.registerOperandCompiler('BitwiseExpression', (node: BitwiseExpressionNode, ctx) => {\n const left = this.compileOperand(node.left, ctx);\n const right = this.compileOperand(node.right, ctx);\n if (node.operator === '^') {\n return `((${left} | ${right}) & ~(${left} & ${right}))`;\n }\n return `(${left} ${node.operator} ${right})`;\n });\n }\n\n /**\n * Quotes an identifier using SQLite double-quote syntax\n * @param id - Identifier to quote\n * @returns Quoted identifier\n */\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n /**\n * Compiles JSON path expression using SQLite syntax\n * @param node - JSON path node\n * @returns SQLite JSON path expression\n */\n protected compileJsonPath(node: JsonPathNode): string {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // SQLite uses json_extract(col, '$.path')\n return `json_extract(${col}, '${node.path}')`;\n }\n\n protected compileQualifiedColumn(column: ColumnNode, _table: TableNode): string {\n void _table;\n return this.quoteIdentifier(column.name);\n }\n\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n void ctx;\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\n supportsReturning(): boolean {\n return true;\n }\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * Microsoft SQL Server specific function strategy.\r\n * Implements and overrides SQL function compilation rules for MSSQL.\r\n */\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `DATEPART(wk, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQL Server 2022+ has DATETRUNC\r\n return `DATETRUNC(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('GROUP_CONCAT', ctx => {\r\n const arg = ctx.compiledArgs[0];\r\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\r\n const separator = ctx.compileOperand(separatorOperand);\r\n const orderClause = this.buildOrderByExpression(ctx);\r\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\r\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\r\n });\r\n\r\n this.add('LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('CHAR_LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('CHARACTER_LENGTH', ({ compiledArgs }) => `LEN(${compiledArgs[0]})`);\r\n this.add('POSITION', ({ compiledArgs }) => `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('LOCATE', ({ compiledArgs }) => compiledArgs.length === 3 ? `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})` : `CHARINDEX(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('INSTR', ({ compiledArgs }) => `CHARINDEX(${compiledArgs[1]}, ${compiledArgs[0]})`);\r\n this.add('CHR', ({ compiledArgs }) => `CHAR(${compiledArgs[0]})`);\r\n\r\n this.add('HOUR', ({ compiledArgs }) => `DATEPART(hour, ${compiledArgs[0]})`);\n this.add('MINUTE', ({ compiledArgs }) => `DATEPART(minute, ${compiledArgs[0]})`);\n this.add('SECOND', ({ compiledArgs }) => `DATEPART(second, ${compiledArgs[0]})`);\n this.add('QUARTER', ({ compiledArgs }) => `DATEPART(quarter, ${compiledArgs[0]})`);\n\n this.add('JSON_SET', ({ compiledArgs }) => {\n if (compiledArgs.length !== 3) throw new Error('JSON_SET expects 3 arguments on SQL Server');\n return `JSON_MODIFY(${compiledArgs[0]}, ${compiledArgs[1]}, ${compiledArgs[2]})`;\n });\n\n this.add('JSON_LENGTH', () => {\n throw new Error('JSON_LENGTH is not supported on SQL Server');\n });\n\n this.add('JSON_ARRAYAGG', () => {\n throw new Error('JSON_ARRAYAGG is not supported on SQL Server');\n });\n\n this.add('JSON_CONTAINS', () => {\n throw new Error('JSON_CONTAINS is not supported on SQL Server');\n });\n\n this.add('ARRAY_APPEND', () => {\n throw new Error('ARRAY_APPEND is not supported on SQL Server');\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\nimport {\n SelectQueryNode,\n DeleteQueryNode\n} from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { OrderByCompiler } from '../base/orderby-compiler.js';\nimport { JoinCompiler } from '../base/join-compiler.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * Microsoft SQL Server dialect implementation\n */\nexport class SqlServerDialect extends SqlDialectBase {\n protected readonly dialect = 'mssql';\n /**\n * Creates a new SqlServerDialect instance\n */\n public constructor() {\n super(new MssqlFunctionStrategy());\n }\n\n /**\n * Quotes an identifier using SQL Server bracket syntax\n * @param id - Identifier to quote\n * @returns Quoted identifier\n */\n quoteIdentifier(id: string): string {\n return `[${id}]`;\n }\n\n /**\n * Compiles JSON path expression using SQL Server syntax\n * @param node - JSON path node\n * @returns SQL Server JSON path expression\n */\n protected compileJsonPath(node: JsonPathNode): string {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // SQL Server uses JSON_VALUE(col, '$.path')\n return `JSON_VALUE(${col}, '${node.path}')`;\n }\n\n /**\n * Formats parameter placeholders using SQL Server named parameter syntax\n * @param index - Parameter index\n * @returns Named parameter placeholder\n */\n protected formatPlaceholder(index: number): string {\n return `@p${index}`;\n }\n\n /**\n * Compiles SELECT query AST to SQL Server SQL\n * @param ast - Query AST\n * @param ctx - Compiler context\n * @returns SQL Server SQL string\n */\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\n const ctes = this.compileCtes(ast, ctx);\n\n const baseAst: SelectQueryNode = hasSetOps\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\n : ast;\n\n const baseSelect = this.compileSelectCoreForMssql(baseAst, ctx);\n\n if (!hasSetOps) {\n return `${ctes}${baseSelect}`;\n }\n\n const compound = ast.setOps!\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\n .join(' ');\n\n const orderBy = this.compileOrderBy(ast, ctx);\n const pagination = this.compilePagination(ast, orderBy);\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\n const tail = pagination || orderBy;\n return `${ctes}${combined}${tail}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (ast.using) {\n throw new Error('DELETE ... USING is not supported in the MSSQL dialect; use join() instead.');\n }\n\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\n\n const alias = ast.from.alias ?? ast.from.name;\n const target = this.compileTableReference(ast.from);\n const joins = JoinCompiler.compileJoins(\n ast.joins,\n ctx,\n this.compileFrom.bind(this),\n this.compileExpression.bind(this)\n );\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE ${this.quoteIdentifier(alias)} FROM ${target}${joins}${whereClause}${returning}`;\n }\n\n private compileSelectCoreForMssql(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = ast.columns.map(c => {\n // Default to full operand compilation for all projection node types (Function, Column, Cast, Case, Window, etc)\n const expr = c.type === 'Column'\n ? `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`\n : this.compileOperand(c as unknown as import('../../ast/expression.js').OperandNode, ctx);\n\n if (c.alias) {\n if (c.alias.includes('(')) return c.alias;\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\n }\n return expr;\n }).join(', ');\n\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileFrom(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileFrom(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\n\n const groupBy = ast.groupBy && ast.groupBy.length > 0\n ? ' GROUP BY ' + ast.groupBy.map(term => this.compileOrderingTerm(term, ctx)).join(', ')\n : '';\n\n const having = ast.having\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\n : '';\n\n const orderBy = this.compileOrderBy(ast, ctx);\n const pagination = this.compilePagination(ast, orderBy);\n\n if (pagination) {\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\n }\n\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\n }\n\n private compileOrderBy(ast: SelectQueryNode, ctx: CompilerContext): string {\n return OrderByCompiler.compileOrderBy(\n ast,\n term => this.compileOrderingTerm(term, ctx),\n this.renderOrderByNulls.bind(this),\n this.renderOrderByCollation.bind(this)\n );\n }\n\n private compilePagination(ast: SelectQueryNode, orderBy: string): string {\n const hasLimit = ast.limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n if (!hasLimit && !hasOffset) return '';\n\n const off = ast.offset ?? 0;\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.ctes || ast.ctes.length === 0) return '';\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\n const defs = ast.ctes.map(cte => {\n const name = this.quoteIdentifier(cte.name);\n const cols = cte.columns ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})` : '';\n const query = this.compileSelectAst(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\n return `${name}${cols} AS (${query})`;\n }).join(', ');\n return `WITH ${defs} `;\n }\n\n}\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport {\n SelectQueryNode,\n CommonTableExpressionNode,\n OrderByNode,\n SetOperationNode,\n TableSourceNode,\n OrderingTerm\n} from '../core/ast/query.js';\nimport { createTableNode } from '../core/ast/builders.js';\nimport {\n ColumnNode,\n ExpressionNode,\n FunctionNode,\n ScalarSubqueryNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode\n} from '../core/ast/expression.js';\nimport { JoinNode } from '../core/ast/join.js';\n\n/**\n * Node types that can be used in query projections\n */\nexport type ProjectionNode =\n | ColumnNode\n | FunctionNode\n | ScalarSubqueryNode\n | CaseExpressionNode\n | CastExpressionNode\n | WindowFunctionNode;\n\n/**\n * Manages the state of a SELECT query being built\n */\nexport class SelectQueryState {\n /**\n * Table definition for the query\n */\n public readonly table: TableDef;\n /**\n * Abstract Syntax Tree (AST) representation of the query\n */\n public readonly ast: SelectQueryNode;\n\n /**\n * Creates a new SelectQueryState instance\n * @param table - Table definition\n * @param ast - Optional existing AST\n */\n constructor(table: TableDef, ast?: SelectQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'SelectQuery',\n from: createTableNode(table),\n columns: [],\n joins: []\n };\n }\n\n /**\n * Creates a new SelectQueryState with updated AST\n * @param nextAst - Updated AST\n * @returns New SelectQueryState instance\n */\n private clone(nextAst: SelectQueryNode): SelectQueryState {\n return new SelectQueryState(this.table, nextAst);\n }\n\n /**\n * Adds columns to the query\n * @param newCols - Columns to add\n * @returns New SelectQueryState with added columns\n */\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n columns: [...(this.ast.columns ?? []), ...newCols]\n });\n }\n\n /**\n * Adds a join to the query\n * @param join - Join node to add\n * @returns New SelectQueryState with added join\n */\n withJoin(join: JoinNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\n /**\n * Adds a WHERE clause to the query\n * @param predicate - WHERE predicate expression\n * @returns New SelectQueryState with WHERE clause\n */\n withWhere(predicate: ExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n where: predicate\n });\n }\n\n /**\n * Adds a HAVING clause to the query\n * @param predicate - HAVING predicate expression\n * @returns New SelectQueryState with HAVING clause\n */\n withHaving(predicate: ExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n having: predicate\n });\n }\n\n /**\n * Adds GROUP BY columns to the query\n * @param columns - Terms to group by\n * @returns New SelectQueryState with GROUP BY clause\n */\n withGroupBy(columns: OrderingTerm[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\n });\n }\n\n /**\n * Adds ORDER BY clauses to the query\n * @param orderBy - ORDER BY nodes\n * @returns New SelectQueryState with ORDER BY clause\n */\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\n });\n }\n\n /**\n * Adds DISTINCT columns to the query\n * @param columns - Columns to make distinct\n * @returns New SelectQueryState with DISTINCT clause\n */\n withDistinct(columns: ColumnNode[]): SelectQueryState {\n return this.clone({\n ...this.ast,\n distinct: [...(this.ast.distinct ?? []), ...columns]\n });\n }\n\n /**\n * Adds a LIMIT clause to the query\n * @param limit - Maximum number of rows to return\n * @returns New SelectQueryState with LIMIT clause\n */\n withLimit(limit: number): SelectQueryState {\n return this.clone({\n ...this.ast,\n limit\n });\n }\n\n /**\n * Adds an OFFSET clause to the query\n * @param offset - Number of rows to skip\n * @returns New SelectQueryState with OFFSET clause\n */\n withOffset(offset: number): SelectQueryState {\n return this.clone({\n ...this.ast,\n offset\n });\n }\n\n /**\n * Adds a Common Table Expression (CTE) to the query\n * @param cte - CTE node to add\n * @returns New SelectQueryState with CTE\n */\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n ctes: [...(this.ast.ctes ?? []), cte]\n });\n }\n\n /**\n * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query\n * @param op - Set operation node to add\n * @returns New SelectQueryState with set operation\n */\n withSetOperation(op: SetOperationNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n setOps: [...(this.ast.setOps ?? []), op]\n });\n }\n}\n","import { JoinNode } from './join.js';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? (parseQualifiedTableRef(tableName) as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n\n/**\n * Parses a simple qualified reference like `schema.table` into a structured TableNode.\n *\n * Notes:\n * - We intentionally only support a single dot here.\n * - For multi-part qualification (server/db/schema/table), callers should pass a TableNode.\n */\nconst parseQualifiedTableRef = (ref: string): TableNode => {\n const parts = ref.split('.');\n if (parts.length === 2) {\n const [schema, name] = parts;\n return { type: 'Table', schema, name };\n }\n return { type: 'Table', name: ref };\n};\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\n/**\n * Manages hydration planning for query results\n */\nexport class HydrationManager {\n /**\n * Creates a new HydrationManager instance\n * @param table - Table definition\n * @param planner - Hydration planner\n */\n constructor(\n private readonly table: TableDef,\n private readonly planner: HydrationPlanner\n ) { }\n\n /**\n * Creates a new HydrationManager with updated planner\n * @param nextPlanner - Updated hydration planner\n * @returns New HydrationManager instance\n */\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\n return new HydrationManager(this.table, nextPlanner);\n }\n\n /**\n * Handles column selection for hydration planning\n * @param state - Current query state\n * @param newColumns - Newly selected columns\n * @returns Updated HydrationManager with captured columns\n */\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\n const updated = this.planner.captureRootColumns(newColumns);\n return this.clone(updated);\n }\n\n /**\n * Handles relation inclusion for hydration planning\n * @param state - Current query state\n * @param relation - Relation definition\n * @param relationName - Name of the relation\n * @param aliasPrefix - Alias prefix for the relation\n * @param targetColumns - Target columns to include\n * @returns Updated HydrationManager with included relation\n */\n onRelationIncluded(\n state: SelectQueryState,\n relation: RelationDef,\n relationName: string,\n aliasPrefix: string,\n targetColumns: string[],\n pivot?: { aliasPrefix: string; columns: string[] }\n ): HydrationManager {\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\n return this.clone(next);\n }\n\n /**\n * Applies hydration plan to the AST\n * @param ast - Query AST to modify\n * @returns AST with hydration metadata\n */\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\n // Hydration is not applied to compound set queries since row identity is ambiguous.\n if (ast.setOps && ast.setOps.length > 0) {\n return ast;\n }\n\n const plan = this.planner.getPlan();\n if (!plan) return ast;\n\n const needsPaginationGuard = this.requiresParentPagination(ast, plan);\n const rewritten = needsPaginationGuard ? this.wrapForParentPagination(ast, plan) : ast;\n return this.attachHydrationMeta(rewritten, plan);\n }\n\n /**\n * Gets the current hydration plan\n * @returns Hydration plan or undefined if none exists\n */\n getPlan(): HydrationPlan | undefined {\n return this.planner.getPlan();\n }\n\n /**\n * Attaches hydration metadata to a query AST node.\n */\n private attachHydrationMeta(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n return {\n ...ast,\n meta: {\n ...(ast.meta || {}),\n hydration: plan\n }\n };\n }\n\n /**\n * Determines whether the query needs pagination rewriting to keep LIMIT/OFFSET\n * applied to parent rows when eager-loading multiplicative relations.\n */\n private requiresParentPagination(ast: SelectQueryNode, plan: HydrationPlan): boolean {\n const hasPagination = ast.limit !== undefined || ast.offset !== undefined;\n return hasPagination && this.hasMultiplyingRelations(plan);\n }\n\n /**\n * Checks if the hydration plan contains relations that multiply rows\n * @param plan - Hydration plan to check\n * @returns True if plan has HasMany or BelongsToMany relations\n */\n private hasMultiplyingRelations(plan: HydrationPlan): boolean {\n return plan.relations.some(\n rel => rel.type === RelationKinds.HasMany || rel.type === RelationKinds.BelongsToMany\n );\n }\n\n /**\n * Rewrites the query using CTEs so LIMIT/OFFSET target distinct parent rows\n * instead of the joined result set.\n *\n * The strategy:\n * - Hoist the original query (minus limit/offset) into a base CTE.\n * - Select distinct parent ids from that base CTE with the original ordering and pagination.\n * - Join the base CTE against the paged ids to retrieve the joined rows for just that page.\n */\n private wrapForParentPagination(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n const projectionNames = this.getProjectionNames(ast.columns);\n if (!projectionNames) {\n return ast;\n }\n\n const projectionAliases = this.buildProjectionAliasMap(ast.columns);\n const projectionSet = new Set(projectionNames);\n const rootPkAlias = projectionAliases.get(`${plan.rootTable}.${plan.rootPrimaryKey}`) ?? plan.rootPrimaryKey;\n\n const baseCteName = this.nextCteName(ast.ctes, '__metal_pagination_base');\n const baseQuery: SelectQueryNode = {\n ...ast,\n ctes: undefined,\n limit: undefined,\n offset: undefined,\n orderBy: undefined,\n meta: undefined\n };\n\n const baseCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: baseCteName,\n query: baseQuery,\n recursive: false\n };\n\n const orderBy = this.mapOrderBy(ast.orderBy, plan, projectionAliases, baseCteName, projectionSet);\n // When an order-by uses child-table columns we cannot safely rewrite pagination,\n // so preserve the original query to avoid changing semantics.\n if (orderBy === null) {\n return ast;\n }\n\n const pageCteName = this.nextCteName([...(ast.ctes ?? []), baseCte], '__metal_pagination_page');\n const pagingColumns = this.buildPagingColumns(rootPkAlias, orderBy, baseCteName);\n\n const pageCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: pageCteName,\n query: {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: pagingColumns,\n joins: [],\n distinct: [{ type: 'Column', table: baseCteName, name: rootPkAlias }],\n orderBy,\n limit: ast.limit,\n offset: ast.offset\n },\n recursive: false\n };\n\n const joinCondition = eq(\n { type: 'Column', table: baseCteName, name: rootPkAlias },\n { type: 'Column', table: pageCteName, name: rootPkAlias }\n );\n\n const outerColumns: ColumnNode[] = projectionNames.map(name => ({\n type: 'Column',\n table: baseCteName,\n name,\n alias: name\n }));\n\n return {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: outerColumns,\n joins: [createJoinNode(JOIN_KINDS.INNER, pageCteName, joinCondition)],\n orderBy,\n ctes: [...(ast.ctes ?? []), baseCte, pageCte]\n };\n }\n\n /**\n * Generates a unique CTE name by appending a suffix if needed\n * @param existing - Existing CTE nodes\n * @param baseName - Base name for the CTE\n * @returns Unique CTE name\n */\n private nextCteName(existing: CommonTableExpressionNode[] | undefined, baseName: string): string {\n const names = new Set((existing ?? []).map(cte => cte.name));\n let candidate = baseName;\n let suffix = 1;\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `${baseName}_${suffix}`;\n }\n\n return candidate;\n }\n\n /**\n * Extracts projection names from column nodes\n * @param columns - Projection nodes\n * @returns Array of names or undefined if any column lacks name/alias\n */\n private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const node = col as { alias?: string; name?: string };\n const alias = node.alias ?? node.name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\n\n /**\n * Builds a map of column keys to their aliases from projection nodes\n * @param columns - Projection nodes\n * @returns Map of 'table.name' to alias\n */\n private buildProjectionAliasMap(columns: ProjectionNode[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const col of columns) {\n if ((col as ColumnNode).type !== 'Column') continue;\n const node = col as ColumnNode;\n const key = `${node.table}.${node.name}`;\n map.set(key, node.alias ?? node.name);\n }\n return map;\n }\n\n /**\n * Maps order by nodes to use base CTE alias\n * @param orderBy - Original order by nodes\n * @param plan - Hydration plan\n * @param projectionAliases - Map of column aliases\n * @param baseAlias - Base CTE alias\n * @param availableColumns - Set of available column names\n * @returns Mapped order by nodes, null if cannot map\n */\n private mapOrderBy(\n orderBy: OrderByNode[] | undefined,\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode[] | undefined | null {\n if (!orderBy || orderBy.length === 0) {\n return undefined;\n }\n\n const mapped: OrderByNode[] = [];\n\n for (const ob of orderBy) {\n const mappedTerm = this.mapOrderingTerm(ob.term, plan, projectionAliases, baseAlias, availableColumns);\n if (!mappedTerm) return null;\n\n mapped.push({ ...ob, term: mappedTerm });\n }\n\n return mapped;\n }\n\n /**\n * Maps a single ordering term to use base CTE alias\n * @param term - Ordering term to map\n * @param plan - Hydration plan\n * @param projectionAliases - Map of column aliases\n * @param baseAlias - Base CTE alias\n * @param availableColumns - Set of available column names\n * @returns Mapped term or null if cannot map\n */\n private mapOrderingTerm(\n term: OrderByNode['term'],\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode['term'] | null {\n if (term.type === 'Column') {\n const col = term as ColumnNode;\n if (col.table !== plan.rootTable) return null;\n const alias = projectionAliases.get(`${col.table}.${col.name}`) ?? col.name;\n if (!availableColumns.has(alias)) return null;\n return { type: 'Column', table: baseAlias, name: alias };\n }\n\n if (term.type === 'AliasRef') {\n const aliasName = term.name;\n if (!availableColumns.has(aliasName)) return null;\n return { type: 'Column', table: baseAlias, name: aliasName };\n }\n\n return null;\n }\n\n /**\n * Builds column nodes for paging CTE\n * @param primaryKey - Primary key name\n * @param orderBy - Order by nodes\n * @param tableAlias - Table alias for columns\n * @returns Array of column nodes for paging\n */\n private buildPagingColumns(primaryKey: string, orderBy: OrderByNode[] | undefined, tableAlias: string): ColumnNode[] {\n const columns: ColumnNode[] = [{ type: 'Column', table: tableAlias, name: primaryKey, alias: primaryKey }];\n\n if (!orderBy) return columns;\n\n for (const ob of orderBy) {\n const term = ob.term as ColumnNode;\n if (!columns.some(col => col.name === term.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: term.name,\n alias: term.name\n });\n }\n }\n\n return columns;\n }\n}\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n * @param relationName - The name of the relation\n * @param columnName - The name of the column within the relation\n * @returns A relation alias string in the format \"relationName__columnName\"\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n * @param alias - The relation alias string to parse\n * @returns Parsed relation alias parts or null if not a valid relation alias\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n * @param alias - The alias string to check\n * @returns True if the alias follows the relation alias pattern\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n * @param rel - The BelongsToMany relation definition\r\n * @param pivotPk - The primary key column name of the pivot table\r\n * @returns Array of column names that can be included in pivot table selections\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n *\r\n * @param col - Raw column expression string (e.g., \"column\", \"table.column\", \"COUNT(column)\")\r\n * @param tableName - Default table name to use when no table is specified\r\n * @param ctes - Optional array of CTEs for context when parsing column references\r\n * @returns A ColumnNode representing the parsed column expression\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [_fn, rest] = col.split('(');\r\n void _fn;\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport { ColumnDef } from '../schema/column-types.js';\nimport {\n SelectQueryNode,\n CommonTableExpressionNode,\n SetOperationKind,\n SetOperationNode,\n TableSourceNode,\n OrderingTerm\n} from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\nimport {\n AliasRefNode,\n ColumnNode,\n ExpressionNode,\n FunctionNode,\n CaseExpressionNode,\n CastExpressionNode,\n WindowFunctionNode,\n ScalarSubqueryNode,\n and,\n isExpressionSelectionNode,\n isOperandNode\n} from '../core/ast/expression.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\nimport { OrderDirection } from '../core/sql/sql.js';\nimport { parseRawColumn } from './raw-column-parser.js';\n\n/**\n * Result of column selection operation\n */\nexport interface ColumnSelectionResult {\n /**\n * Updated query state\n */\n state: SelectQueryState;\n /**\n * Columns that were added\n */\n addedColumns: ProjectionNode[];\n}\n\n/**\n * Service for manipulating query AST (Abstract Syntax Tree)\n */\nexport class QueryAstService {\n /**\n * Creates a new QueryAstService instance\n * @param table - Table definition\n * @param state - Current query state\n */\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) { }\n\n /**\n * Selects columns for the query\n * @param columns - Columns to select (key: alias, value: column definition or expression)\n * @returns Column selection result with updated state and added columns\n */\n select(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\n /**\n * Selects raw column expressions (best-effort parser for simple references/functions)\n * @param cols - Raw column expressions\n * @returns Column selection result with updated state and added columns\n */\n selectRaw(cols: string[]): ColumnSelectionResult {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\n /**\n * Adds a Common Table Expression (CTE) to the query\n * @param name - Name of the CTE\n * @param query - Query for the CTE\n * @param columns - Optional column names for the CTE\n * @param recursive - Whether the CTE is recursive\n * @returns Updated query state with CTE\n */\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\n const cte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name,\n query,\n columns,\n recursive\n };\n\n return this.state.withCte(cte);\n }\n\n /**\n * Adds a set operation (UNION/UNION ALL/INTERSECT/EXCEPT) to the query\n * @param operator - Set operator\n * @param query - Right-hand side query\n * @returns Updated query state with set operation\n */\n withSetOperation(operator: SetOperationKind, query: SelectQueryNode): SelectQueryState {\n const op: SetOperationNode = {\n type: 'SetOperation',\n operator,\n query\n };\n return this.state.withSetOperation(op);\n }\n\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\n /**\n * Selects a subquery as a column\n * @param alias - Alias for the subquery\n * @param query - Subquery to select\n * @returns Updated query state with subquery selection\n */\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\n return this.state.withColumns([node]);\n }\n\n /**\n * Adds a JOIN clause to the query\n * @param join - Join node to add\n * @returns Updated query state with JOIN\n */\n withJoin(join: JoinNode): SelectQueryState {\n return this.state.withJoin(join);\n }\n\n /**\n * Adds a WHERE clause to the query\n * @param expr - Expression for the WHERE clause\n * @returns Updated query state with WHERE clause\n */\n withWhere(expr: ExpressionNode): SelectQueryState {\n const combined = this.combineExpressions(this.state.ast.where, expr);\n return this.state.withWhere(combined);\n }\n\n /**\n * Adds a GROUP BY clause to the query\n * @param col - Column to group by\n * @returns Updated query state with GROUP BY clause\n */\n withGroupBy(col: ColumnDef | OrderingTerm): SelectQueryState {\n const term = this.normalizeOrderingTerm(col);\n return this.state.withGroupBy([term]);\n }\n\n /**\n * Adds a HAVING clause to the query\n * @param expr - Expression for the HAVING clause\n * @returns Updated query state with HAVING clause\n */\n withHaving(expr: ExpressionNode): SelectQueryState {\n const combined = this.combineExpressions(this.state.ast.having, expr);\n return this.state.withHaving(combined);\n }\n\n /**\n * Adds an ORDER BY clause to the query\n * @param col - Column to order by\n * @param direction - Order direction (ASC/DESC)\n * @returns Updated query state with ORDER BY clause\n */\n withOrderBy(\n term: ColumnDef | OrderingTerm,\n direction: OrderDirection,\n nulls?: 'FIRST' | 'LAST',\n collation?: string\n ): SelectQueryState {\n const normalized = this.normalizeOrderingTerm(term);\n return this.state.withOrderBy([{ type: 'OrderBy', term: normalized, direction, nulls, collation }]);\n }\n\n /**\n * Adds a DISTINCT clause to the query\n * @param cols - Columns to make distinct\n * @returns Updated query state with DISTINCT clause\n */\n withDistinct(cols: ColumnNode[]): SelectQueryState {\n return this.state.withDistinct(cols);\n }\n\n /**\n * Adds a LIMIT clause to the query\n * @param limit - Maximum number of rows to return\n * @returns Updated query state with LIMIT clause\n */\n withLimit(limit: number): SelectQueryState {\n return this.state.withLimit(limit);\n }\n\n /**\n * Adds an OFFSET clause to the query\n * @param offset - Number of rows to skip\n * @returns Updated query state with OFFSET clause\n */\n withOffset(offset: number): SelectQueryState {\n return this.state.withOffset(offset);\n }\n\n /**\n * Combines expressions with AND operator\n * @param existing - Existing expression\n * @param next - New expression to combine\n * @returns Combined expression\n */\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\n return existing ? and(existing, next) : next;\n }\n\n /**\n * Normalizes an ordering term to a standard OrderingTerm\n * @param term - Column definition or ordering term to normalize\n * @returns Normalized ordering term\n */\n private normalizeOrderingTerm(term: ColumnDef | OrderingTerm): OrderingTerm {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const termType = (term as { type?: string }).type;\n if (termType === 'Column') {\n return term as ColumnNode;\n }\n if (termType === 'AliasRef') {\n return term as AliasRefNode;\n }\n if (isOperandNode(term)) {\n return term as OrderingTerm;\n }\n if (\n termType === 'BinaryExpression' ||\n termType === 'LogicalExpression' ||\n termType === 'NullExpression' ||\n termType === 'InExpression' ||\n termType === 'ExistsExpression' ||\n termType === 'BetweenExpression' ||\n termType === 'ArithmeticExpression'\n ) {\n return term as ExpressionNode;\n }\n return buildColumnNode(tableRef, term as ColumnDef);\n }\n\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n\r\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\nimport { TableSourceNode } from '../core/ast/query.js';\nimport { findPrimaryKey } from './hydration-planner.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { JoinKind } from '../core/sql/sql.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (\n root: TableDef,\n relation: RelationDef,\n rootAlias?: string,\n targetTableName?: string\n): ExpressionNode => {\n const rootTable = rootAlias || root.name;\n const targetTable = targetTableName ?? relation.target.name;\n const defaultLocalKey =\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\n ? findPrimaryKey(root)\n : findPrimaryKey(relation.target);\n const localKey = relation.localKey || defaultLocalKey;\r\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne:\n return eq(\n { type: 'Column', table: targetTable, name: relation.foreignKey },\n { type: 'Column', table: rootTable, name: localKey }\n );\n case RelationKinds.BelongsTo:\n return eq(\n { type: 'Column', table: targetTable, name: localKey },\n { type: 'Column', table: rootTable, name: relation.foreignKey }\n );\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n * @param root - The root table definition\r\n * @param relationName - Name of the relation being joined\r\n * @param relation - The BelongsToMany relation definition\r\n * @param joinKind - The type of join to perform\r\n * @param extra - Optional additional conditions for the target join\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Array of join nodes for the pivot and target tables\r\n */\r\nexport const buildBelongsToManyJoins = (\n root: TableDef,\n relationName: string,\n relation: BelongsToManyRelation,\n joinKind: JoinKind,\n extra?: ExpressionNode,\n rootAlias?: string,\n targetTable?: TableSourceNode,\n targetTableName?: string\n): JoinNode[] => {\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const rootTable = rootAlias || root.name;\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: rootTable, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(\r\n joinKind,\r\n { type: 'Table', name: relation.pivotTable.name, schema: relation.pivotTable.schema },\r\n pivotCondition\r\n );\r\n\r\n const targetSource: TableSourceNode = targetTable ?? {\n type: 'Table',\n name: relation.target.name,\n schema: relation.target.schema\n };\n const effectiveTargetName = targetTableName ?? relation.target.name;\n let targetCondition: ExpressionNode = eq(\n { type: 'Column', table: effectiveTargetName, name: targetKey },\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\n );\n\n if (extra) {\n targetCondition = and(targetCondition, extra);\n }\n\n const targetJoin = createJoinNode(\n joinKind,\n targetSource,\n targetCondition,\n relationName\n );\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\n root: TableDef,\n relation: RelationDef,\n extra?: ExpressionNode,\n rootAlias?: string,\n targetTableName?: string\n): ExpressionNode => {\n const base = baseRelationCondition(root, relation, rootAlias, targetTableName);\n return extra ? and(base, extra) : base;\n};\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param rootAlias - Optional alias for the root table\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (\n root: TableDef,\n relation: RelationDef,\n rootAlias?: string,\n targetTableName?: string\n): ExpressionNode => {\n return baseRelationCondition(root, relation, rootAlias, targetTableName);\n};\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport {\n RelationDef,\n RelationKinds,\n BelongsToManyRelation,\n HasManyRelation,\n HasOneRelation,\n BelongsToRelation\n} from '../schema/relation.js';\nimport { SelectQueryNode, TableSourceNode, TableNode, OrderingTerm } from '../core/ast/query.js';\nimport {\n ColumnNode,\n ExpressionNode,\n OperandNode,\n and,\n isOperandNode\n} from '../core/ast/expression.js';\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\nimport { makeRelationAlias } from './relation-alias.js';\nimport { buildDefaultPivotColumns } from './relation-utils.js';\n\ntype FilterTableCollector = {\n tables: Set<string>;\n hasSubquery: boolean;\n};\n\ntype RelationWithForeignKey =\n | HasManyRelation\n | HasOneRelation\n | BelongsToRelation;\n\nconst hasRelationForeignKey = (relation: RelationDef): relation is RelationWithForeignKey =>\n relation.type !== RelationKinds.BelongsToMany;\n\n/**\n * Service for handling relation operations (joins, includes, etc.)\n */\nexport class RelationService {\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode,\n tableSource?: TableSourceNode\n ): RelationResult {\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition, tableSource);\n return { state: nextState, hydration: this.hydration };\n }\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\r\n relationName: string,\r\n predicate?: ExpressionNode\r\n ): RelationResult {\r\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\r\n const pk = findPrimaryKey(this.table);\r\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\r\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\r\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\r\n return { state: nextState, hydration: joined.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\n let state = this.state;\n let hydration = this.hydration;\n\n const relation = this.getRelation(relationName);\n const aliasPrefix = options?.aliasPrefix ?? relationName;\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\n const { selfFilters, crossFilters } = this.splitFilterExpressions(\n options?.filter,\n new Set([relation.target.name])\n );\n const canUseCte = !alreadyJoined && selfFilters.length > 0;\n const joinFilters = [...crossFilters];\n if (!canUseCte) {\n joinFilters.push(...selfFilters);\n }\n const joinCondition = this.combineWithAnd(joinFilters);\n\n let tableSourceOverride: TableNode | undefined;\n if (canUseCte) {\n const cteInfo = this.createFilteredRelationCte(state, relationName, relation, selfFilters);\n state = cteInfo.state;\n tableSourceOverride = cteInfo.table;\n }\n\n if (!alreadyJoined) {\n state = this.withJoin(\n state,\n relationName,\n options?.joinKind ?? JOIN_KINDS.LEFT,\n joinCondition,\n tableSourceOverride\n );\n }\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\n state = projectionResult.state;\n hydration = projectionResult.hydration;\n\n if (hasRelationForeignKey(relation)) {\n const fkColumn = this.table.columns[relation.foreignKey];\n if (fkColumn) {\n const hasForeignKeySelected = state.ast.columns.some(col => {\n if ((col as ColumnNode).type !== 'Column') return false;\n const node = col as ColumnNode;\n const alias = node.alias ?? node.name;\n return alias === relation.foreignKey;\n });\n\n if (!hasForeignKeySelected) {\n const fkSelectionResult = this.selectColumns(state, hydration, {\n [relation.foreignKey]: fkColumn\n });\n state = fkSelectionResult.state;\n hydration = fkSelectionResult.hydration;\n }\n }\n }\n\r\n const requestedColumns = options?.columns?.length\n ? [...options.columns]\n : Object.keys(relation.target.columns);\n const targetPrimaryKey = findPrimaryKey(relation.target);\n if (!requestedColumns.includes(targetPrimaryKey)) {\n requestedColumns.push(targetPrimaryKey);\n }\n const targetColumns = requestedColumns;\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ): Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\r\n relationName: string,\r\n ast: SelectQueryNode,\r\n additionalCorrelation?: ExpressionNode\r\n ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\r\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\r\n if (additionalCorrelation) {\r\n correlation = and(correlation, additionalCorrelation);\r\n }\r\n const whereInSubquery = ast.where\r\n ? and(correlation, ast.where)\r\n : correlation;\r\n\r\n return {\r\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\n state: SelectQueryState,\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode,\n tableSource?: TableSourceNode\n ): SelectQueryState {\n const relation = this.getRelation(relationName);\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\n if (relation.type === RelationKinds.BelongsToMany) {\n const targetTableSource: TableSourceNode = tableSource ?? {\n type: 'Table',\n name: relation.target.name,\n schema: relation.target.schema\n };\n const targetName = this.resolveTargetTableName(targetTableSource, relation);\n const joins = buildBelongsToManyJoins(\n this.table,\n relationName,\n relation as BelongsToManyRelation,\n joinKind,\n extraCondition,\n rootAlias,\n targetTableSource,\n targetName\n );\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\n }\n\n const targetTable: TableSourceNode = tableSource ?? {\n type: 'Table',\n name: relation.target.name,\n schema: relation.target.schema\n };\n const targetName = this.resolveTargetTableName(targetTable, relation);\n const condition = buildRelationJoinCondition(\n this.table,\n relation,\n extraCondition,\n rootAlias,\n targetName\n );\n const joinNode = createJoinNode(joinKind, targetTable, condition, relationName);\n\n return this.astService(state).withJoin(joinNode);\n }\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\n state: SelectQueryState,\n hydration: HydrationManager,\n columns: Record<string, ColumnDef>\n ): RelationResult {\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\n return {\n state: nextState,\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\n };\n }\n\n\n private combineWithAnd(expressions: ExpressionNode[]): ExpressionNode | undefined {\n if (expressions.length === 0) return undefined;\n if (expressions.length === 1) return expressions[0];\n return {\n type: 'LogicalExpression',\n operator: 'AND',\n operands: expressions\n };\n }\n\n private splitFilterExpressions(\n filter: ExpressionNode | undefined,\n allowedTables: Set<string>\n ): { selfFilters: ExpressionNode[]; crossFilters: ExpressionNode[] } {\n const terms = this.flattenAnd(filter);\n const selfFilters: ExpressionNode[] = [];\n const crossFilters: ExpressionNode[] = [];\n\n for (const term of terms) {\n if (this.isExpressionSelfContained(term, allowedTables)) {\n selfFilters.push(term);\n } else {\n crossFilters.push(term);\n }\n }\n\n return { selfFilters, crossFilters };\n }\n\n private flattenAnd(node?: ExpressionNode): ExpressionNode[] {\n if (!node) return [];\n if (node.type === 'LogicalExpression' && node.operator === 'AND') {\n return node.operands.flatMap(operand => this.flattenAnd(operand));\n }\n return [node];\n }\n\n private isExpressionSelfContained(expr: ExpressionNode, allowedTables: Set<string>): boolean {\n const collector = this.collectReferencedTables(expr);\n if (collector.hasSubquery) return false;\n if (collector.tables.size === 0) return true;\n for (const table of collector.tables) {\n if (!allowedTables.has(table)) {\n return false;\n }\n }\n return true;\n }\n\n private collectReferencedTables(expr: ExpressionNode): FilterTableCollector {\n const collector: FilterTableCollector = {\n tables: new Set(),\n hasSubquery: false\n };\n this.collectFromExpression(expr, collector);\n return collector;\n }\n\n private collectFromExpression(expr: ExpressionNode, collector: FilterTableCollector): void {\n switch (expr.type) {\n case 'BinaryExpression':\n this.collectFromOperand(expr.left, collector);\n this.collectFromOperand(expr.right, collector);\n break;\n case 'LogicalExpression':\n expr.operands.forEach(operand => this.collectFromExpression(operand, collector));\n break;\n case 'NullExpression':\n this.collectFromOperand(expr.left, collector);\n break;\n case 'InExpression':\n this.collectFromOperand(expr.left, collector);\n if (Array.isArray(expr.right)) {\n expr.right.forEach(value => this.collectFromOperand(value, collector));\n } else {\n collector.hasSubquery = true;\n }\n break;\n case 'ExistsExpression':\n collector.hasSubquery = true;\n break;\n case 'BetweenExpression':\n this.collectFromOperand(expr.left, collector);\n this.collectFromOperand(expr.lower, collector);\n this.collectFromOperand(expr.upper, collector);\n break;\n case 'ArithmeticExpression':\n case 'BitwiseExpression':\n this.collectFromOperand(expr.left, collector);\n this.collectFromOperand(expr.right, collector);\n break;\n default:\n break;\n }\n }\n\n private collectFromOperand(node: OperandNode, collector: FilterTableCollector): void {\n switch (node.type) {\n case 'Column':\n collector.tables.add(node.table);\n break;\n case 'Function':\n node.args.forEach(arg => this.collectFromOperand(arg, collector));\n if (node.separator) {\n this.collectFromOperand(node.separator, collector);\n }\n if (node.orderBy) {\n node.orderBy.forEach(order => this.collectFromOrderingTerm(order.term, collector));\n }\n break;\n case 'JsonPath':\n this.collectFromOperand(node.column, collector);\n break;\n case 'ScalarSubquery':\n collector.hasSubquery = true;\n break;\n case 'CaseExpression':\n node.conditions.forEach(({ when, then }) => {\n this.collectFromExpression(when, collector);\n this.collectFromOperand(then, collector);\n });\n if (node.else) {\n this.collectFromOperand(node.else, collector);\n }\n break;\n case 'Cast':\n this.collectFromOperand(node.expression, collector);\n break;\n case 'WindowFunction':\n node.args.forEach(arg => this.collectFromOperand(arg, collector));\n node.partitionBy?.forEach(part => this.collectFromOperand(part, collector));\n node.orderBy?.forEach(order => this.collectFromOrderingTerm(order.term, collector));\n break;\n case 'Collate':\n this.collectFromOperand(node.expression, collector);\n break;\n case 'ArithmeticExpression':\n case 'BitwiseExpression':\n this.collectFromOperand(node.left, collector);\n this.collectFromOperand(node.right, collector);\n break;\n case 'Literal':\n case 'AliasRef':\n break;\n default:\n break;\n }\n }\n\n private collectFromOrderingTerm(term: OrderingTerm, collector: FilterTableCollector): void {\n if (isOperandNode(term)) {\n this.collectFromOperand(term, collector);\n return;\n }\n this.collectFromExpression(term, collector);\n }\n\n private createFilteredRelationCte(\n state: SelectQueryState,\n relationName: string,\n relation: RelationDef,\n filters: ExpressionNode[]\n ): { state: SelectQueryState; table: TableNode } {\n const cteName = this.generateUniqueCteName(state, relationName);\n const predicate = this.combineWithAnd(filters);\n if (!predicate) {\n throw new Error('Unable to build filter CTE without predicates.');\n }\n\n const columns: ColumnNode[] = Object.keys(relation.target.columns).map(name => ({\n type: 'Column',\n table: relation.target.name,\n name\n }));\n\n const cteQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: { type: 'Table', name: relation.target.name, schema: relation.target.schema },\n columns,\n joins: [],\n where: predicate\n };\n\n const nextState = this.astService(state).withCte(cteName, cteQuery);\n const tableNode: TableNode = {\n type: 'Table',\n name: cteName,\n alias: relation.target.name\n };\n\n return { state: nextState, table: tableNode };\n }\n\n private generateUniqueCteName(state: SelectQueryState, relationName: string): string {\n const existing = new Set((state.ast.ctes ?? []).map(cte => cte.name));\n let candidate = `${relationName}__filtered`;\n let suffix = 1;\n while (existing.has(candidate)) {\n candidate = `${relationName}__filtered_${suffix}`;\n suffix += 1;\n }\n return candidate;\n }\n\n private resolveTargetTableName(target: TableSourceNode, relation: RelationDef): string {\n if (target.type === 'Table') {\n return target.alias ?? target.name;\n }\n if (target.type === 'DerivedTable') {\n return target.alias;\n }\n if (target.type === 'FunctionTable') {\n return target.alias ?? relation.target.name;\n }\n return relation.target.name;\n }\n\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\r\n return this.createQueryAstService(this.table, state);\r\n }\r\n\r\n private rootTableName(): string {\n const from = this.state.ast.from;\n if (from.type === 'Table' && from.alias) return from.alias;\n return this.table.name;\n }\n}\n\nexport type { RelationResult } from './relation-projection-helper.js';\n\r\n","import { ColumnDef } from '../schema/column-types.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n\r\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n /**\r\n * Creates a new column selector\r\n * @param env - Query builder environment\r\n * @returns New column selector\r\n */\r\n createColumnSelector: (env: SelectQueryBuilderEnvironment) => ColumnSelector;\r\n /**\r\n * Creates a new relation manager\r\n * @param env - Query builder environment\r\n * @returns New relation manager\r\n */\r\n createRelationManager: (env: SelectQueryBuilderEnvironment) => RelationManager;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n const createColumnSelector = overrides.createColumnSelector ?? (env => new ColumnSelector(env));\r\n const createRelationManager = overrides.createRelationManager ?? (env => new RelationManager(env));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService,\r\n createColumnSelector,\r\n createRelationManager\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, unknown>[], plan?: HydrationPlan): Record<string, unknown>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<unknown, Record<string, unknown>>();\r\n const relationIndex = new Map<unknown, Record<string, Set<unknown>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, unknown>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: unknown, relationName: string): Set<unknown> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<unknown>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\r\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\r\n const childPk = row[childPkKey];\r\n if (childPk === null || childPk === undefined) continue;\r\n\r\n const seen = getRelationSeenSet(rootId, rel.name);\r\n if (seen.has(childPk)) continue;\r\n seen.add(childPk);\r\n\r\n if (rel.type === RelationKinds.HasOne) {\r\n if (!parent[rel.name]) {\r\n parent[rel.name] = buildChild(row, rel);\r\n }\r\n continue;\r\n }\r\n\r\n const bucket = parent[rel.name] as unknown[];\r\n bucket.push(buildChild(row, rel));\r\n }\r\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, unknown>, plan: HydrationPlan): Record<string, unknown> => {\r\n const base: Record<string, unknown> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\r\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\r\n }\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, unknown>, rel: HydrationRelationPlan): Record<string, unknown> => {\r\n const child: Record<string, unknown> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as { _pivot: unknown })._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, unknown>, rel: HydrationRelationPlan): Record<string, unknown> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, unknown> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport { RelationIncludeOptions } from '../query-builder/relation-types.js';\nimport { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\n lazyRelations: (keyof RelationMap<TTable>)[];\n /** Include options for lazy relations */\n lazyRelationOptions: Map<string, RelationIncludeOptions>;\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<unknown>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, unknown>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, unknown>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, unknown> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value as Record<string, unknown>;\r\n};\r\n\r\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: unknown): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as { [ENTITY_META]: EntityMeta<TTable> })[ENTITY_META];\r\n};\r\n\r\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: unknown): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of HasManyCollection for managing one-to-many relationships.\r\n * @template TChild - The type of child entities in the collection\r\n */\r\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\r\n private loaded = false;\r\n private items: TChild[] = [];\r\n private readonly added = new Set<TChild>();\r\n private readonly removed = new Set<TChild>();\r\n\r\n /**\r\n * Creates a new DefaultHasManyCollection instance.\r\n * @param ctx - The entity context\r\n * @param meta - The entity metadata\r\n * @param root - The root entity\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param rootTable - The root table definition\r\n * @param loader - The loader function for lazy loading\r\n * @param createEntity - Function to create entities from rows\r\n * @param localKey - The local key for the relation\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n /**\r\n * Loads the related entities if not already loaded.\r\n * @returns Promise resolving to the array of child entities\r\n */\r\n async load(): Promise<TChild[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey((this.root as Record<string, unknown>)[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\n\n /**\n * Gets the current items in the collection.\n * @returns Array of child entities\n */\n getItems(): TChild[] {\n return this.items;\n }\n \n /**\n * Array-compatible length for testing frameworks.\n */\n get length(): number {\n return this.items.length;\n }\n\n /**\n * Enables iteration over the collection like an array.\n */\n [Symbol.iterator](): Iterator<TChild> {\n return this.items[Symbol.iterator]();\n }\n\r\n /**\r\n * Adds a new child entity to the collection.\r\n * @param data - Partial data for the new entity\r\n * @returns The created entity\r\n */\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n const childRow: Record<string, unknown> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n /**\r\n * Attaches an existing entity to the collection.\r\n * @param entity - The entity to attach\r\n */\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, unknown>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Removes an entity from the collection.\r\n * @param entity - The entity to remove\r\n */\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Clears all entities from the collection.\r\n */\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n }\r\n\r\n /**\r\n * Returns the items for JSON serialization.\r\n * @returns Array of child entities\r\n */\r\n toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReferenceApi } from '../../schema/types.js';\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, unknown>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a has-one reference.\r\n * Manages a reference to a child entity where the child carries the foreign key.\r\n *\r\n * @template TChild The type of the child entity.\r\n */\r\nexport class DefaultHasOneReference<TChild extends object> implements HasOneReferenceApi<TChild> {\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the parent entity.\r\n * @param root The parent entity instance.\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the parent entity.\r\n * @param loader Function to load the child entity.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param localKey The local key on the parent entity used for the relation.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReferenceApi } from '../../schema/types.js';\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a belongs-to reference.\r\n * Manages a reference to a parent entity from a child entity through a foreign key.\r\n *\r\n * @template TParent The type of the parent entity.\r\n */\r\nexport class DefaultBelongsToReference<TParent extends object> implements BelongsToReferenceApi<TParent> {\n private loaded = false;\r\n private current: TParent | null = null;\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the child entity.\r\n * @param root The child entity instance (carrying the foreign key).\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the child entity.\r\n * @param loader Function to load the parent entity.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param targetKey The primary key of the target (parent) table.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TParent,\r\n private readonly targetKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = (this.root as Record<string, unknown>)[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n (this.root as Record<string, unknown>)[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, unknown>);\r\n const pkValue = (entity as Record<string, unknown>)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n (this.root as Record<string, unknown>)[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const fkValue = (this.root as Record<string, unknown>)[this.relation.foreignKey];\r\n if (fkValue === undefined || fkValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, unknown>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: object, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Default implementation of a many-to-many collection.\r\n * Manages the relationship between two entities through a pivot table.\r\n * Supports lazy loading, attaching/detaching entities, and syncing by IDs.\r\n *\r\n * @template TTarget The type of the target entities in the collection.\r\n */\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n /**\r\n * @param ctx The entity context for tracking changes.\r\n * @param meta Metadata for the root entity.\r\n * @param root The root entity instance.\r\n * @param relationName The name of the relation.\r\n * @param relation Relation definition.\r\n * @param rootTable Table definition of the root entity.\r\n * @param loader Function to load the collection items.\r\n * @param createEntity Function to create entity instances from rows.\r\n * @param localKey The local key used for joining.\r\n */\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<TableDef>,\r\n private readonly root: unknown,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, unknown>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n /**\r\n * Loads the collection items if not already loaded.\r\n * @returns A promise that resolves to the array of target entities.\r\n */\r\n async load(): Promise<TTarget[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as { _pivot?: unknown })._pivot) {\r\n (entity as { _pivot?: unknown })._pivot = (row as { _pivot?: unknown })._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n /**\n * Returns the currently loaded items.\n * @returns Array of target entities.\n */\n getItems(): TTarget[] {\n return this.items;\n }\n\n /**\n * Array-compatible length for testing frameworks.\n */\n get length(): number {\n return this.items.length;\n }\n\n /**\n * Enables iteration over the collection like an array.\n */\n [Symbol.iterator](): Iterator<TTarget> {\n return this.items[Symbol.iterator]();\n }\n\n /**\n * Attaches an entity to the collection.\n * Registers an 'attach' change in the entity context.\n * @param target Entity instance or its primary key value.\n */\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id != null && this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n if (id == null && this.items.includes(entity)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n /**\r\n * Detaches an entity from the collection.\r\n * Registers a 'detach' change in the entity context.\r\n * @param target Entity instance or its primary key value.\r\n */\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n /**\r\n * Syncs the collection with a list of IDs.\r\n * Attaches missing IDs and detaches IDs not in the list.\r\n * @param ids Array of primary key values to sync with.\r\n */\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, unknown> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as Record<string, unknown>)[this.targetKey] as string | number | null ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = (this.root as Record<string, unknown>)[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((row as { _pivot?: unknown })._pivot) {\r\n (entity as { _pivot?: unknown })._pivot = (row as { _pivot?: unknown })._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { ExpressionNode, inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport { RelationIncludeOptions } from '../query-builder/relation-types.js';\r\nimport { buildDefaultPivotColumns } from '../query-builder/relation-utils.js';\r\n\r\n/**\r\n * An array of database rows, each represented as a record of string keys to unknown values.\r\n */\r\ntype Rows = Record<string, unknown>[];\r\n\r\n/**\r\n * Represents a single tracked entity from the EntityContext for a table.\r\n */\r\ntype EntityTracker = ReturnType<EntityContext['getEntitiesForTable']>[number];\r\n\r\nconst hasColumns = (columns?: readonly string[]): columns is readonly string[] =>\r\n Boolean(columns && columns.length > 0);\r\n\r\nconst buildColumnSelection = (\r\n table: TableDef,\r\n columns: string[],\r\n missingMsg: (col: string) => string\r\n): Record<string, ColumnDef> => {\r\n return columns.reduce((acc, column) => {\r\n const def = table.columns[column];\r\n if (!def) {\r\n throw new Error(missingMsg(column));\r\n }\r\n acc[column] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n};\r\n\r\nconst filterRow = (row: Record<string, unknown>, columns: Set<string>): Record<string, unknown> => {\r\n const filtered: Record<string, unknown> = {};\r\n for (const column of columns) {\r\n if (column in row) {\r\n filtered[column] = row[column];\r\n }\r\n }\r\n return filtered;\r\n};\r\n\r\nconst filterRows = (rows: Rows, columns: Set<string>): Rows => rows.map(row => filterRow(row, columns));\r\n\r\n/**\r\n * Extracts rows from query results into a standardized format.\r\n * @param results - The query results to process.\r\n * @returns An array of rows as records.\r\n */\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, unknown> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\n/**\r\n * Executes a select query and returns the resulting rows.\r\n * @param ctx - The entity context for execution.\r\n * @param qb - The select query builder.\r\n * @returns A promise resolving to the rows from the query.\r\n */\r\nconst executeQuery = async (ctx: EntityContext, qb: SelectQueryBuilder<unknown, TableDef>): Promise<Rows> => {\n const compiled = ctx.dialect.compileSelect(qb.getAST());\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\n return rowsFromResults(results);\n};\n\r\n/**\r\n * Converts a value to a string key, handling null and undefined as empty string.\r\n * @param value - The value to convert.\r\n * @returns The string representation of the value.\r\n */\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Collects unique keys from the root entities based on the specified key property.\r\n * @param roots - The tracked entities to collect keys from.\r\n * @param key - The property name to use as the key.\r\n * @returns A set of unique key values.\r\n */\r\nconst collectKeysFromRoots = (roots: EntityTracker[], key: string): Set<unknown> => {\r\n const collected = new Set<unknown>();\r\n for (const tracked of roots) {\r\n const value = tracked.entity[key];\r\n if (value !== null && value !== undefined) {\r\n collected.add(value);\r\n }\r\n }\r\n return collected;\r\n};\r\n\r\n/**\r\n * Builds an array of values suitable for an IN list expression from a set of keys.\r\n * @param keys - The set of keys to convert.\r\n * @returns An array of string, number, or LiteralNode values.\r\n */\r\nconst buildInListValues = (keys: Set<unknown>): (string | number | LiteralNode)[] =>\r\n Array.from(keys) as (string | number | LiteralNode)[];\r\n\r\n/**\r\n * Fetches rows from a table where the specified column matches any of the given keys.\r\n * @param ctx - The entity context.\r\n * @param table - The target table.\r\n * @param column - The column to match against.\r\n * @param keys - The set of keys to match.\r\n * @returns A promise resolving to the matching rows.\r\n */\r\nconst fetchRowsForKeys = async (\n ctx: EntityContext,\n table: TableDef,\n column: ColumnDef,\n keys: Set<unknown>,\n selection: Record<string, ColumnDef>,\n filter?: ExpressionNode\n): Promise<Rows> => {\n let qb = new SelectQueryBuilder(table).select(selection);\n qb = qb.where(inList(column, buildInListValues(keys)));\n if (filter) {\n qb = qb.where(filter);\n }\n return executeQuery(ctx, qb);\n};\n\r\n/**\r\n * Groups rows by the value of a key column, allowing multiple rows per key.\r\n * @param rows - The rows to group.\r\n * @param keyColumn - The column name to group by.\r\n * @returns A map from key strings to arrays of rows.\r\n */\r\nconst groupRowsByMany = (rows: Rows, keyColumn: string): Map<string, Rows> => {\r\n const grouped = new Map<string, Rows>();\r\n for (const row of rows) {\r\n const value = row[keyColumn];\r\n if (value === null || value === undefined) continue;\r\n const key = toKey(value);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n return grouped;\r\n};\r\n\r\n/**\r\n * Groups rows by the value of a key column, keeping only one row per key.\r\n * @param rows - The rows to group.\r\n * @param keyColumn - The column name to group by.\r\n * @returns A map from key strings to single rows.\r\n */\r\nconst groupRowsByUnique = (rows: Rows, keyColumn: string): Map<string, Record<string, unknown>> => {\r\n const lookup = new Map<string, Record<string, unknown>>();\r\n for (const row of rows) {\r\n const value = row[keyColumn];\r\n if (value === null || value === undefined) continue;\r\n const key = toKey(value);\r\n if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n return lookup;\r\n};\r\n\r\n/**\r\n * Loads related entities for a has-many relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The has-many relation definition.\r\n * @returns A promise resolving to a map of root keys to arrays of related rows.\r\n */\r\nexport const loadHasManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: HasManyRelation,\r\n options?: RelationIncludeOptions\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = collectKeysFromRoots(roots, localKey);\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n const requestedColumns = hasColumns(options?.columns) ? [...options!.columns] : undefined;\r\n const targetPrimaryKey = findPrimaryKey(relation.target);\r\n const selectedColumns = requestedColumns ? [...requestedColumns] : Object.keys(relation.target.columns);\r\n if (!selectedColumns.includes(targetPrimaryKey)) {\r\n selectedColumns.push(targetPrimaryKey);\r\n }\r\n\r\n const queryColumns = new Set(selectedColumns);\r\n queryColumns.add(relation.foreignKey);\r\n\r\n const selection = buildColumnSelection(\r\n relation.target,\r\n Array.from(queryColumns),\r\n column => `Column '${column}' not found on relation '${relationName}'`\r\n );\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, fkColumn, keys, selection, options?.filter);\n const grouped = groupRowsByMany(rows, relation.foreignKey);\n\n if (!requestedColumns) return grouped;\n\n const visibleColumns = new Set(selectedColumns);\n const filtered = new Map<string, Rows>();\r\n for (const [key, bucket] of grouped.entries()) {\r\n filtered.set(key, filterRows(bucket, visibleColumns));\r\n }\r\n return filtered;\r\n};\r\n\r\n/**\r\n * Loads related entities for a has-one relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The has-one relation definition.\r\n * @returns A promise resolving to a map of root keys to single related rows.\r\n */\r\nexport const loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: HasOneRelation,\r\n options?: RelationIncludeOptions\r\n): Promise<Map<string, Record<string, unknown>>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = collectKeysFromRoots(roots, localKey);\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n const requestedColumns = hasColumns(options?.columns) ? [...options!.columns] : undefined;\r\n const targetPrimaryKey = findPrimaryKey(relation.target);\r\n const selectedColumns = requestedColumns ? [...requestedColumns] : Object.keys(relation.target.columns);\r\n if (!selectedColumns.includes(targetPrimaryKey)) {\r\n selectedColumns.push(targetPrimaryKey);\r\n }\r\n\r\n const queryColumns = new Set(selectedColumns);\r\n queryColumns.add(relation.foreignKey);\r\n\r\n const selection = buildColumnSelection(\r\n relation.target,\r\n Array.from(queryColumns),\r\n column => `Column '${column}' not found on relation '${relationName}'`\r\n );\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, fkColumn, keys, selection, options?.filter);\r\n const grouped = groupRowsByUnique(rows, relation.foreignKey);\r\n\r\n if (!requestedColumns) return grouped;\r\n\r\n const visibleColumns = new Set(selectedColumns);\r\n const filtered = new Map<string, Record<string, unknown>>();\r\n for (const [key, row] of grouped.entries()) {\r\n filtered.set(key, filterRow(row, visibleColumns));\r\n }\r\n return filtered;\r\n};\r\n\r\n/**\r\n * Loads related entities for a belongs-to relation in batch.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The belongs-to relation definition.\r\n * @returns A promise resolving to a map of foreign keys to single related rows.\r\n */\r\nexport const loadBelongsToRelation = async (\n ctx: EntityContext,\n rootTable: TableDef,\n relationName: string,\n relation: BelongsToRelation,\n options?: RelationIncludeOptions\n): Promise<Map<string, Record<string, unknown>>> => {\n const roots = ctx.getEntitiesForTable(rootTable);\n\n const getForeignKeys = (): Set<unknown> => collectKeysFromRoots(roots, relation.foreignKey);\n let foreignKeys = getForeignKeys();\n\n if (!foreignKeys.size) {\n const pkName = findPrimaryKey(rootTable);\n const pkColumn = rootTable.columns[pkName];\n const fkColumn = rootTable.columns[relation.foreignKey];\n\n if (pkColumn && fkColumn) {\n const missingKeys = new Set<unknown>();\n const entityByPk = new Map<unknown, Record<string, unknown>>();\n\n for (const tracked of roots) {\n const entity = tracked.entity as Record<string, unknown>;\n const pkValue = entity[pkName];\n if (pkValue === undefined || pkValue === null) continue;\n const fkValue = entity[relation.foreignKey];\n if (fkValue === undefined || fkValue === null) {\n missingKeys.add(pkValue);\n entityByPk.set(pkValue, entity);\n }\n }\n\n if (missingKeys.size) {\n const selection = buildColumnSelection(\n rootTable,\n [pkName, relation.foreignKey],\n column => `Column '${column}' not found on table '${rootTable.name}'`\n );\n const keyRows = await fetchRowsForKeys(ctx, rootTable, pkColumn, missingKeys, selection);\n for (const row of keyRows) {\n const pkValue = row[pkName];\n if (pkValue === undefined || pkValue === null) continue;\n const entity = entityByPk.get(pkValue);\n if (!entity) continue;\n const fkValue = row[relation.foreignKey];\n if (fkValue !== undefined && fkValue !== null) {\n entity[relation.foreignKey] = fkValue;\n }\n }\n foreignKeys = getForeignKeys();\n }\n }\n }\n\n if (!foreignKeys.size) {\n return new Map();\n }\n\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n const requestedColumns = hasColumns(options?.columns) ? [...options!.columns] : undefined;\r\n const selectedColumns = requestedColumns ? [...requestedColumns] : Object.keys(relation.target.columns);\r\n if (!selectedColumns.includes(targetKey)) {\r\n selectedColumns.push(targetKey);\r\n }\r\n\r\n const selection = buildColumnSelection(\r\n relation.target,\r\n selectedColumns,\r\n column => `Column '${column}' not found on relation '${relationName}'`\r\n );\r\n\r\n const rows = await fetchRowsForKeys(ctx, relation.target, pkColumn, foreignKeys, selection, options?.filter);\n const grouped = groupRowsByUnique(rows, targetKey);\n\n if (!requestedColumns) return grouped;\n\r\n const visibleColumns = new Set(selectedColumns);\r\n const filtered = new Map<string, Record<string, unknown>>();\r\n for (const [key, row] of grouped.entries()) {\r\n filtered.set(key, filterRow(row, visibleColumns));\r\n }\r\n return filtered;\r\n};\r\n\r\n/**\r\n * Loads related entities for a belongs-to-many relation in batch, including pivot data.\r\n * @param ctx - The entity context.\r\n * @param rootTable - The root table of the relation.\r\n * @param _relationName - The name of the relation (unused).\r\n * @param relation - The belongs-to-many relation definition.\r\n * @returns A promise resolving to a map of root keys to arrays of related rows with pivot data.\r\n */\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n options?: RelationIncludeOptions\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = collectKeysFromRoots(roots, rootKey);\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotColumn = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotColumn) return new Map();\r\n\r\n const pivotColumnsRequested = hasColumns(options?.pivot?.columns) ? [...options!.pivot!.columns] : undefined;\r\n const useIncludeDefaults = options !== undefined;\r\n let pivotSelectedColumns: string[];\r\n if (pivotColumnsRequested) {\r\n pivotSelectedColumns = [...pivotColumnsRequested];\r\n } else if (useIncludeDefaults) {\r\n const pivotPk = relation.pivotPrimaryKey || findPrimaryKey(relation.pivotTable);\r\n pivotSelectedColumns = relation.defaultPivotColumns ?? buildDefaultPivotColumns(relation, pivotPk);\r\n } else {\r\n pivotSelectedColumns = Object.keys(relation.pivotTable.columns);\r\n }\r\n\r\n const pivotQueryColumns = new Set(pivotSelectedColumns);\r\n pivotQueryColumns.add(relation.pivotForeignKeyToRoot);\r\n pivotQueryColumns.add(relation.pivotForeignKeyToTarget);\r\n\r\n const pivotSelection = buildColumnSelection(\r\n relation.pivotTable,\r\n Array.from(pivotQueryColumns),\r\n column => `Column '${column}' not found on pivot table '${relation.pivotTable.name}'`\r\n );\r\n\r\n const pivotRows = await fetchRowsForKeys(ctx, relation.pivotTable, pivotColumn, rootIds, pivotSelection);\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, unknown> }[]>();\r\n const targetIds = new Set<unknown>();\r\n const pivotVisibleColumns = new Set(pivotSelectedColumns);\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: pivotVisibleColumns.size ? filterRow(pivot, pivotVisibleColumns) : {}\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetRequestedColumns = hasColumns(options?.columns) ? [...options!.columns] : undefined;\r\n const targetSelectedColumns = targetRequestedColumns\r\n ? [...targetRequestedColumns]\r\n : Object.keys(relation.target.columns);\r\n if (!targetSelectedColumns.includes(targetKey)) {\r\n targetSelectedColumns.push(targetKey);\r\n }\r\n\r\n const targetSelection = buildColumnSelection(\r\n relation.target,\r\n targetSelectedColumns,\r\n column => `Column '${column}' not found on relation '${relationName}'`\r\n );\r\n\r\n const targetRows = await fetchRowsForKeys(ctx, relation.target, targetPkColumn, targetIds, targetSelection, options?.filter);\r\n const targetMap = groupRowsByUnique(targetRows, targetKey);\r\n const targetVisibleColumns = new Set(targetSelectedColumns);\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...(targetRequestedColumns ? filterRow(targetRow, targetVisibleColumns) : targetRow),\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance, RelationMap, HasManyCollection, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport { RelationIncludeOptions } from '../query-builder/relation-types.js';\r\n\r\n/**\r\n * Type representing an array of database rows.\r\n */\r\ntype Rows = Record<string, unknown>[];\r\n\r\n/**\r\n * Caches relation loader results across entities of the same type.\r\n * @template T - The cache type\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param factory - The factory function to create the cache\r\n * @returns Promise with the cached relation data\r\n */\r\nexport const relationLoaderCache = <T extends Map<string, unknown>>(\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\n/**\r\n * Creates an entity proxy with lazy loading capabilities.\r\n * @template TTable - The table type\r\n * @template TLazy - The lazy relation keys\r\n * @param ctx - The entity context\r\n * @param table - The table definition\r\n * @param row - The database row\r\n * @param lazyRelations - Optional lazy relations\r\n * @returns The entity instance\r\n */\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, unknown>,\r\n lazyRelations: TLazy[] = [] as TLazy[],\r\n lazyRelationOptions: Map<string, RelationIncludeOptions> = new Map()\r\n): EntityInstance<TTable> => {\r\n const target: Record<string, unknown> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n lazyRelationOptions: new Map(lazyRelationOptions),\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n const handler: ProxyHandler<object> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta as unknown as EntityMeta<TableDef>, relationName as string, receiver);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta as unknown as EntityMeta<TableDef>, prop, receiver);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(receiver);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler) as EntityInstance<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\n/**\r\n * Creates an entity instance from a database row.\r\n * @template TTable - The table type\r\n * @template TResult - The result type\r\n * @param ctx - The entity context\r\n * @param table - The table definition\r\n * @param row - The database row\r\n * @param lazyRelations - Optional lazy relations\r\n * @returns The entity instance\r\n */\r\nexport const createEntityFromRow = <\r\n TTable extends TableDef,\r\n TResult extends EntityInstance<TTable> = EntityInstance<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, unknown>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = [],\r\n lazyRelationOptions: Map<string, RelationIncludeOptions> = new Map()\r\n): TResult => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked as TResult;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations, lazyRelationOptions);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity as TResult;\r\n};\r\n\r\n/**\r\n * Converts a value to a string key.\r\n * @param value - The value to convert\r\n * @returns String representation of the value\r\n */\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Populates the hydration cache with relation data from the database row.\r\n * @template TTable - The table type\r\n * @param entity - The entity instance\r\n * @param row - The database row\r\n * @param meta - The entity metadata\r\n */\r\nconst populateHydrationCache = <TTable extends TableDef>(\r\n entity: Record<string, unknown>,\r\n row: Record<string, unknown>,\r\n meta: EntityMeta<TTable>\r\n): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, unknown>>();\r\n cache.set(toKey(rootValue), data as Record<string, unknown>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, unknown>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst proxifyRelationWrapper = <T extends object>(wrapper: T): T => {\r\n return new Proxy(wrapper, {\r\n get(target, prop, receiver) {\r\n if (typeof prop === 'symbol') {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n const getItems = (target as { getItems?: () => unknown }).getItems;\r\n if (typeof getItems === 'function') {\r\n const items = getItems.call(target);\r\n if (items && prop in (items as object)) {\r\n const propName = prop as string;\r\n const value = (items as Record<string, unknown>)[propName];\r\n return typeof value === 'function' ? value.bind(items) : value;\r\n }\r\n }\r\n\r\n const getRef = (target as { get?: () => unknown }).get;\r\n if (typeof getRef === 'function') {\r\n const current = getRef.call(target);\r\n if (current && prop in (current as object)) {\r\n const propName = prop as string;\r\n const value = (current as Record<string, unknown>)[propName];\r\n return typeof value === 'function' ? value.bind(current) : value;\r\n }\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n set(target, prop, value, receiver) {\r\n if (typeof prop === 'symbol') {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n\r\n if (prop in target) {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n\r\n const getRef = (target as { get?: () => unknown }).get;\r\n if (typeof getRef === 'function') {\r\n const current = getRef.call(target);\r\n if (current && typeof current === 'object') {\r\n return Reflect.set(current as object, prop, value);\r\n }\r\n }\r\n\r\n const getItems = (target as { getItems?: () => unknown }).getItems;\r\n if (typeof getItems === 'function') {\r\n const items = getItems.call(target);\r\n return Reflect.set(items as object, prop, value);\r\n }\r\n\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Gets a relation wrapper for an entity.\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param owner - The owner entity\r\n * @returns The relation wrapper or undefined\r\n */\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n owner: unknown\r\n): HasManyCollection<unknown> | HasOneReference<object> | BelongsToReference<object> | ManyToManyCollection<unknown> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<unknown>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation, owner);\r\n if (!wrapper) return undefined;\r\n\r\n const proxied = proxifyRelationWrapper(wrapper as object);\r\n meta.relationWrappers.set(relationName, proxied);\r\n return proxied as HasManyCollection<unknown>;\r\n};\r\n\r\n/**\r\n * Instantiates the appropriate relation wrapper based on relation type.\r\n * @param meta - The entity metadata\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param owner - The owner entity\r\n * @returns The relation wrapper or undefined\r\n */\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<TableDef>,\r\n relationName: string,\r\n relation: HasManyRelation | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: unknown\r\n): HasManyCollection<unknown> | HasOneReference<object> | BelongsToReference<object> | ManyToManyCollection<unknown> | undefined => {\r\n const lazyOptions = meta.lazyRelationOptions.get(relationName);\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne, lazyOptions)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany, lazyOptions)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo, lazyOptions)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many, lazyOptions)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, unknown>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\nimport { EntityInstance, RelationMap } from '../schema/types.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport { hydrateRows } from './hydration.js';\nimport { OrmSession } from './orm-session.ts';\nimport { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n createEntityProxy,\n createEntityFromRow,\n relationLoaderCache\n} from './entity.js';\nimport { EntityContext } from './entity-context.js';\nimport { ExecutionContext } from './execution-context.js';\nimport { HydrationContext } from './hydration-context.js';\nimport { RelationIncludeOptions } from '../query-builder/relation-types.js';\nimport { getEntityMeta } from './entity-meta.js';\nimport {\n loadHasManyRelation,\n loadHasOneRelation,\n loadBelongsToRelation,\n loadBelongsToManyRelation\n} from './lazy-batch.js';\n\r\ntype Row = Record<string, unknown>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\r\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeWithContexts = async <TTable extends TableDef>(\n execCtx: ExecutionContext,\n entityCtx: EntityContext,\n qb: SelectQueryBuilder<unknown, TTable>\n): Promise<EntityInstance<TTable>[]> => {\n const ast = qb.getAST();\n const compiled = execCtx.dialect.compileSelect(ast);\n const executed = await execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n const rows = flattenResults(executed);\n const lazyRelations = qb.getLazyRelations();\n const lazyRelationOptions = qb.getLazyRelationOptions();\n\n if (ast.setOps && ast.setOps.length > 0) {\n const proxies = rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, lazyRelations, lazyRelationOptions));\n await loadLazyRelationsForTable(entityCtx, qb.getTable(), lazyRelations, lazyRelationOptions);\n return proxies;\n }\n\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\n const entities = hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, lazyRelations, lazyRelationOptions));\n await loadLazyRelationsForTable(entityCtx, qb.getTable(), lazyRelations, lazyRelationOptions);\n return entities;\n};\n\r\n/**\r\n * Executes a hydrated query using the ORM session.\r\n * @template TTable - The table type\r\n * @param session - The ORM session\r\n * @param qb - The select query builder\r\n * @returns Promise resolving to array of entity instances\r\n */\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n session: OrmSession,\r\n qb: SelectQueryBuilder<unknown, TTable>\r\n): Promise<EntityInstance<TTable>[]> {\r\n return executeWithContexts(session.getExecutionContext(), session, qb);\r\n}\r\n\r\n/**\r\n * Executes a hydrated query using execution and hydration contexts.\r\n * @template TTable - The table type\r\n * @param _execCtx - The execution context (unused)\r\n * @param hydCtx - The hydration context\r\n * @param qb - The select query builder\r\n * @returns Promise resolving to array of entity instances\r\n */\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\n execCtx: ExecutionContext,\n hydCtx: HydrationContext,\n qb: SelectQueryBuilder<unknown, TTable>\n): Promise<EntityInstance<TTable>[]> {\n const entityCtx = hydCtx.entityContext;\n if (!entityCtx) {\n throw new Error('Hydration context is missing an EntityContext');\n }\n return executeWithContexts(execCtx, entityCtx, qb);\n}\n\nconst loadLazyRelationsForTable = async <TTable extends TableDef>(\n ctx: EntityContext,\n table: TTable,\n lazyRelations: (keyof RelationMap<TTable>)[],\n lazyRelationOptions: Map<string, RelationIncludeOptions>\n): Promise<void> => {\n if (!lazyRelations.length) return;\n\n const tracked = ctx.getEntitiesForTable(table);\n if (!tracked.length) return;\n\n const meta = getEntityMeta(tracked[0].entity);\n if (!meta) return;\n\n for (const relationName of lazyRelations) {\n const relation = table.relations[relationName as string];\n if (!relation) continue;\n const key = relationName as string;\n const options = lazyRelationOptions.get(key);\n if (!options) {\n continue;\n }\n\n switch (relation.type) {\n case RelationKinds.HasOne:\n await relationLoaderCache(meta, key, () =>\n loadHasOneRelation(ctx, table, key, relation, options)\n );\n break;\n case RelationKinds.HasMany:\n await relationLoaderCache(meta, key, () =>\n loadHasManyRelation(ctx, table, key, relation, options)\n );\n break;\n case RelationKinds.BelongsTo:\n await relationLoaderCache(meta, key, () =>\n loadBelongsToRelation(ctx, table, key, relation, options)\n );\n break;\n case RelationKinds.BelongsToMany:\n await relationLoaderCache(meta, key, () =>\n loadBelongsToManyRelation(ctx, table, key, relation, options)\n );\n break;\n }\n }\n};\n","import { SelectQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode } from '../core/ast/query.js';\r\nimport { TableDef } from '../schema/table.js';\r\nimport type { SelectQueryBuilder } from './select.js';\r\nimport type { UpdateQueryBuilder } from './update.js';\r\nimport type { DeleteQueryBuilder } from './delete.js';\r\n\r\n/**\r\n * Resolves a SelectQueryBuilder or SelectQueryNode to a SelectQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns SelectQueryNode AST\r\n */\r\nexport function resolveSelectQuery<TSub extends TableDef>(\r\n query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode\r\n): SelectQueryNode {\r\n const candidate = query as { getAST?: () => SelectQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as SelectQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a UpdateQueryBuilder or UpdateQueryNode to a UpdateQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns UpdateQueryNode AST\r\n */\r\nexport function resolveUpdateQuery<T>(\r\n query: UpdateQueryBuilder<T> | UpdateQueryNode\r\n): UpdateQueryNode {\r\n const candidate = query as { getAST?: () => UpdateQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as UpdateQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a DeleteQueryBuilder or DeleteQueryNode to a DeleteQueryNode AST\r\n * @param query - Query builder or AST node\r\n * @returns DeleteQueryNode AST\r\n */\r\nexport function resolveDeleteQuery<T>(\r\n query: DeleteQueryBuilder<T> | DeleteQueryNode\r\n): DeleteQueryNode {\r\n const candidate = query as { getAST?: () => DeleteQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as DeleteQueryNode);\r\n}\r\n\r\n/**\r\n * Resolves a TableDef or TableSourceNode to a TableSourceNode\r\n * @param source - Table definition or source node\r\n * @returns TableSourceNode\r\n */\r\nexport function resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n}\r\n\r\n/**\r\n * Resolves a join target (TableDef, TableSourceNode, or string relation name)\r\n * @param table - Join target\r\n * @returns TableSourceNode or string\r\n */\r\nexport function resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return resolveTableSource(table);\r\n}\r\n\r\n/**\r\n * Type guard to check if a value is a TableSourceNode\r\n * @param source - Value to check\r\n * @returns True if value is a TableSourceNode\r\n */\r\nfunction isTableSourceNode(source: TableDef | TableSourceNode): source is TableSourceNode {\r\n return typeof (source as TableSourceNode).type === 'string';\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { OrderingTerm, SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\r\nimport { HydrationPlan } from '../core/hydration/types.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n and,\r\n exists,\r\n notExists,\r\n OperandNode\r\n} from '../core/ast/expression.js';\r\nimport { derivedTable, fnTable } from '../core/ast/builders.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\n\r\ntype SelectDialectInput = Dialect | DialectKey;\r\n\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport {\r\n resolveSelectQueryBuilderDependencies,\r\n SelectQueryBuilderContext,\r\n SelectQueryBuilderDependencies,\r\n SelectQueryBuilderEnvironment\r\n} from './select-query-builder-deps.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { RelationKinds, type RelationDef } from '../schema/relation.js';\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { EntityInstance, RelationMap, RelationTargetTable } from '../schema/types.js';\r\nimport { OrmSession } from '../orm/orm-session.ts';\r\nimport { ExecutionContext } from '../orm/execution-context.js';\r\nimport { HydrationContext } from '../orm/hydration-context.js';\r\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { resolveSelectQuery } from './query-resolution.js';\r\n\r\n\r\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\r\n\r\ntype DeepSelectEntry<TTable extends TableDef> = {\r\n type: 'root';\r\n columns: (keyof TTable['columns'] & string)[];\r\n} | {\r\n type: 'relation';\r\n relationName: keyof TTable['relations'] & string;\r\n columns: string[];\r\n};\r\n\r\ntype DeepSelectConfig<TTable extends TableDef> = DeepSelectEntry<TTable>[];\r\n\r\ntype WhereHasOptions = {\r\n correlate?: ExpressionNode;\r\n};\r\n\r\ntype RelationCallback = <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<unknown, TChildTable>\r\n) => SelectQueryBuilder<unknown, TChildTable>;\r\n\r\n\r\n/**\r\n * Main query builder class for constructing SQL SELECT queries\r\n * @typeParam T - Result type for projections (unused)\r\n * @typeParam TTable - Table definition being queried\r\n */\r\nexport class SelectQueryBuilder<T = unknown, TTable extends TableDef = TableDef> {\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n private readonly context: SelectQueryBuilderContext;\r\n private readonly columnSelector: ColumnSelector;\r\n private readonly relationManager: RelationManager;\r\n private readonly lazyRelations: Set<string>;\r\n private readonly lazyRelationOptions: Map<string, RelationIncludeOptions>;\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance\r\n * @param table - Table definition to query\r\n * @param state - Optional initial query state\r\n * @param hydration - Optional hydration manager\r\n * @param dependencies - Optional query builder dependencies\r\n */\r\n constructor(\r\n table: TTable,\r\n state?: SelectQueryState,\r\n hydration?: HydrationManager,\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n lazyRelations?: Set<string>,\r\n lazyRelationOptions?: Map<string, RelationIncludeOptions>\r\n ) {\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n this.env = { table, deps };\r\n const initialState = state ?? deps.createState(table);\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n this.context = {\r\n state: initialState,\r\n hydration: initialHydration\r\n };\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n this.lazyRelationOptions = new Map(lazyRelationOptions ?? []);\r\n this.columnSelector = deps.createColumnSelector(this.env);\r\n this.relationManager = deps.createRelationManager(this.env);\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance with updated context and lazy relations\r\n * @param context - Updated query context\r\n * @param lazyRelations - Updated lazy relations set\r\n * @returns New SelectQueryBuilder instance\r\n */\r\n private clone(\r\n context: SelectQueryBuilderContext = this.context,\r\n lazyRelations = new Set(this.lazyRelations),\r\n lazyRelationOptions = new Map(this.lazyRelationOptions)\r\n ): SelectQueryBuilder<T, TTable> {\r\n return new SelectQueryBuilder(\r\n this.env.table as TTable,\r\n context.state,\r\n context.hydration,\r\n this.env.deps,\r\n lazyRelations,\r\n lazyRelationOptions\r\n );\r\n }\r\n\r\n /**\r\n * Applies an alias to the root FROM table.\r\n * @param alias - Alias to apply\r\n */\r\n as(alias: string): SelectQueryBuilder<T, TTable> {\r\n const from = this.context.state.ast.from;\r\n if (from.type !== 'Table') {\r\n throw new Error('Cannot alias non-table FROM sources');\r\n }\r\n const nextFrom = { ...from, alias };\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\r\n return this.clone(nextContext);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies correlation expression to the query AST\r\n * @param ast - Query AST to modify\r\n * @param correlation - Correlation expression\r\n * @returns Modified AST with correlation applied\r\n */\r\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\r\n if (!correlation) return ast;\r\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\r\n return {\r\n ...ast,\r\n where: combinedWhere\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new child query builder for a related table\r\n * @param table - Table definition for the child builder\r\n * @returns New SelectQueryBuilder instance for the child table\r\n */\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n }\r\n\r\n /**\r\n * Applies an AST mutation using the query AST service\r\n * @param context - Current query context\r\n * @param mutator - Function that mutates the AST\r\n * @returns Updated query context\r\n */\r\n private applyAst(\r\n context: SelectQueryBuilderContext,\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = mutator(astService);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Applies a join to the query context\r\n * @param context - Current query context\r\n * @param table - Table to join\r\n * @param condition - Join condition\r\n * @param kind - Join kind\r\n * @returns Updated query context with join applied\r\n */\r\n private applyJoin(\r\n context: SelectQueryBuilderContext,\r\n table: TableDef,\r\n condition: BinaryExpressionNode,\r\n kind: JoinKind\r\n ): SelectQueryBuilderContext {\r\n const joinNode = createJoinNode(kind, { type: 'Table', name: table.name, schema: table.schema }, condition);\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Applies a set operation to the query\r\n * @param operator - Set operation kind\r\n * @param query - Query to combine with\r\n * @returns Updated query context with set operation\r\n */\r\n private applySetOperation<TSub extends TableDef>(\r\n operator: SetOperationKind,\r\n query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const subAst = resolveSelectQuery(query);\r\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\r\n }\r\n\r\n\r\n /**\r\n * Selects columns for the query (unified overloaded method).\r\n * Can be called with column names or a projection object.\r\n * @param args - Column names or projection object\r\n * @returns New query builder instance with selected columns\r\n */\r\n select<K extends keyof TTable['columns'] & string>(\r\n ...args: K[]\r\n ): SelectQueryBuilder<T, TTable>;\r\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable>;\r\n select<K extends keyof TTable['columns'] & string>(\r\n ...args: K[] | [Record<string, ColumnSelectionValue>]\r\n ): SelectQueryBuilder<T, TTable> {\r\n // If first arg is an object (not a string), treat as projection map\r\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && typeof args[0] !== 'string') {\r\n const columns = args[0] as Record<string, ColumnSelectionValue>;\r\n return this.clone(this.columnSelector.select(this.context, columns));\r\n }\r\n\r\n // Otherwise, treat as column names\r\n const cols = args as K[];\r\n const selection: Record<string, ColumnDef> = {};\r\n for (const key of cols) {\r\n const col = this.env.table.columns[key];\r\n if (!col) {\r\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\r\n }\r\n selection[key] = col;\r\n }\r\n\r\n return this.clone(this.columnSelector.select(this.context, selection));\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param cols - Column expressions as strings\r\n * @returns New query builder instance with raw column selections\r\n */\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the CTE\r\n */\r\n with<TSub extends TableDef>(name: string, query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the recursive CTE\r\n */\r\n withRecursive<TSub extends TableDef>(name: string, query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Replaces the FROM clause with a derived table (subquery with alias)\r\n * @param subquery - Subquery to use as the FROM source\r\n * @param alias - Alias for the derived table\r\n * @param columnAliases - Optional column alias list\r\n * @returns New query builder instance with updated FROM\r\n */\r\n fromSubquery<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n alias: string,\r\n columnAliases?: string[]\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const fromNode = derivedTable(subAst, alias, columnAliases);\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Replaces the FROM clause with a function table expression.\r\n * @param name - Function name\r\n * @param args - Optional function arguments\r\n * @param alias - Optional alias for the function table\r\n * @param options - Optional function-table metadata (lateral, ordinality, column aliases, schema)\r\n */\r\n fromFunctionTable(\r\n name: string,\r\n args: OperandNode[] = [],\r\n alias?: string,\r\n options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\r\n ): SelectQueryBuilder<T, TTable> {\r\n const functionTable = fnTable(name, args, alias, options);\r\n const nextContext = this.applyAst(this.context, service => service.withFrom(functionTable));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery column\r\n * @param sub - Query builder or query node for the subquery\r\n * @returns New query builder instance with the subquery selection\r\n */\r\n selectSubquery<TSub extends TableDef>(alias: string, sub: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = resolveSelectQuery(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\r\n }\r\n\r\n /**\r\n * Adds a JOIN against a derived table (subquery with alias)\r\n * @param subquery - Subquery to join\r\n * @param alias - Alias for the derived table\r\n * @param condition - Join condition expression\r\n * @param joinKind - Join kind (defaults to INNER)\r\n * @param columnAliases - Optional column alias list for the derived table\r\n * @returns New query builder instance with the derived-table join\r\n */\r\n joinSubquery<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n alias: string,\r\n condition: BinaryExpressionNode,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n columnAliases?: string[]\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\r\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a join against a function table (e.g., `generate_series`) using `fnTable` internally.\r\n * @param name - Function name\r\n * @param args - Optional arguments passed to the function\r\n * @param alias - Alias for the function table so columns can be referenced\r\n * @param condition - Join condition expression\r\n * @param joinKind - Kind of join (defaults to INNER)\r\n * @param options - Optional metadata (lateral, ordinality, column aliases, schema)\r\n */\r\n joinFunctionTable(\r\n name: string,\r\n args: OperandNode[] = [],\r\n alias: string,\r\n condition: BinaryExpressionNode,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }\r\n ): SelectQueryBuilder<T, TTable> {\r\n const functionTable = fnTable(name, args, alias, options);\r\n const joinNode = createJoinNode(joinKind, functionTable, condition);\r\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an INNER JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the INNER JOIN\r\n */\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the LEFT JOIN\r\n */\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the RIGHT JOIN\r\n */\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Matches records based on a relationship\r\n * @param relationName - Name of the relationship to match\r\n * @param predicate - Optional predicate expression\r\n * @returns New query builder instance with the relationship match\r\n */\r\n match<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n predicate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Joins a related table\r\n * @param relationName - Name of the relationship to join\r\n * @param joinKind - Type of join (defaults to INNER)\r\n * @param extraCondition - Optional additional join condition\r\n * @returns New query builder instance with the relationship join\r\n */\r\n joinRelation<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes related data in the query results\r\n * @param relationName - Name of the relationship to include\r\n * @param options - Optional include options\r\n * @returns New query builder instance with the relationship inclusion\r\n */\r\n include<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes a relation lazily in the query results\r\n * @param relationName - Name of the relation to include lazily\r\n * @param options - Optional include options for lazy loading\r\n * @returns New query builder instance with lazy relation inclusion\r\n */\r\n includeLazy<K extends keyof RelationMap<TTable>>(\n relationName: K,\n options?: RelationIncludeOptions\n ): SelectQueryBuilder<T, TTable> {\n let nextContext = this.context;\n const relation = this.env.table.relations[relationName as string];\n if (relation?.type === RelationKinds.BelongsTo) {\n const foreignKey = relation.foreignKey;\n const fkColumn = this.env.table.columns[foreignKey];\n if (fkColumn) {\n const hasAlias = nextContext.state.ast.columns.some(col => {\n const node = col as { alias?: string; name?: string };\n return (node.alias ?? node.name) === foreignKey;\n });\n if (!hasAlias) {\n nextContext = this.columnSelector.select(nextContext, { [foreignKey]: fkColumn });\n }\n }\n }\n const nextLazy = new Set(this.lazyRelations);\n nextLazy.add(relationName as string);\n const nextOptions = new Map(this.lazyRelationOptions);\n if (options) {\n nextOptions.set(relationName as string, options);\n } else {\n nextOptions.delete(relationName as string);\n }\n return this.clone(nextContext, nextLazy, nextOptions);\n }\n\r\n /**\r\n * Convenience alias for including only specific columns from a relation.\r\n */\r\n includePick<\r\n K extends keyof TTable['relations'] & string,\r\n TRel extends RelationDef = TTable['relations'][K],\r\n TTarget extends TableDef = RelationTargetTable<TRel>,\r\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\r\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\r\n return this.include(relationName, { columns: cols as readonly string[] });\r\n }\r\n\r\n\r\n /**\r\n * Selects columns for the root table and relations from an array of entries\r\n * @param config - Configuration array for deep column selection\r\n * @returns New query builder instance with deep column selections\r\n */\r\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let currBuilder: SelectQueryBuilder<T, TTable> = this;\r\n\r\n for (const entry of config) {\r\n if (entry.type === 'root') {\r\n currBuilder = currBuilder.select(...entry.columns);\r\n } else {\r\n currBuilder = currBuilder.include(entry.relationName, { columns: entry.columns as string[] });\r\n }\r\n }\r\n\r\n return currBuilder;\r\n }\r\n\r\n /**\r\n * Gets the list of lazy relations\r\n * @returns Array of lazy relation names\r\n */\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n /**\r\n * Gets lazy relation include options\r\n * @returns Map of relation names to include options\r\n */\r\n getLazyRelationOptions(): Map<string, RelationIncludeOptions> {\r\n return new Map(this.lazyRelationOptions);\r\n }\r\n\r\n /**\r\n * Gets the table definition for this query builder\r\n * @returns Table definition\r\n */\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n /**\r\n * Executes the query and returns hydrated results\r\n * @param ctx - ORM session context\r\n * @returns Promise of entity instances\r\n */\r\n async execute(ctx: OrmSession): Promise<EntityInstance<TTable>[]> {\r\n return executeHydrated(ctx, this);\r\n }\r\n\r\n private withAst(ast: SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const nextState = new SelectQueryState(this.env.table as TTable, ast);\r\n const nextContext: SelectQueryBuilderContext = {\r\n ...this.context,\r\n state: nextState\r\n };\r\n return this.clone(nextContext);\r\n }\r\n\r\n async count(session: OrmSession): Promise<number> {\r\n const unpagedAst: SelectQueryNode = {\r\n ...this.context.state.ast,\r\n orderBy: undefined,\r\n limit: undefined,\r\n offset: undefined\r\n };\r\n\r\n const subAst = this.withAst(unpagedAst).getAST();\r\n\r\n const countQuery: SelectQueryNode = {\r\n type: 'SelectQuery',\r\n from: derivedTable(subAst, '__metal_count'),\r\n columns: [{ type: 'Function', name: 'COUNT', args: [], alias: 'total' } as FunctionNode],\r\n joins: []\r\n };\r\n\r\n const execCtx = session.getExecutionContext();\r\n const compiled = execCtx.dialect.compileSelect(countQuery);\r\n const results = await execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\r\n const value = results[0]?.values?.[0]?.[0];\r\n\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'bigint') return Number(value);\r\n if (typeof value === 'string') return Number(value);\r\n return value === null || value === undefined ? 0 : Number(value);\r\n }\r\n\r\n async executePaged(\r\n session: OrmSession,\r\n options: { page: number; pageSize: number }\r\n ): Promise<{ items: EntityInstance<TTable>[]; totalItems: number }> {\r\n const { page, pageSize } = options;\r\n if (!Number.isInteger(page) || page < 1) {\r\n throw new Error('executePaged: page must be an integer >= 1');\r\n }\r\n if (!Number.isInteger(pageSize) || pageSize < 1) {\r\n throw new Error('executePaged: pageSize must be an integer >= 1');\r\n }\r\n\r\n const offset = (page - 1) * pageSize;\r\n const [items, totalItems] = await Promise.all([\r\n this.limit(pageSize).offset(offset).execute(session),\r\n this.count(session)\r\n ]);\r\n\r\n return { items, totalItems };\r\n }\r\n\r\n /**\r\n * Executes the query with provided execution and hydration contexts\r\n * @param execCtx - Execution context\r\n * @param hydCtx - Hydration context\r\n * @returns Promise of entity instances\r\n */\r\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<EntityInstance<TTable>[]> {\r\n return executeHydratedWithContexts(execCtx, hydCtx, this);\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns New query builder instance with the WHERE condition\r\n */\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param term - Column definition or ordering term to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(term: ColumnDef | OrderingTerm): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(term));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a HAVING condition to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns New query builder instance with the HAVING condition\r\n */\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param term - Column definition or ordering term to order by\r\n * @param directionOrOptions - Order direction or options (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(\r\n term: ColumnDef | OrderingTerm,\r\n directionOrOptions: OrderDirection | { direction?: OrderDirection; nulls?: 'FIRST' | 'LAST'; collation?: string } = ORDER_DIRECTIONS.ASC\r\n ): SelectQueryBuilder<T, TTable> {\r\n const options = typeof directionOrOptions === 'string' ? { direction: directionOrOptions } : directionOrOptions;\r\n const dir = options.direction ?? ORDER_DIRECTIONS.ASC;\r\n\r\n const nextContext = this.applyAst(this.context, service =>\r\n service.withOrderBy(term, dir, options.nulls, options.collation)\r\n );\r\n\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns New query builder instance with the DISTINCT clause\r\n */\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param n - Maximum number of rows to return\r\n * @returns New query builder instance with the LIMIT clause\r\n */\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param n - Number of rows to skip\r\n * @returns New query builder instance with the OFFSET clause\r\n */\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Combines this query with another using UNION\r\n * @param query - Query to union with\r\n * @returns New query builder instance with the set operation\r\n */\r\n union<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('UNION', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using UNION ALL\r\n * @param query - Query to union with\r\n * @returns New query builder instance with the set operation\r\n */\r\n unionAll<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('UNION ALL', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using INTERSECT\r\n * @param query - Query to intersect with\r\n * @returns New query builder instance with the set operation\r\n */\r\n intersect<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('INTERSECT', query));\r\n }\r\n\r\n /**\r\n * Combines this query with another using EXCEPT\r\n * @param query - Query to subtract\r\n * @returns New query builder instance with the set operation\r\n */\r\n except<TSub extends TableDef>(query: SelectQueryBuilder<unknown, TSub> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.applySetOperation('EXCEPT', query));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition to the query\r\n * @param subquery - Subquery to check for existence\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n */\r\n whereExists<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n correlate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const correlated = this.applyCorrelation(subAst, correlate);\r\n return this.where(exists(correlated));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n */\r\n whereNotExists<TSub extends TableDef>(\r\n subquery: SelectQueryBuilder<unknown, TSub> | SelectQueryNode,\r\n correlate?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const subAst = resolveSelectQuery(subquery);\r\n const correlated = this.applyCorrelation(subAst, correlate);\r\n return this.where(notExists(correlated));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship existence check\r\n */\r\n whereHas<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n callbackOrOptions?: RelationCallback | WhereHasOptions,\r\n maybeOptions?: WhereHasOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\r\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\r\n\r\n let subQb = this.createChildBuilder<unknown, typeof relation.target>(relation.target);\r\n\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\r\n\r\n return this.where(exists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship non-existence check\r\n */\r\n whereHasNot<K extends keyof TTable['relations'] & string>(\r\n relationName: K,\r\n callbackOrOptions?: RelationCallback | WhereHasOptions,\r\n maybeOptions?: WhereHasOptions\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\r\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\r\n\r\n let subQb = this.createChildBuilder<unknown, typeof relation.target>(relation.target);\r\n\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\r\n\r\n return this.where(notExists(finalSubAst));\r\n }\r\n\r\n\r\n\r\n /**\r\n * Compiles the query to SQL for a specific dialect\r\n * @param dialect - Database dialect to compile for\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compile(dialect: SelectDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileSelect(this.getAST());\r\n }\r\n\r\n /**\r\n * Converts the query to SQL string for a specific dialect\r\n * @param dialect - Database dialect to generate SQL for\r\n * @returns SQL string representation of the query\r\n */\r\n toSql(dialect: SelectDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Gets the hydration plan for the query\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n return this.context.hydration.getPlan();\r\n }\r\n\r\n /**\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n * @returns Query AST with hydration applied\r\n */\r\n getAST(): SelectQueryNode {\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n }\r\n}\r\n\r\n","import { ColumnDef } from './column-types.js';\r\nimport type { TableDef } from './table.js';\r\n\r\nconst isColumnsRecord = (columns: unknown): columns is Record<string, ColumnDef> => {\r\n return typeof columns === 'object' && columns !== null;\r\n};\r\n\r\nconst isRelationsRecord = (relations: unknown): relations is Record<string, unknown> => {\r\n return typeof relations === 'object' && relations !== null;\r\n};\r\n\r\n/**\r\n * Type guard that checks if a value is a TableDef.\r\n * \r\n * @param value The value to check.\r\n * @returns True if the value follows the TableDef structure.\r\n */\r\nexport const isTableDef = (value: unknown): value is TableDef => {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n\r\n const candidate = value as Partial<TableDef>;\r\n if (typeof candidate.name !== 'string') {\r\n return false;\r\n }\r\n\r\n if (!isColumnsRecord(candidate.columns)) {\r\n return false;\r\n }\r\n\r\n if (!isRelationsRecord(candidate.relations)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n","import { ColumnDef } from '../schema/column-types.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\n/**\n * Constructor type for entities.\n * Supports any constructor signature for maximum flexibility with decorator-based entities.\n * @template T - The entity type\n */\nexport type EntityConstructor<T = object> = new (...args: never[]) => T;\n\n/**\n * Target that can be an entity constructor or table definition.\n */\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\n\n/**\n * Resolver for entity or table target, can be direct or function.\n */\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\n/**\n * Simplified column definition structure used during metadata registration.\n * @template T - Concrete column definition type being extended\n */\nexport type ColumnDefLike<T extends ColumnDef = ColumnDef> = Omit<T, 'name' | 'table'>;\n\n/**\n * Transforms simplified column metadata into full ColumnDef objects during table building.\n * @template TColumns - Mapping of column names to simplified definitions\n */\ntype MaterializeColumns<TColumns extends Record<string, ColumnDefLike>> = {\n [K in keyof TColumns]: ColumnDef<TColumns[K]['type'], TColumns[K]['tsType']> & Omit<\n TColumns[K],\n 'name' | 'table' | 'type' | 'tsType'\n > & { name: string; table: string };\n};\n\n/**\n * Common properties shared by all relation metadata types.\n */\ninterface BaseRelationMetadata {\n /** The property key for the relation */\n propertyKey: string;\n /** The target entity or table */\n target: EntityOrTableTargetResolver;\n /** Optional cascade mode */\n cascade?: CascadeMode;\n}\n\n/**\n * Metadata for has many relations.\n */\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.HasMany;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for has one relations.\n */\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.HasOne;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for belongs to relations.\n */\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.BelongsTo;\n /** The foreign key */\n foreignKey: string;\n /** Optional local key */\n localKey?: string;\n}\n\n/**\n * Metadata for belongs to many relations.\n */\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n /** The relation kind */\n kind: typeof RelationKinds.BelongsToMany;\n /** The pivot table */\n pivotTable: EntityOrTableTargetResolver;\n /** The pivot foreign key to root */\n pivotForeignKeyToRoot: string;\n /** The pivot foreign key to target */\n pivotForeignKeyToTarget: string;\n /** Optional local key */\n localKey?: string;\n /** Optional target key */\n targetKey?: string;\n /** Optional pivot primary key */\n pivotPrimaryKey?: string;\n /** Optional default pivot columns */\n defaultPivotColumns?: string[];\n}\n\n/**\n * Union type for all relation metadata.\n */\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\n/**\n * Metadata for entities.\n * @template TColumns - The columns type\n */\nexport interface EntityMetadata<TColumns extends Record<string, ColumnDefLike> = Record<string, ColumnDefLike>> {\n /** The entity constructor */\n target: EntityConstructor;\n /** The table name */\n tableName: string;\n /** The columns */\n columns: TColumns;\n /** The relations */\n relations: Record<string, RelationMetadata>;\n /** Optional hooks */\n hooks?: TableHooks;\n /** Optional table definition */\n table?: TableDef<MaterializeColumns<TColumns>>;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\n/**\n * Registers entity metadata.\n * @param meta - The entity metadata to register\n */\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\n/**\n * Ensures entity metadata exists for the target, creating it if necessary.\n * @param target - The entity constructor\n * @returns The entity metadata\n */\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\n/**\n * Gets entity metadata for the target.\n * @param target - The entity constructor\n * @returns The entity metadata or undefined if not found\n */\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\n/**\n * Gets all entity metadata.\n * @returns Array of all entity metadata\n */\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\n/**\n * Clears all entity metadata.\n */\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\n/**\n * Adds column metadata to an entity.\n * @param target - The entity constructor\n * @param propertyKey - The property key\n * @param column - The column definition\n */\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n (meta.columns as Record<string, ColumnDefLike>)[propertyKey] = { ...column };\n};\n\n/**\n * Adds relation metadata to an entity.\n * @param target - The entity constructor\n * @param propertyKey - The property key\n * @param relation - The relation metadata\n */\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\n/**\n * Sets the table name and hooks for an entity.\n * @param target - The entity constructor\n * @param tableName - The table name\n * @param hooks - Optional table hooks\n */\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\n/**\n * Builds a table definition from entity metadata.\n * @template TColumns - The columns type\n * @param meta - The entity metadata\n * @returns The table definition\n */\nexport const buildTableDef = <TColumns extends Record<string, ColumnDefLike>>(meta: EntityMetadata<TColumns>): TableDef<MaterializeColumns<TColumns>> => {\n if (meta.table) {\n return meta.table;\n }\n\n // Build columns using a simpler approach that avoids type assertion\n const columns: Record<string, ColumnDef> = {};\n for (const [key, def] of Object.entries(meta.columns)) {\n columns[key] = {\n ...def,\n name: key,\n table: meta.tableName\n } as ColumnDef;\n }\n\n const table = defineTable(meta.tableName, columns as MaterializeColumns<TColumns>, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type HasManyRelation,\n type HasOneRelation,\n type BelongsToRelation,\n type BelongsToManyRelation,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport { isTableDef } from '../schema/table-guards.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nimport { tableRef, type TableRef } from '../schema/table.js';\nimport {\n SelectableKeys,\n ColumnDef,\n HasManyCollection,\n HasOneReference,\n BelongsToReference,\n ManyToManyCollection\n} from '../schema/types.js';\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\n/**\n * Bootstraps all entities by building their table definitions and relations.\n * @returns An array of table definitions for all bootstrapped entities.\n */\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\n/**\n * Gets the table definition for a given entity constructor.\n * Bootstraps entities if necessary.\n * @param ctor - The entity constructor.\n * @returns The table definition or undefined if not found.\n */\nexport const getTableDefFromEntity = <TTable extends TableDef = TableDef>(ctor: EntityConstructor): TTable | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n if (!meta.table) {\n bootstrapEntities();\n }\n return meta.table as TTable;\n};\n\n/**\n * Creates a select query builder for the given entity.\n * @param ctor - The entity constructor.\n * @returns A select query builder for the entity.\n */\ntype NonFunctionKeys<T> = {\n [K in keyof T]-?: T[K] extends (...args: unknown[]) => unknown ? never : K\n}[keyof T];\n\ntype RelationKeys<TEntity extends object> =\n Exclude<NonFunctionKeys<TEntity>, SelectableKeys<TEntity>> & string;\n\ntype EntityTable<TEntity extends object> =\n Omit<TableDef<{ [K in SelectableKeys<TEntity>]: ColumnDef }>, 'relations'> & {\n relations: {\n [K in RelationKeys<TEntity>]:\n NonNullable<TEntity[K]> extends HasManyCollection<infer TChild>\n ? HasManyRelation<EntityTable<NonNullable<TChild> & object>>\n : NonNullable<TEntity[K]> extends ManyToManyCollection<infer TTarget>\n ? BelongsToManyRelation<EntityTable<NonNullable<TTarget> & object>>\n : NonNullable<TEntity[K]> extends HasOneReference<infer TChild>\n ? HasOneRelation<EntityTable<NonNullable<TChild> & object>>\n : NonNullable<TEntity[K]> extends BelongsToReference<infer TParent>\n ? BelongsToRelation<EntityTable<NonNullable<TParent> & object>>\n : NonNullable<TEntity[K]> extends object\n ? BelongsToRelation<EntityTable<NonNullable<TEntity[K]> & object>>\n : never;\n };\n };\n\nexport const selectFromEntity = <TEntity extends object>(\n ctor: EntityConstructor<TEntity>\n): SelectQueryBuilder<unknown, EntityTable<TEntity>> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return new SelectQueryBuilder(table as unknown as EntityTable<TEntity>);\n};\n\n/**\n * Public API: opt-in ergonomic entity reference (decorator-level).\n *\n * Lazily bootstraps entity metadata (via getTableDefFromEntity) and returns a\n * `tableRef(...)`-style proxy so users can write `u.id` instead of `u.columns.id`.\n */\nexport const entityRef = <TTable extends TableDef = TableDef>(\n ctor: EntityConstructor\n): TableRef<TTable> => {\n const table = getTableDefFromEntity<TTable>(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return tableRef(table);\n};\n","import type { TableDef } from '../schema/table.js';\nimport type { ColumnDef } from '../schema/column-types.js';\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\n\n/**\n * Build a typed selection map from a TableDef.\n * @template TTable - The table definition type\n * @template K - The column name keys\n * @param table - The table definition to select columns from\n * @param cols - Column names to include in the selection\n * @returns A typed record mapping column names to their definitions\n * @throws Error if a specified column is not found on the table\n */\nexport function sel<\n TTable extends TableDef,\n K extends keyof TTable['columns'] & string\n>(table: TTable, ...cols: K[]): Record<K, TTable['columns'][K]> {\n const selection = {} as Record<K, TTable['columns'][K]>;\n\n for (const col of cols) {\n const def = table.columns[col] as TTable['columns'][K];\n if (!def) {\n throw new Error(`Column '${col}' not found on table '${table.name}'`);\n }\n selection[col] = def;\n }\n\n return selection;\n}\n\ntype Ctor<T> = { new(...args: unknown[]): T };\n\n/**\n * Build a typed selection map from an entity constructor.\n * @template TEntity - The entity type\n * @template K - The property name keys\n * @param entity - The entity constructor to get table definition from\n * @param props - Property names to include in the selection\n * @returns A record mapping property names to their column definitions\n * @throws Error if no table definition is registered for the entity\n * @throws Error if a specified property is not found as a column\n */\nexport function esel<TEntity extends object, K extends keyof TEntity & string>(\n entity: Ctor<TEntity>,\n ...props: K[]\n): Record<K, ColumnDef> {\n const table = getTableDefFromEntity(entity) as TableDef | undefined;\n if (!table) {\n throw new Error(`No table definition registered for entity '${entity.name}'`);\n }\n\n const selection = {} as Record<K, ColumnDef>;\n\n for (const prop of props) {\n const col = table.columns[prop];\n if (!col) {\n throw new Error(`No column '${prop}' found for entity '${entity.name}'`);\n }\n selection[prop] = col;\n }\n\n return selection;\n}\n\r\n","import { TableDef } from '../schema/table.js';\nimport { InsertQueryNode, SelectQueryNode } from '../core/ast/query.js';\nimport {\n ColumnNode,\n OperandNode,\n isValueOperandInput,\n valueToOperand\n} from '../core/ast/expression.js';\nimport {\n buildColumnNodes,\n createTableNode\n} from '../core/ast/builders.js';\n\ntype InsertRows = Record<string, unknown>[];\n\n/**\n * Maintains immutable state for building INSERT queries\n */\nexport class InsertQueryState {\n public readonly table: TableDef;\n public readonly ast: InsertQueryNode;\n\n /**\n * Creates a new InsertQueryState instance\n * @param table - The table definition for the INSERT query\n * @param ast - Optional initial AST node, defaults to a basic INSERT query\n */\n constructor(table: TableDef, ast?: InsertQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'InsertQuery',\n into: createTableNode(table),\n columns: [],\n source: {\n type: 'InsertValues',\n rows: []\n }\n };\n }\n\n private clone(nextAst: InsertQueryNode): InsertQueryState {\n return new InsertQueryState(this.table, nextAst);\n }\n\n private ensureColumnsFromRow(rows: InsertRows): ColumnNode[] {\n if (this.ast.columns.length) return this.ast.columns;\n return buildColumnNodes(this.table, Object.keys(rows[0]));\n }\n\n private appendValues(rows: OperandNode[][]): OperandNode[][] {\n if (this.ast.source.type === 'InsertValues') {\n return [...this.ast.source.rows, ...rows];\n }\n return rows;\n }\n\n private getTableColumns(): ColumnNode[] {\n const names = Object.keys(this.table.columns);\n if (!names.length) return [];\n return buildColumnNodes(this.table, names);\n }\n\n /**\n * Adds VALUES clause to the INSERT query\n * @param rows - Array of row objects to insert\n * @returns A new InsertQueryState with the VALUES clause added\n * @throws Error if mixing VALUES with SELECT source\n * @throws Error if invalid values are provided\n */\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\n if (!rows.length) return this;\n\n if (this.ast.source.type === 'InsertSelect') {\n throw new Error('Cannot mix INSERT ... VALUES with INSERT ... SELECT source.');\n }\n\n const definedColumns = this.ensureColumnsFromRow(rows);\n\n const newRows: OperandNode[][] = rows.map((row, rowIndex) =>\n definedColumns.map(column => {\n const rawValue = row[column.name];\n\n if (!isValueOperandInput(rawValue)) {\n throw new Error(\n `Invalid insert value for column \"${column.name}\" in row ${rowIndex}: only primitives, null, or OperandNodes are allowed`\n );\n }\n\n return valueToOperand(rawValue);\n })\n );\n\n return this.clone({\n ...this.ast,\n columns: definedColumns,\n source: {\n type: 'InsertValues',\n rows: this.appendValues(newRows)\n }\n });\n }\n\n /**\n * Sets the columns for the INSERT query\n * @param columns - Column nodes to insert into\n * @returns A new InsertQueryState with the specified columns\n */\n withColumns(columns: ColumnNode[]): InsertQueryState {\n if (!columns.length) return this;\n return this.clone({\n ...this.ast,\n columns: [...columns]\n });\n }\n\n /**\n * Adds SELECT source to the INSERT query\n * @param query - The SELECT query to use as source\n * @param columns - Target columns for the INSERT\n * @returns A new InsertQueryState with the SELECT source\n * @throws Error if mixing SELECT with VALUES source\n * @throws Error if no destination columns specified\n */\n withSelect(query: SelectQueryNode, columns: ColumnNode[]): InsertQueryState {\n const targetColumns =\n columns.length\n ? columns\n : this.ast.columns.length\n ? this.ast.columns\n : this.getTableColumns();\n\n if (!targetColumns.length) {\n throw new Error('INSERT ... SELECT requires specifying destination columns.');\n }\n\n if (this.ast.source.type === 'InsertValues' && this.ast.source.rows.length) {\n throw new Error('Cannot mix INSERT ... SELECT with INSERT ... VALUES source.');\n }\n\n return this.clone({\n ...this.ast,\n columns: [...targetColumns],\n source: {\n type: 'InsertSelect',\n query\n }\n });\n }\n\n /**\n * Adds a RETURNING clause to the INSERT query\n * @param columns - Columns to return after insertion\n * @returns A new InsertQueryState with the RETURNING clause added\n */\n withReturning(columns: ColumnNode[]): InsertQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n}\n","import type { SelectQueryBuilder } from './select.js';\r\nimport { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { InsertQueryNode, SelectQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype InsertDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for INSERT queries\r\n */\r\nexport class InsertQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: InsertQueryState;\r\n\r\n /**\r\n * Creates a new InsertQueryBuilder instance\r\n * @param table - The table definition for the INSERT query\r\n * @param state - Optional initial query state, defaults to a new InsertQueryState\r\n */\r\n constructor(table: TableDef, state?: InsertQueryState) {\r\n this.table = table;\r\n this.state = state ?? new InsertQueryState(table);\r\n }\r\n\r\n private clone(state: InsertQueryState): InsertQueryBuilder<T> {\r\n return new InsertQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Adds VALUES to the INSERT query\r\n * @param rowOrRows - Single row object or array of row objects to insert\r\n * @returns A new InsertQueryBuilder with the VALUES clause added\r\n */\r\n values(rowOrRows: Record<string, unknown> | Record<string, unknown>[]): InsertQueryBuilder<T> {\r\n const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];\r\n if (!rows.length) return this;\r\n return this.clone(this.state.withValues(rows));\r\n }\r\n\r\n /**\r\n * Specifies the columns for the INSERT query\r\n * @param columns - Column definitions or nodes to insert into\r\n * @returns A new InsertQueryBuilder with the specified columns\r\n */\r\n columns(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n return this.clone(this.state.withColumns(this.resolveColumnNodes(columns)));\r\n }\r\n\r\n /**\r\n * Sets the source of the INSERT query to a SELECT query\r\n * @template TSource - The source table type\r\n * @param query - The SELECT query or query builder to use as source\r\n * @param columns - Optional target columns for the INSERT\r\n * @returns A new InsertQueryBuilder with the SELECT source\r\n */\r\n fromSelect<TSource extends TableDef>(\r\n query: SelectQueryNode | SelectQueryBuilder<unknown, TSource>,\r\n columns: (ColumnDef | ColumnNode)[] = []\r\n ): InsertQueryBuilder<T> {\r\n const ast = this.resolveSelectQuery(query);\r\n const nodes = columns.length ? this.resolveColumnNodes(columns) : [];\r\n return this.clone(this.state.withSelect(ast, nodes));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the INSERT query\r\n * @param columns - Columns to return after insertion\r\n * @returns A new InsertQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Helpers for column/AST resolution\r\n private resolveColumnNodes(columns: (ColumnDef | ColumnNode)[]): ColumnNode[] {\r\n return columns.map(column => buildColumnNode(this.table, column));\r\n }\r\n\r\n private resolveSelectQuery<TSource extends TableDef>(\r\n query: SelectQueryNode | SelectQueryBuilder<unknown, TSource>\r\n ): SelectQueryNode {\r\n const candidate = query as { getAST?: () => SelectQueryNode };\r\n return typeof candidate.getAST === 'function' && candidate.getAST\r\n ? candidate.getAST()\r\n : (query as SelectQueryNode);\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n /**\r\n * Compiles the INSERT query\r\n * @param compiler - The INSERT compiler to use\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(compiler: InsertCompiler): CompiledQuery;\r\n /**\r\n * Compiles the INSERT query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: InsertDialectInput): CompiledQuery;\r\n\r\n compile(arg: InsertCompiler | InsertDialectInput): CompiledQuery {\r\n const candidate = arg as { compileInsert?: (ast: InsertQueryNode) => CompiledQuery };\r\n if (typeof candidate.compileInsert === 'function') {\r\n // InsertCompiler path – old behavior\r\n return candidate.compileInsert(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as InsertDialectInput);\r\n return dialect.compileInsert(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the INSERT query\r\n * @param arg - The compiler or dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(arg: InsertCompiler | InsertDialectInput): string {\r\n return this.compile(arg as InsertCompiler).sql;\r\n }\r\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the INSERT query\r\n */\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\n","import { TableDef } from '../schema/table.js';\nimport {\n ColumnNode,\n ExpressionNode,\n OperandNode,\n isOperandNode,\n valueToOperand\n} from '../core/ast/expression.js';\nimport {\n TableSourceNode,\n UpdateQueryNode,\n UpdateAssignmentNode\n} from '../core/ast/query.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { createTableNode } from '../core/ast/builders.js';\n\n/**\n * Literal values that can be used in UPDATE statements\n */\ntype LiteralValue = string | number | boolean | null;\n\n/**\n * Values allowed in UPDATE SET clauses\n */\ntype UpdateValue = OperandNode | LiteralValue;\n\n/**\n * Type guard to check if a value is valid for UPDATE operations\n * @param value - Value to check\n * @returns True if value is a valid update value\n */\nconst isUpdateValue = (value: unknown): value is UpdateValue => {\n if (value === null) return true;\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return true;\n default:\n return isOperandNode(value);\n }\n};\n\n/**\n * Immutable state for UPDATE queries\n */\nexport class UpdateQueryState {\n public readonly table: TableDef;\n public readonly ast: UpdateQueryNode;\n\n /**\n * Creates a new UpdateQueryState instance\n * @param table - Table definition for the update\n * @param ast - Optional existing AST\n */\n constructor(table: TableDef, ast?: UpdateQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'UpdateQuery',\n table: createTableNode(table),\n set: [],\n joins: []\n };\n }\n\n /**\n * Creates a new UpdateQueryState with updated AST\n * @param nextAst - Updated AST\n * @returns New UpdateQueryState instance\n */\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\n return new UpdateQueryState(this.table, nextAst);\n }\n\n /**\n * Sets the columns to update with their new values\n * @param values - Record of column names to values\n * @returns New UpdateQueryState with SET clause\n */\n withSet(values: Record<string, unknown>): UpdateQueryState {\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, rawValue]) => {\n if (!isUpdateValue(rawValue)) {\n throw new Error(\n `Invalid update value for column \"${column}\": only primitives, null, or OperandNodes are allowed`\n );\n }\n\n return {\n column: {\n type: 'Column',\n table: this.table.name,\n name: column\n },\n value: valueToOperand(rawValue)\n };\n });\n\n return this.clone({\n ...this.ast,\n set: assignments\n });\n }\n\n /**\n * Adds a WHERE condition to the update query\n * @param expr - WHERE expression\n * @returns New UpdateQueryState with WHERE clause\n */\n withWhere(expr: ExpressionNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n where: expr\n });\n }\n\n /**\n * Adds a RETURNING clause to the update query\n * @param columns - Columns to return\n * @returns New UpdateQueryState with RETURNING clause\n */\n withReturning(columns: ColumnNode[]): UpdateQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n\n /**\n * Sets the FROM clause for the update query\n * @param from - Table source for FROM\n * @returns New UpdateQueryState with FROM clause\n */\n withFrom(from: TableSourceNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\n /**\n * Adds a JOIN to the update query\n * @param join - Join node to add\n * @returns New UpdateQueryState with JOIN\n */\n withJoin(join: JoinNode): UpdateQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Applies an alias to the table being updated\n * @param alias - Alias for the table\n * @returns New UpdateQueryState with table alias\n */\n withTableAlias(alias: string): UpdateQueryState {\n return this.clone({\n ...this.ast,\n table: {\n ...this.ast.table,\n alias\n }\n });\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { JOIN_KINDS, JoinKind } from '../core/sql/sql.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { TableSourceNode, UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { OrmSession } from '../orm/orm-session.js';\r\nimport { QueryResult } from '../core/execution/db-executor.js';\r\n\r\ntype UpdateDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for UPDATE queries\r\n */\r\nexport class UpdateQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: UpdateQueryState;\r\n\r\n /**\r\n * Creates a new UpdateQueryBuilder instance\r\n * @param table - The table definition for the UPDATE query\r\n * @param state - Optional initial query state, defaults to a new UpdateQueryState\r\n */\r\n constructor(table: TableDef, state?: UpdateQueryState) {\r\n this.table = table;\r\n this.state = state ?? new UpdateQueryState(table);\r\n }\r\n\r\n private clone(state: UpdateQueryState): UpdateQueryBuilder<T> {\r\n return new UpdateQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Sets an alias for the table in the UPDATE query\r\n * @param alias - The alias to assign to the table\r\n * @returns A new UpdateQueryBuilder with the table alias set\r\n */\r\n as(alias: string): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withTableAlias(alias));\r\n }\r\n\r\n /**\r\n * Adds a FROM clause to the UPDATE query\r\n * @param source - The table source to use in the FROM clause\r\n * @returns A new UpdateQueryBuilder with the FROM clause added\r\n */\r\n from(source: TableDef | TableSourceNode): UpdateQueryBuilder<T> {\r\n const tableSource = this.resolveTableSource(source);\r\n return this.clone(this.state.withFrom(tableSource));\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the UPDATE query\r\n * @param table - The table to join with\r\n * @param condition - The join condition expression\r\n * @param kind - The type of join (defaults to INNER)\r\n * @param relationName - Optional name for the relation\r\n * @returns A new UpdateQueryBuilder with the JOIN clause added\r\n */\r\n join(\r\n table: TableDef | TableSourceNode | string,\r\n condition: ExpressionNode,\r\n kind: JoinKind = JOIN_KINDS.INNER,\r\n relationName?: string\r\n ): UpdateQueryBuilder<T> {\r\n const joinTarget = this.resolveJoinTarget(table);\r\n const joinNode = createJoinNode(kind, joinTarget, condition, relationName);\r\n return this.clone(this.state.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Adds a SET clause to the UPDATE query\r\n * @param values - The column-value pairs to update\r\n * @returns A new UpdateQueryBuilder with the SET clause added\r\n */\r\n set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the UPDATE query\r\n * @param expr - The expression to use as the WHERE condition\r\n * @returns A new UpdateQueryBuilder with the WHERE clause added\r\n */\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the UPDATE query\r\n * @param columns - Columns to return after update\r\n * @returns A new UpdateQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): UpdateQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n private resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n }\r\n\r\n private resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return this.resolveTableSource(table);\r\n }\r\n\r\n /**\r\n * Compiles the UPDATE query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: UpdateDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileUpdate(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the UPDATE query\r\n * @param dialect - The SQL dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(dialect: UpdateDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Executes the UPDATE query using the provided session\r\n * @param session - The ORM session to execute the query with\r\n * @returns A promise that resolves to the query results\r\n */\r\n async execute(session: OrmSession): Promise<QueryResult[]> {\n const execCtx = session.getExecutionContext();\n const compiled = this.compile(execCtx.dialect);\n return execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n }\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the UPDATE query\r\n */\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\nconst isTableSourceNode = (source: TableDef | TableSourceNode): source is TableSourceNode =>\r\n typeof (source as TableSourceNode).type === 'string';\r\n\r\n","import { TableDef } from '../schema/table.js';\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\nimport {\n DeleteQueryNode,\n TableSourceNode\n} from '../core/ast/query.js';\nimport { JoinNode } from '../core/ast/join.js';\nimport { createTableNode } from '../core/ast/builders.js';\n\n/**\n * Maintains immutable state for DELETE queries\n */\nexport class DeleteQueryState {\n public readonly table: TableDef;\n public readonly ast: DeleteQueryNode;\n\n /**\n * Creates a new DeleteQueryState instance\n * @param table - The table definition for the DELETE query\n * @param ast - Optional initial AST node, defaults to a basic DELETE query\n */\n constructor(table: TableDef, ast?: DeleteQueryNode) {\n this.table = table;\n this.ast = ast ?? {\n type: 'DeleteQuery',\n from: createTableNode(table),\n joins: []\n };\n }\n\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\n return new DeleteQueryState(this.table, nextAst);\n }\n\n /**\n * Adds a WHERE clause to the DELETE query\n * @param expr - The expression to use as the WHERE condition\n * @returns A new DeleteQueryState with the WHERE clause added\n */\n withWhere(expr: ExpressionNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n where: expr\n });\n }\n\n /**\n * Adds a RETURNING clause to the DELETE query\n * @param columns - The columns to return after deletion\n * @returns A new DeleteQueryState with the RETURNING clause added\n */\n withReturning(columns: ColumnNode[]): DeleteQueryState {\n return this.clone({\n ...this.ast,\n returning: [...columns]\n });\n }\n\n /**\n * Adds a USING clause to the DELETE query\n * @param source - The table source to use in the USING clause\n * @returns A new DeleteQueryState with the USING clause added\n */\n withUsing(source: TableSourceNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n using: source\n });\n }\n\n /**\n * Adds a JOIN clause to the DELETE query\n * @param join - The join node to add\n * @returns A new DeleteQueryState with the JOIN clause added\n */\n withJoin(join: JoinNode): DeleteQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Sets an alias for the table in the DELETE query\n * @param alias - The alias to assign to the table\n * @returns A new DeleteQueryState with the table alias set\n */\n withTableAlias(alias: string): DeleteQueryState {\n return this.clone({\n ...this.ast,\n from: {\n ...this.ast.from,\n alias\n }\n });\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column-types.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { JOIN_KINDS, JoinKind } from '../core/sql/sql.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { TableSourceNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { OrmSession } from '../orm/orm-session.js';\r\nimport { QueryResult } from '../core/execution/db-executor.js';\r\n\r\ntype DeleteDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for DELETE queries\r\n */\r\nexport class DeleteQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: DeleteQueryState;\r\n\r\n /**\r\n * Creates a new DeleteQueryBuilder instance\r\n * @param table - The table definition for the DELETE query\r\n * @param state - Optional initial query state, defaults to a new DeleteQueryState\r\n */\r\n constructor(table: TableDef, state?: DeleteQueryState) {\r\n this.table = table;\r\n this.state = state ?? new DeleteQueryState(table);\r\n }\r\n\r\n private clone(state: DeleteQueryState): DeleteQueryBuilder<T> {\r\n return new DeleteQueryBuilder(this.table, state);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the DELETE query\r\n * @param expr - The expression to use as the WHERE condition\r\n * @returns A new DeleteQueryBuilder with the WHERE clause added\r\n */\r\n where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n /**\r\n * Sets an alias for the table in the DELETE query\r\n * @param alias - The alias to assign to the table\r\n * @returns A new DeleteQueryBuilder with the table alias set\r\n */\r\n as(alias: string): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withTableAlias(alias));\r\n }\r\n\r\n /**\r\n * Adds a USING clause to the DELETE query\r\n * @param source - The table source to use in the USING clause\r\n * @returns A new DeleteQueryBuilder with the USING clause added\r\n */\r\n using(source: TableDef | TableSourceNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withUsing(this.resolveTableSource(source)));\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the DELETE query\r\n * @param table - The table to join with\r\n * @param condition - The join condition expression\r\n * @param kind - The type of join (defaults to INNER)\r\n * @param relationName - Optional name for the relation\r\n * @returns A new DeleteQueryBuilder with the JOIN clause added\r\n */\r\n join(\r\n table: TableDef | TableSourceNode | string,\r\n condition: ExpressionNode,\r\n kind: JoinKind = JOIN_KINDS.INNER,\r\n relationName?: string\r\n ): DeleteQueryBuilder<T> {\r\n const target = this.resolveJoinTarget(table);\r\n const joinNode = createJoinNode(kind, target, condition, relationName);\r\n return this.clone(this.state.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Adds a RETURNING clause to the DELETE query\r\n * @param columns - The columns to return after deletion\r\n * @returns A new DeleteQueryBuilder with the RETURNING clause added\r\n */\r\n returning(...columns: (ColumnDef | ColumnNode)[]): DeleteQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n private resolveTableSource(source: TableDef | TableSourceNode): TableSourceNode {\r\n if (isTableSourceNode(source)) {\r\n return source;\r\n }\r\n return { type: 'Table', name: source.name, schema: source.schema };\r\n }\r\n\r\n private resolveJoinTarget(table: TableDef | TableSourceNode | string): TableSourceNode | string {\r\n if (typeof table === 'string') return table;\r\n return this.resolveTableSource(table);\r\n }\r\n\r\n /**\r\n * Compiles the DELETE query for the specified dialect\r\n * @param dialect - The SQL dialect to compile for\r\n * @returns The compiled query with SQL and parameters\r\n */\r\n compile(dialect: DeleteDialectInput): CompiledQuery {\r\n const resolved = resolveDialectInput(dialect);\r\n return resolved.compileDelete(this.state.ast);\r\n }\r\n\r\n /**\r\n * Returns the SQL string for the DELETE query\r\n * @param dialect - The SQL dialect to generate SQL for\r\n * @returns The SQL string representation of the query\r\n */\r\n toSql(dialect: DeleteDialectInput): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Executes the DELETE query using the provided session\r\n * @param session - The ORM session to execute the query with\r\n * @returns A promise that resolves to the query results\r\n */\r\n async execute(session: OrmSession): Promise<QueryResult[]> {\n const execCtx = session.getExecutionContext();\n const compiled = this.compile(execCtx.dialect);\n return execCtx.interceptors.run({ sql: compiled.sql, params: compiled.params }, execCtx.executor);\n }\n\r\n /**\r\n * Returns the Abstract Syntax Tree (AST) representation of the query\r\n * @returns The AST node for the DELETE query\r\n */\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n\r\nconst isTableSourceNode = (source: TableDef | TableSourceNode): source is TableSourceNode =>\r\n typeof (source as TableSourceNode).type === 'string';\r\n\r\n","import type { TableDef, IndexColumn } from '../../schema/table.js';\r\nimport type { ColumnDef, RawDefaultValue } from '../../schema/column-types.js';\r\n\r\n/**\r\n * Minimal surface for anything that can quote identifiers.\r\n * Implemented by SchemaDialect, runtime Dialect, etc.\r\n */\r\nexport interface Quoter {\r\n quoteIdentifier(id: string): string;\r\n}\r\n\r\n/**\r\n * Escape a value to be safe inside a single-quoted SQL literal.\r\n * Purely mechanical; no dialect knowledge.\r\n */\r\nexport const escapeSqlString = (value: string): string =>\r\n value.replace(/'/g, \"''\");\r\n\r\n/**\r\n * Narrow a value to the RawDefaultValue shape.\r\n * This is domain-specific but dialect-agnostic.\r\n */\r\nexport const isRawDefault = (value: unknown): value is RawDefaultValue =>\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'raw' in value &&\r\n typeof (value as RawDefaultValue).raw === 'string';\r\n\r\n/**\r\n * Abstraction for \"how do I turn values into SQL literals\".\r\n * Implemented or configured by each dialect.\r\n */\r\nexport interface LiteralFormatter {\r\n formatLiteral(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Declarative options for building a LiteralFormatter.\r\n * Dialects configure behavior by data, not by being hard-coded here.\r\n */\r\nexport interface LiteralFormatOptions {\r\n nullLiteral?: string; // default: 'NULL'\r\n booleanTrue?: string; // default: 'TRUE'\r\n booleanFalse?: string; // default: 'FALSE'\r\n\r\n numberFormatter?: (value: number) => string;\r\n dateFormatter?: (value: Date) => string;\r\n stringWrapper?: (escaped: string) => string; // how to wrap an escaped string\r\n jsonWrapper?: (escaped: string) => string; // how to wrap escaped JSON\r\n}\r\n\r\n/**\r\n * Factory for a value-based LiteralFormatter that:\r\n * - Handles type dispatch (null/number/boolean/date/string/object/raw)\r\n * - Delegates representation choices to options\r\n * - Knows nothing about concrete dialects\r\n */\r\nexport const createLiteralFormatter = (\r\n options: LiteralFormatOptions = {}\r\n): LiteralFormatter => {\r\n const {\r\n nullLiteral = 'NULL',\r\n booleanTrue = 'TRUE',\r\n booleanFalse = 'FALSE',\r\n\r\n numberFormatter = (value: number): string =>\r\n Number.isFinite(value) ? String(value) : nullLiteral,\r\n\r\n dateFormatter = (value: Date): string =>\r\n `'${escapeSqlString(value.toISOString())}'`,\r\n\r\n stringWrapper = (escaped: string): string => `'${escaped}'`,\r\n jsonWrapper = (escaped: string): string => `'${escaped}'`,\r\n } = options;\r\n\r\n const wrapString = stringWrapper;\r\n const wrapJson = jsonWrapper;\r\n\r\n const format = (value: unknown): string => {\r\n // Domain rule: raw defaults bypass all formatting.\r\n if (isRawDefault(value)) return value.raw;\r\n\r\n if (value === null) return nullLiteral;\r\n\r\n if (typeof value === 'number') {\r\n return numberFormatter(value);\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value ? booleanTrue : booleanFalse;\r\n }\r\n\r\n if (value instanceof Date) {\r\n return dateFormatter(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return wrapString(escapeSqlString(value));\r\n }\r\n\r\n // Fallback: serialize to JSON then treat as string.\r\n return wrapJson(escapeSqlString(JSON.stringify(value)));\r\n };\r\n\r\n return {\r\n formatLiteral: format,\r\n };\r\n};\r\n\r\n/**\r\n * Convenience wrapper if you prefer a functional style at call-sites.\r\n */\r\nexport const formatLiteral = (\r\n formatter: LiteralFormatter,\r\n value: unknown\r\n): string => formatter.formatLiteral(value);\r\n\r\n/**\r\n * Quotes a possibly qualified identifier like \"schema.table\" or \"db.schema.table\"\r\n * using a Quoter that knows how to quote a single segment.\r\n */\r\nexport const quoteQualified = (quoter: Quoter, identifier: string): string => {\r\n const parts = identifier.split('.');\r\n return parts.map(part => quoter.quoteIdentifier(part)).join('.');\r\n};\r\n\r\n/**\r\n * Renders index column list, including optional order / nulls, using the\r\n * provided Quoter for identifier quoting.\r\n */\r\nexport const renderIndexColumns = (\r\n quoter: Quoter,\r\n columns: (string | IndexColumn)[]\r\n): string =>\r\n columns\r\n .map(col => {\r\n if (typeof col === 'string') {\r\n return quoter.quoteIdentifier(col);\r\n }\r\n\r\n const parts: string[] = [quoter.quoteIdentifier(col.column)];\r\n\r\n if (col.order) {\r\n parts.push(col.order);\r\n }\r\n\r\n if (col.nulls) {\r\n parts.push(`NULLS ${col.nulls}`);\r\n }\r\n\r\n return parts.join(' ');\r\n })\r\n .join(', ');\r\n\r\n/**\r\n * Resolves the primary key column names for a table, based purely on schema\r\n * metadata. This is domain logic, but independent from any dialect.\r\n */\r\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\r\n if (Array.isArray(table.primaryKey) && table.primaryKey.length > 0) {\r\n return table.primaryKey;\r\n }\r\n\r\n const columns = Object.values(table.columns ?? {}) as ColumnDef[];\r\n\r\n // `primary` / `name` are domain-level properties of ColumnDef.\r\n return columns\r\n .filter(col => col.primary)\r\n .map(col => col.name);\r\n};\r\n\r\n","import type { TableDef } from '../../schema/table.js';\nimport type { ColumnDef } from '../../schema/column-types.js';\nimport type { SchemaDialect } from './schema-dialect.js';\nimport { resolvePrimaryKey } from './sql-writing.js';\nimport { DialectName } from './schema-dialect.js';\n\n/** Result of generating schema SQL. */\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\n/** Options for rendering column definitions. */\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\n\n/**\n * Renders a column definition for SQL.\n * @param table - The table definition.\n * @param col - The column definition.\n * @param dialect - The schema dialect.\n * @param options - Options for rendering.\n * @returns The rendered SQL and whether primary key is inline.\n */\nexport const renderColumnDefinition = (\n table: TableDef,\n col: ColumnDef,\n dialect: SchemaDialect,\n options: RenderColumnOptions = {}\n): { sql: string; inlinePrimary: boolean } => {\n const parts: string[] = [];\n parts.push(dialect.quoteIdentifier(col.name));\n parts.push(dialect.renderColumnType(col));\n\n const autoInc = dialect.renderAutoIncrement(col, table);\n if (autoInc) parts.push(autoInc);\n\n if (col.notNull) parts.push('NOT NULL');\n if (col.unique) parts.push('UNIQUE');\n if (col.default !== undefined) {\n parts.push(`DEFAULT ${dialect.renderDefault(col.default, col)}`);\n }\n if (options.includePrimary && col.primary) {\n parts.push('PRIMARY KEY');\n }\n if (col.check) {\n parts.push(`CHECK (${col.check})`);\n }\n if (col.references) {\n parts.push(dialect.renderReference(col.references, table));\n }\n\n return { sql: parts.join(' '), inlinePrimary: !!(options.includePrimary && col.primary) };\n};\n\n/**\n * Generates SQL to create a table.\n * @param table - The table definition.\n * @param dialect - The schema dialect.\n * @returns The table SQL and index SQL.\n */\nexport const generateCreateTableSql = (\n table: TableDef,\n dialect: SchemaDialect\n): SchemaGenerateResult => {\n const pk = resolvePrimaryKey(table);\n const inlinePkColumns = new Set<string>();\n\n const columnLines = Object.values(table.columns).map(col => {\n const includePk = dialect.preferInlinePkAutoincrement(col, table, pk) && pk.includes(col.name);\n if (includePk) {\n inlinePkColumns.add(col.name);\n }\n return renderColumnDefinition(table, col, dialect, { includePrimary: includePk }).sql;\n });\n\n const constraintLines: string[] = [];\n\n if (pk.length > 0 && !(pk.length === 1 && inlinePkColumns.has(pk[0]))) {\n const cols = pk.map(c => dialect.quoteIdentifier(c)).join(', ');\n constraintLines.push(`PRIMARY KEY (${cols})`);\n }\n\n if (table.checks) {\n table.checks.forEach(check => {\n const name = check.name ? `${dialect.quoteIdentifier(check.name)} ` : '';\n constraintLines.push(`CONSTRAINT ${name}CHECK (${check.expression})`);\n });\n }\n\n const allLines = [...columnLines, ...constraintLines];\n const body = allLines.map(line => ` ${line}`).join(',\\n');\n const tableOptions = dialect.renderTableOptions(table);\n const tableSql = `CREATE TABLE ${dialect.formatTableName(table)} (\\n${body}\\n)${tableOptions ? ' ' + tableOptions : ''};`;\n\n const indexSql: string[] = [];\n if (table.indexes && table.indexes.length > 0) {\n for (const idx of table.indexes) {\n if (idx.where && !dialect.supportsPartialIndexes()) {\n throw new Error(`Dialect ${dialect.name} does not support partial/filtered indexes (${idx.name || idx.columns.join('_')}).`);\n }\n indexSql.push(dialect.renderIndex(table, idx));\n }\n }\n\n return { tableSql, indexSql };\n};\n\n/**\n * Generates SQL for creating multiple tables.\n * @param tables - The table definitions.\n * @param dialect - The schema dialect.\n * @returns The SQL statements.\n */\nexport const generateSchemaSql = (\n tables: TableDef[],\n dialect: SchemaDialect\n): string[] => {\n const ordered = orderTablesByDependencies(tables);\n const statements: string[] = [];\n ordered.forEach(table => {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n statements.push(tableSql, ...indexSql);\n });\n return statements;\n};\n\nconst orderTablesByDependencies = (tables: TableDef[]): TableDef[] => {\n const map = new Map<string, TableDef>();\n tables.forEach(t => map.set(t.name, t));\n\n const deps = new Map<string, Set<string>>();\n for (const table of tables) {\n const refTables = new Set<string>();\n Object.values(table.columns).forEach(col => {\n if (col.references?.table) {\n refTables.add(col.references.table);\n }\n });\n deps.set(table.name, refTables);\n }\n\n const visited = new Set<string>();\n const ordered: TableDef[] = [];\n\n const visit = (name: string, stack: Set<string>) => {\n if (visited.has(name)) return;\n const table = map.get(name);\n if (!table) return;\n if (stack.has(name)) {\n ordered.push(table);\n visited.add(name);\n return;\n }\n stack.add(name);\n for (const dep of deps.get(name) || []) {\n visit(dep, stack);\n }\n stack.delete(name);\n visited.add(name);\n ordered.push(table);\n };\n\n tables.forEach(t => visit(t.name, new Set()));\n return ordered;\n};\n\n// Re-export DialectName for backward compatibility\nexport type { DialectName };\n\r\n","import type { TableDef, IndexDef } from '../../schema/table.js';\r\n\r\n/**\r\n * Derives the name for an index based on the table and index definition.\r\n * @param table - The table definition.\r\n * @param index - The index definition.\r\n * @returns The derived index name.\r\n */\r\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\r\n const base = (index.columns ?? [])\r\n .map(col => (typeof col === 'string' ? col : col.column))\r\n .join('_');\r\n\r\n const suffix = index.unique ? 'uniq' : 'idx';\r\n return `${table.name}_${base}_${suffix}`;\r\n};\r\n","import { TableDef } from '../../schema/table.js';\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport type { DbExecutor } from '../execution/db-executor.js';\r\nimport { SchemaDialect } from './schema-dialect.js';\r\nimport { deriveIndexName } from './naming-strategy.js';\r\nimport { generateCreateTableSql, renderColumnDefinition } from './schema-generator.js';\r\nimport { ColumnDiff, DatabaseColumn, DatabaseSchema, DatabaseTable } from './schema-types.js';\r\n\r\n/** The kind of schema change. */\r\nexport type SchemaChangeKind =\r\n | 'createTable'\r\n | 'dropTable'\r\n | 'addColumn'\r\n | 'dropColumn'\r\n | 'alterColumn'\r\n | 'addIndex'\r\n | 'dropIndex';\r\n\r\n/** Represents a single schema change. */\r\nexport interface SchemaChange {\r\n kind: SchemaChangeKind;\r\n table: string;\r\n description: string;\r\n statements: string[];\r\n safe: boolean;\r\n}\r\n\r\n/** Represents a plan of schema changes. */\r\nexport interface SchemaPlan {\r\n changes: SchemaChange[];\r\n warnings: string[];\r\n}\r\n\r\n/** Options for schema diffing. */\r\nexport interface SchemaDiffOptions {\r\n /** Allow destructive operations (drops) */\r\n allowDestructive?: boolean;\r\n}\r\n\r\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\r\n\r\nconst mapTables = (schema: DatabaseSchema) => {\r\n const map = new Map<string, DatabaseTable>();\r\n for (const table of schema.tables) {\r\n map.set(tableKey(table.name, table.schema), table);\r\n }\r\n return map;\r\n};\r\n\r\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\r\n const column = table.columns[colName];\r\n const rendered = renderColumnDefinition(table, column, dialect);\r\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\r\n};\r\n\r\nconst normalizeType = (value: string | undefined): string => (value || '').toLowerCase().replace(/\\s+/g, ' ').trim();\r\nconst normalizeDefault = (value: unknown): string | undefined => {\r\n if (value === undefined || value === null) return undefined;\r\n return String(value).trim();\r\n};\r\n\r\nconst diffColumn = (expected: ColumnDef, actual: DatabaseColumn, dialect: SchemaDialect): ColumnDiff => {\r\n const expectedType = normalizeType(dialect.renderColumnType(expected));\r\n const actualType = normalizeType(actual.type);\r\n const expectedDefault =\r\n expected.default !== undefined ? normalizeDefault(dialect.renderDefault(expected.default, expected)) : undefined;\r\n const actualDefault = normalizeDefault(actual.default);\r\n return {\r\n typeChanged: expectedType !== actualType,\r\n nullabilityChanged: !!expected.notNull !== !!actual.notNull,\r\n defaultChanged: expectedDefault !== actualDefault,\r\n autoIncrementChanged: !!expected.autoIncrement !== !!actual.autoIncrement\r\n };\r\n};\r\n\r\n/**\r\n * Computes the differences between expected and actual database schemas.\r\n * @param expectedTables - The expected table definitions.\r\n * @param actualSchema - The actual database schema.\r\n * @param dialect - The schema dialect.\r\n * @param options - Options for the diff.\r\n * @returns The schema plan with changes and warnings.\r\n */\r\nexport const diffSchema = (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n options: SchemaDiffOptions = {}\r\n): SchemaPlan => {\r\n const allowDestructive = options.allowDestructive ?? false;\r\n const plan: SchemaPlan = { changes: [], warnings: [] };\r\n\r\n const actualMap = mapTables(actualSchema);\r\n\r\n // Create missing tables and indexes\r\n for (const table of expectedTables) {\r\n const key = tableKey(table.name, table.schema);\r\n const actual = actualMap.get(key);\r\n if (!actual) {\r\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\r\n plan.changes.push({\r\n kind: 'createTable',\r\n table: key,\r\n description: `Create table ${key}`,\r\n statements: [tableSql, ...indexSql],\r\n safe: true\r\n });\r\n continue;\r\n }\r\n\r\n // Columns\r\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\r\n for (const colName of Object.keys(table.columns)) {\r\n if (!actualCols.has(colName)) {\r\n plan.changes.push({\r\n kind: 'addColumn',\r\n table: key,\r\n description: `Add column ${colName} to ${key}`,\r\n statements: [buildAddColumnSql(table, colName, dialect)],\r\n safe: true\r\n });\r\n } else {\r\n const expectedCol = table.columns[colName];\r\n const actualCol = actualCols.get(colName)!;\r\n const colDiff = diffColumn(expectedCol, actualCol, dialect);\r\n const shouldAlter =\r\n colDiff.typeChanged || colDiff.nullabilityChanged || colDiff.defaultChanged || colDiff.autoIncrementChanged;\r\n if (shouldAlter) {\r\n const statements = dialect.alterColumnSql?.(table, expectedCol, actualCol, colDiff) ?? [];\r\n if (statements.length > 0) {\r\n plan.changes.push({\r\n kind: 'alterColumn',\r\n table: key,\r\n description: `Alter column ${colName} on ${key}`,\r\n statements,\r\n safe: true\r\n });\r\n }\r\n const warning = dialect.warnAlterColumn?.(table, expectedCol, actualCol, colDiff);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n }\r\n for (const colName of actualCols.keys()) {\r\n if (!table.columns[colName]) {\r\n plan.changes.push({\r\n kind: 'dropColumn',\r\n table: key,\r\n description: `Drop column ${colName} from ${key}`,\r\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\r\n safe: false\r\n });\r\n const warning = dialect.warnDropColumn?.(actual, colName);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n\r\n // Indexes (naive: based on name or derived name)\r\n const expectedIndexes = table.indexes ?? [];\r\n const actualIndexes = actual.indexes ?? [];\r\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\r\n\r\n for (const idx of expectedIndexes) {\r\n const name = idx.name || deriveIndexName(table, idx);\r\n if (!actualIndexMap.has(name)) {\r\n plan.changes.push({\r\n kind: 'addIndex',\r\n table: key,\r\n description: `Create index ${name} on ${key}`,\r\n statements: [dialect.renderIndex(table, { ...idx, name })],\r\n safe: true\r\n });\r\n }\r\n }\r\n\r\n for (const idx of actualIndexes) {\r\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\r\n plan.changes.push({\r\n kind: 'dropIndex',\r\n table: key,\r\n description: `Drop index ${idx.name} on ${key}`,\r\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Extra tables\r\n for (const actual of actualSchema.tables) {\r\n const key = tableKey(actual.name, actual.schema);\r\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\r\n plan.changes.push({\r\n kind: 'dropTable',\r\n table: key,\r\n description: `Drop table ${key}`,\r\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n\r\n return plan;\r\n};\r\n\r\n/** Options for schema synchronization. */\r\nexport interface SynchronizeOptions extends SchemaDiffOptions {\r\n dryRun?: boolean;\r\n}\r\n\r\n/**\r\n * Synchronizes the database schema with the expected tables.\r\n * @param expectedTables - The expected table definitions.\r\n * @param actualSchema - The actual database schema.\r\n * @param dialect - The schema dialect.\r\n * @param executor - The database executor.\r\n * @param options - Options for synchronization.\r\n * @returns The schema plan with changes and warnings.\r\n */\r\nexport const synchronizeSchema = async (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n executor: DbExecutor,\r\n options: SynchronizeOptions = {}\r\n): Promise<SchemaPlan> => {\r\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\r\n if (!options.dryRun) {\r\n const { executeSchemaPlan } = await import('./schema-plan-executor.js');\r\n await executeSchemaPlan(plan, executor, options);\r\n }\r\n return plan;\r\n};\r\n\r\n","import { DbExecutor, QueryResult } from '../../execution/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\n/**\n * Converts a query result to an array of row objects.\n * @param result - The query result.\n * @returns The array of rows.\n */\nexport const toRows = (result: QueryResult | undefined): Record<string, unknown>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, unknown>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\n/**\n * Executes a SQL query and returns the rows.\n * @param executor - The database executor.\n * @param sql - The SQL query.\n * @param params - The query parameters.\n * @returns The array of rows.\n */\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, unknown>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\n\n/**\n * Checks if a table should be included in introspection based on options.\n * @param name - The table name.\n * @param options - The introspection options.\n * @returns True if the table should be included.\n */\nexport const shouldIncludeTable = (name: string, options: IntrospectOptions): boolean => {\n if (options.includeTables && !options.includeTables.includes(name)) return false;\n if (options.excludeTables && options.excludeTables.includes(name)) return false;\n return true;\n};\n","import { defineTable } from '../../../../schema/table.js';\r\nimport { col } from '../../../../schema/column-types.js';\r\n\r\n/** Table definition for information_schema.columns, providing metadata about table columns. */\r\nexport const PgInformationSchemaColumns = defineTable(\r\n 'columns',\r\n {\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n data_type: col.varchar(255),\r\n is_nullable: col.varchar(3),\r\n column_default: col.varchar(1024),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgClass = defineTable(\r\n 'pg_class',\r\n {\r\n oid: col.int(),\r\n relname: col.varchar(255),\r\n relnamespace: col.int(),\r\n relkind: col.varchar(1)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgNamespace = defineTable(\r\n 'pg_namespace',\r\n {\r\n oid: col.int(),\r\n nspname: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgIndex = defineTable(\r\n 'pg_index',\r\n {\r\n indrelid: col.int(),\r\n indexrelid: col.int(),\r\n indisprimary: col.boolean(),\r\n indkey: col.varchar(255),\r\n indpred: col.varchar(1024)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgAttribute = defineTable(\r\n 'pg_attribute',\r\n {\r\n attrelid: col.int(),\r\n attname: col.varchar(255),\r\n attnum: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgTableConstraints = defineTable(\r\n 'table_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n constraint_type: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgKeyColumnUsage = defineTable(\r\n 'key_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgConstraintColumnUsage = defineTable(\r\n 'constraint_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgReferentialConstraints = defineTable(\r\n 'referential_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n unique_constraint_catalog: col.varchar(255),\r\n unique_constraint_schema: col.varchar(255),\r\n unique_constraint_name: col.varchar(255),\r\n match_option: col.varchar(64),\r\n update_rule: col.varchar(64),\r\n delete_rule: col.varchar(64)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\n/** Default export containing commonly used PostgreSQL catalog table definitions. */\r\nexport default {\r\n PgInformationSchemaColumns,\r\n PgClass,\r\n PgNamespace,\r\n PgIndex,\r\n PgAttribute\r\n};\r\n\r\n","import type { IntrospectContext } from './context.js';\r\nimport type { SelectQueryNode } from '../../ast/query.js';\r\n\r\nimport { queryRows } from './utils.js';\r\n\r\n/** A source that can provide a select query AST. */\r\ntype SelectQuerySource = { getAST(): SelectQueryNode };\r\n\r\n/**\r\n * Runs a select query from a query builder and returns the results.\r\n * @param qb - The query builder.\r\n * @param ctx - The introspection context.\r\n * @returns The query results.\r\n */\r\nexport async function runSelect<T = Record<string, unknown>>(\r\n qb: SelectQuerySource,\r\n ctx: IntrospectContext\r\n): Promise<T[]> {\r\n const ast = qb.getAST();\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n return (await queryRows(ctx.executor, compiled.sql, compiled.params)) as T[];\r\n}\r\n\r\nexport default runSelect;\r\n\r\n/**\r\n * Runs a select query from an AST node and returns the results.\r\n * @param ast - The select query AST.\r\n * @param ctx - The introspection context.\r\n * @returns The query results.\r\n */\r\nexport async function runSelectNode<T = Record<string, unknown>>(ast: SelectQueryNode, ctx: IntrospectContext): Promise<T[]> {\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n return (await queryRows(ctx.executor, compiled.sql, compiled.params)) as T[];\r\n}\r\n","import type { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { shouldIncludeTable, queryRows } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport type { ReferentialAction } from '../../../schema/column-types.js';\r\nimport type { IntrospectContext } from './context.js';\r\nimport { PgInformationSchemaColumns } from './catalogs/postgres.js';\r\nimport { PgKeyColumnUsage, PgTableConstraints, PgConstraintColumnUsage, PgReferentialConstraints } from './catalogs/postgres.js';\r\nimport { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport { eq, and } from '../../ast/expression-builders.js';\r\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\r\nimport type { JoinNode } from '../../ast/join.js';\r\nimport type { ColumnNode, ExpressionNode } from '../../ast/expression-nodes.js';\r\nimport { fnTable } from '../../ast/builders.js';\r\nimport { runSelect, runSelectNode } from './run-select.js';\r\n\r\n/** Row type for PostgreSQL column introspection from information_schema.columns. */\r\ntype ColumnIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n data_type: string;\r\n is_nullable: string;\r\n column_default: string | null;\r\n ordinal_position: number | null;\r\n};\r\n\r\n/** Row type for PostgreSQL primary key introspection from key_column_usage and table_constraints. */\r\ntype PrimaryKeyIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n ordinal_position: number | null;\r\n constraint_name: string;\r\n};\r\n\r\n/** Row type for PostgreSQL foreign key introspection from various constraint tables. */\r\ntype ForeignKeyIntrospectRow = {\r\n table_schema: string;\r\n table_name: string;\r\n column_name: string;\r\n constraint_name: string;\r\n foreign_table_schema: string;\r\n foreign_table_name: string;\r\n foreign_column_name: string;\r\n delete_rule: ReferentialAction;\r\n update_rule: ReferentialAction;\r\n};\r\n\r\n/** Represents a foreign key reference entry with optional referential actions. */\r\ntype ForeignKeyEntry = {\r\n table: string;\r\n column: string;\r\n onDelete?: ReferentialAction;\r\n onUpdate?: ReferentialAction;\r\n};\r\n\r\ntype ColumnCommentRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n description: string | null;\n};\n\ntype TableCommentRow = {\n table_schema: string;\n table_name: string;\n description: string | null;\n};\n\r\n/** Row type for PostgreSQL index query results from pg_catalog tables. */\r\ntype IndexQueryRow = {\r\n table_schema: string;\r\n table_name: string;\r\n index_name: string;\r\n is_unique: boolean;\r\n predicate: string | null;\r\n attname: string | null;\r\n ord: number | null;\r\n};\r\n\r\n/** Grouped index information used for aggregating index columns. */\r\ntype IndexGroup = {\r\n table_schema: string;\r\n table_name: string;\r\n index_name: string;\r\n is_unique: boolean;\r\n predicate: string | null;\r\n cols: { ord: number; att: string | null }[];\r\n};\r\n\r\n/** PostgreSQL schema introspector. */\r\nexport const postgresIntrospector: SchemaIntrospector = {\r\n /**\r\n * Introspects the PostgreSQL database schema by querying information_schema and pg_catalog.\r\n * Builds tables with columns, primary keys, foreign keys, and indexes.\r\n * @param ctx - The introspection context with database executor.\r\n * @param options - Options for schema selection and table filtering.\r\n * @returns A promise resolving to the complete database schema.\r\n */\r\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema || 'public';\r\n const tables: DatabaseTable[] = [];\r\n\r\n // Columns query\r\n const qbColumns = new SelectQueryBuilder(PgInformationSchemaColumns)\r\n .select({\r\n table_schema: PgInformationSchemaColumns.columns.table_schema,\r\n table_name: PgInformationSchemaColumns.columns.table_name,\r\n column_name: PgInformationSchemaColumns.columns.column_name,\r\n data_type: PgInformationSchemaColumns.columns.data_type,\r\n is_nullable: PgInformationSchemaColumns.columns.is_nullable,\r\n column_default: PgInformationSchemaColumns.columns.column_default,\r\n ordinal_position: PgInformationSchemaColumns.columns.ordinal_position\r\n })\r\n .where(eq(PgInformationSchemaColumns.columns.table_schema, schema))\r\n .orderBy(PgInformationSchemaColumns.columns.table_name)\r\n .orderBy(PgInformationSchemaColumns.columns.ordinal_position);\r\n\r\n const columnRows = await runSelect<ColumnIntrospectRow>(qbColumns, ctx);\r\n const columnCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n ns.nspname AS table_schema,\n cls.relname AS table_name,\n att.attname AS column_name,\n pg_catalog.col_description(cls.oid, att.attnum) AS description\n FROM pg_catalog.pg_attribute att\n JOIN pg_catalog.pg_class cls ON cls.oid = att.attrelid\n JOIN pg_catalog.pg_namespace ns ON ns.oid = cls.relnamespace\n WHERE ns.nspname = $1\n AND att.attnum > 0\n AND NOT att.attisdropped\n `,\n [schema]\n )) as ColumnCommentRow[];\n const columnComments = new Map<string, string>();\n columnCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.description) return;\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const trimmed = r.description.trim();\n if (!trimmed) return;\n columnComments.set(key, trimmed);\n });\n const tableCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n ns.nspname AS table_schema,\n cls.relname AS table_name,\n pg_catalog.obj_description(cls.oid) AS description\n FROM pg_catalog.pg_class cls\n JOIN pg_catalog.pg_namespace ns ON ns.oid = cls.relnamespace\n WHERE ns.nspname = $1\n AND cls.relkind IN ('r', 'p')\n `,\n [schema]\n )) as TableCommentRow[];\n const tableComments = new Map<string, string>();\n tableCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.description) return;\n const key = `${r.table_schema}.${r.table_name}`;\n const trimmed = r.description.trim();\n if (!trimmed) return;\n tableComments.set(key, trimmed);\n });\n\r\n // Primary key columns query\r\n const qbPk = new SelectQueryBuilder(PgKeyColumnUsage)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n ordinal_position: PgKeyColumnUsage.columns.ordinal_position,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name\r\n })\r\n .innerJoin(PgTableConstraints, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'PRIMARY KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema))\r\n .orderBy(PgKeyColumnUsage.columns.table_name)\r\n .orderBy(PgKeyColumnUsage.columns.ordinal_position);\r\n\r\n const pkRows = await runSelect<PrimaryKeyIntrospectRow>(qbPk, ctx);\r\n\r\n // Build primary key map (grouped by table, ordered by ordinal_position)\r\n const pkMap = new Map<string, string[]>();\r\n const pkGrouped = new Map<string, { pos: number; col: string }[]>();\r\n for (const r of pkRows) {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const arr = pkGrouped.get(key) ?? [];\r\n arr.push({ pos: r.ordinal_position ?? 0, col: r.column_name });\r\n pkGrouped.set(key, arr);\r\n }\r\n for (const [k, vals] of pkGrouped.entries()) {\r\n vals.sort((a, b) => (a.pos || 0) - (b.pos || 0));\r\n pkMap.set(k, vals.map(v => v.col));\r\n }\r\n\r\n // Foreign key columns query\r\n const qbFk = new SelectQueryBuilder(PgKeyColumnUsage)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name,\r\n foreign_table_schema: PgConstraintColumnUsage.columns.table_schema,\r\n foreign_table_name: PgConstraintColumnUsage.columns.table_name,\r\n foreign_column_name: PgConstraintColumnUsage.columns.column_name,\r\n delete_rule: PgReferentialConstraints.columns.delete_rule,\r\n update_rule: PgReferentialConstraints.columns.update_rule\r\n })\r\n .innerJoin(PgTableConstraints, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .innerJoin(PgConstraintColumnUsage, eq(PgConstraintColumnUsage.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .innerJoin(PgReferentialConstraints, eq(PgReferentialConstraints.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'FOREIGN KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema));\r\n\r\n const fkRows = await runSelect<ForeignKeyIntrospectRow>(qbFk, ctx);\r\n\r\n // Build foreign key map\r\n const fkMap = new Map<string, ForeignKeyEntry[]>();\r\n for (const r of fkRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const existing = fkMap.get(key) ?? [];\r\n existing.push({\r\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\r\n column: r.foreign_column_name,\r\n onDelete: r.delete_rule,\r\n onUpdate: r.update_rule\r\n });\r\n fkMap.set(key, existing);\r\n }\r\n\r\n // Index columns query using AST with FunctionTable for unnest\r\n const indexQuery: SelectQueryNode = {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: 'pg_index', schema: 'pg_catalog', alias: 'i' } as TableNode,\r\n columns: [\r\n { type: 'Column', table: 'ns', name: 'nspname', alias: 'table_schema' } as ColumnNode,\r\n { type: 'Column', table: 'tbl', name: 'relname', alias: 'table_name' } as ColumnNode,\r\n { type: 'Column', table: 'idx', name: 'relname', alias: 'index_name' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indisunique', alias: 'is_unique' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indpred', alias: 'predicate' } as ColumnNode,\r\n { type: 'Column', table: 'att', name: 'attname', alias: 'attname' } as ColumnNode,\r\n { type: 'Column', table: 'arr', name: 'idx', alias: 'ord' } as ColumnNode\r\n ],\r\n joins: [\r\n // JOIN pg_class AS tbl ON tbl.oid = i.indrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'tbl' } as TableNode,\r\n condition: eq({ table: 'tbl', name: 'oid' }, { table: 'i', name: 'indrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_namespace AS ns ON ns.oid = tbl.relnamespace\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_namespace', schema: 'pg_catalog', alias: 'ns' } as TableNode,\r\n condition: eq({ table: 'ns', name: 'oid' }, { table: 'tbl', name: 'relnamespace' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_class AS idx ON idx.oid = i.indexrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'idx' } as TableNode,\r\n condition: eq({ table: 'idx', name: 'oid' }, { table: 'i', name: 'indexrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // LATERAL JOIN UNNEST(i.indkey) WITH ORDINALITY AS arr(attnum, idx)\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: fnTable('unnest', [{ type: 'Column', table: 'i', name: 'indkey' } as ColumnNode], 'arr', {\r\n lateral: true,\r\n withOrdinality: true,\r\n columnAliases: ['attnum', 'idx']\r\n }),\r\n condition: { type: 'BinaryExpression', left: { type: 'Literal', value: 1 }, operator: '=', right: { type: 'Literal', value: 1 } } as unknown as ExpressionNode\r\n } as JoinNode,\r\n // LEFT JOIN pg_attribute AS att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\r\n {\r\n type: 'Join',\r\n kind: 'LEFT',\r\n table: { type: 'Table', name: 'pg_attribute', schema: 'pg_catalog', alias: 'att' } as TableNode,\r\n condition: and(\r\n eq({ table: 'att', name: 'attrelid' }, { table: 'tbl', name: 'oid' }),\r\n eq({ table: 'att', name: 'attnum' }, { table: 'arr', name: 'attnum' })\r\n ) as ExpressionNode\r\n } as JoinNode\r\n ],\r\n where: and(\r\n eq({ table: 'ns', name: 'nspname' }, schema) as ExpressionNode,\r\n eq({ table: 'i', name: 'indisprimary' }, false) as ExpressionNode\r\n ) as ExpressionNode\r\n };\r\n\r\n const indexQueryRows = await runSelectNode<IndexQueryRow>(indexQuery, ctx);\r\n\r\n // Aggregate index rows by table/index to build final index list\r\n const indexGrouped = new Map<string, IndexGroup>();\r\n for (const r of indexQueryRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const entry = indexGrouped.get(key) ?? {\r\n table_schema: r.table_schema,\r\n table_name: r.table_name,\r\n index_name: r.index_name,\r\n is_unique: r.is_unique,\r\n predicate: r.predicate,\r\n cols: []\r\n };\r\n entry.cols.push({ ord: r.ord ?? 0, att: r.attname ?? null });\r\n indexGrouped.set(key, entry);\r\n }\r\n\r\n const indexRows = Array.from(indexGrouped.values()).map(v => ({\r\n table_schema: v.table_schema,\r\n table_name: v.table_name,\r\n index_name: v.index_name,\r\n is_unique: v.is_unique,\r\n predicate: v.predicate,\r\n column_names: v.cols.sort((a, b) => (a.ord || 0) - (b.ord || 0)).map(c => c.att).filter(Boolean)\r\n }));\r\n\r\n // Build final schema\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) {\r\n return;\r\n }\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key)\n });\n }\r\n const cols = tablesByKey.get(key)!;\r\n const commentKey = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const columnComment = columnComments.get(commentKey);\r\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n comment: columnComment ?? undefined,\r\n references: fk\r\n ? {\r\n table: fk.table,\r\n column: fk.column,\r\n onDelete: fk.onDelete,\r\n onUpdate: fk.onUpdate\r\n }\r\n : undefined\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\r\n unique: !!r.is_unique,\r\n where: r.predicate || undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n tables.push(...tablesByKey.values());\r\n return { tables };\r\n }\r\n};\r\n","import { defineTable } from '../../../../schema/table.js';\nimport { col } from '../../../../schema/column-types.js';\n\nconst INFORMATION_SCHEMA = 'information_schema';\n\n/** Table definition for `information_schema.tables`. */\nexport const InformationSchemaTables = defineTable(\n 'tables',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n table_comment: col.varchar(1024)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.columns`. */\nexport const InformationSchemaColumns = defineTable(\n 'columns',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n column_name: col.varchar(255),\n column_type: col.varchar(255),\n data_type: col.varchar(255),\n is_nullable: col.varchar(3),\n column_default: col.varchar(1024),\n extra: col.varchar(255),\n column_comment: col.varchar(1024),\n ordinal_position: col.int()\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.key_column_usage`. */\nexport const InformationSchemaKeyColumnUsage = defineTable(\n 'key_column_usage',\n {\n constraint_schema: col.varchar(255),\n constraint_name: col.varchar(255),\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n column_name: col.varchar(255),\n ordinal_position: col.int(),\n referenced_table_schema: col.varchar(255),\n referenced_table_name: col.varchar(255),\n referenced_column_name: col.varchar(255)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.referential_constraints`. */\nexport const InformationSchemaReferentialConstraints = defineTable(\n 'referential_constraints',\n {\n constraint_schema: col.varchar(255),\n constraint_name: col.varchar(255),\n delete_rule: col.varchar(255),\n update_rule: col.varchar(255)\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\n/** Table definition for `information_schema.statistics`. */\nexport const InformationSchemaStatistics = defineTable(\n 'statistics',\n {\n table_schema: col.varchar(255),\n table_name: col.varchar(255),\n index_name: col.varchar(255),\n non_unique: col.int(),\n column_name: col.varchar(255),\n seq_in_index: col.int()\n },\n {},\n undefined,\n { schema: INFORMATION_SCHEMA }\n);\n\nexport default {\n InformationSchemaTables,\n InformationSchemaColumns,\n InformationSchemaKeyColumnUsage,\n InformationSchemaReferentialConstraints,\n InformationSchemaStatistics\n};\n","import type { ReferentialAction } from '../../../schema/column-types.js';\nimport { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode, ExpressionNode, FunctionNode } from '../../ast/expression-nodes.js';\nimport type { JoinNode } from '../../ast/join.js';\nimport { eq, neq, and, isNotNull } from '../../ast/expression-builders.js';\nimport { groupConcat } from '../../ast/aggregate-functions.js';\nimport type { TableDef } from '../../../schema/table.js';\nimport {\n InformationSchemaTables,\n InformationSchemaColumns,\n InformationSchemaKeyColumnUsage,\n InformationSchemaReferentialConstraints,\n InformationSchemaStatistics\n} from './catalogs/mysql.js';\n\ntype MysqlColumnRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n column_type: string;\n data_type: string;\n is_nullable: string;\n column_default: string | null;\n extra: string | null;\n column_comment: string;\n};\n\ntype MysqlPrimaryKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n};\n\ntype MysqlTableRow = {\n table_schema: string;\n table_name: string;\n table_comment: string;\n};\n\ntype MysqlIndexRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n non_unique: number;\n cols: string | null;\n};\n\ntype MysqlForeignKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n constraint_name: string;\n referenced_table_schema: string;\n referenced_table_name: string;\n referenced_column_name: string;\n delete_rule: string;\n update_rule: string;\n};\n\ntype MysqlForeignKeyEntry = {\n table: string;\n column: string;\n onDelete?: string;\n onUpdate?: string;\n name?: string;\n};\n\nconst tableNode = (table: TableDef, alias: string): TableNode => ({\n type: 'Table',\n name: table.name,\n schema: table.schema,\n alias\n});\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst combineConditions = (...expressions: (ExpressionNode | undefined)[]): ExpressionNode | undefined => {\n const filtered = expressions.filter(Boolean) as ExpressionNode[];\n if (!filtered.length) return undefined;\n if (filtered.length === 1) return filtered[0];\n return and(...filtered);\n};\n\nconst databaseFunction: FunctionNode = {\n type: 'Function',\n name: 'DATABASE',\n fn: 'DATABASE',\n args: []\n};\n\n/**\n * Schema introspector for MySQL.\n * Queries information_schema tables to extract schema metadata.\n */\nexport const mysqlIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n\n const buildSchemaCondition = (alias: string): ExpressionNode =>\n schema\n ? eq(columnNode(alias, 'table_schema'), schema)\n : eq(columnNode(alias, 'table_schema'), databaseFunction);\n\n const tablesQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaTables, 't'),\n columns: [\n columnNode('t', 'table_schema'),\n columnNode('t', 'table_name'),\n columnNode('t', 'table_comment')\n ],\n joins: [],\n where: buildSchemaCondition('t')\n };\n\n const columnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaColumns, 'c'),\n columns: [\n columnNode('c', 'table_schema'),\n columnNode('c', 'table_name'),\n columnNode('c', 'column_name'),\n columnNode('c', 'column_type'),\n columnNode('c', 'data_type'),\n columnNode('c', 'is_nullable'),\n columnNode('c', 'column_default'),\n columnNode('c', 'extra'),\n columnNode('c', 'column_comment')\n ],\n joins: [],\n where: buildSchemaCondition('c'),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('c', 'table_name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('c', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const pkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaKeyColumnUsage, 'kcu'),\n columns: [\n columnNode('kcu', 'table_schema'),\n columnNode('kcu', 'table_name'),\n columnNode('kcu', 'column_name')\n ],\n joins: [],\n where: combineConditions(\n eq(columnNode('kcu', 'constraint_name'), 'PRIMARY'),\n buildSchemaCondition('kcu')\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const fkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaKeyColumnUsage, 'kcu'),\n columns: [\n columnNode('kcu', 'table_schema'),\n columnNode('kcu', 'table_name'),\n columnNode('kcu', 'column_name'),\n columnNode('kcu', 'constraint_name'),\n columnNode('kcu', 'referenced_table_schema'),\n columnNode('kcu', 'referenced_table_name'),\n columnNode('kcu', 'referenced_column_name'),\n columnNode('rc', 'delete_rule'),\n columnNode('rc', 'update_rule')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(InformationSchemaReferentialConstraints, 'rc'),\n condition: and(\n eq({ table: 'rc', name: 'constraint_schema' }, { table: 'kcu', name: 'constraint_schema' }),\n eq({ table: 'rc', name: 'constraint_name' }, { table: 'kcu', name: 'constraint_name' })\n )\n } as JoinNode\n ],\n where: combineConditions(\n isNotNull(columnNode('kcu', 'referenced_table_name')),\n buildSchemaCondition('kcu')\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'table_name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('kcu', 'ordinal_position'),\n direction: 'ASC'\n }\n ]\n };\n\n const indexQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(InformationSchemaStatistics, 'stats'),\n columns: [\n columnNode('stats', 'table_schema'),\n columnNode('stats', 'table_name'),\n columnNode('stats', 'index_name'),\n columnNode('stats', 'non_unique'),\n {\n ...groupConcat(columnNode('stats', 'column_name'), {\n orderBy: [{ column: columnNode('stats', 'seq_in_index') }]\n }),\n alias: 'cols'\n }\n ],\n joins: [],\n where: combineConditions(\n neq(columnNode('stats', 'index_name'), 'PRIMARY'),\n buildSchemaCondition('stats')\n ),\n groupBy: [\n columnNode('stats', 'table_schema'),\n columnNode('stats', 'table_name'),\n columnNode('stats', 'index_name'),\n columnNode('stats', 'non_unique')\n ]\n };\n\n const tableRows = (await runSelectNode<MysqlTableRow>(tablesQuery, ctx)) as MysqlTableRow[];\n const columnRows = (await runSelectNode<MysqlColumnRow>(columnsQuery, ctx)) as MysqlColumnRow[];\n const pkRows = (await runSelectNode<MysqlPrimaryKeyRow>(pkQuery, ctx)) as MysqlPrimaryKeyRow[];\n const fkRows = (await runSelectNode<MysqlForeignKeyRow>(fkQuery, ctx)) as MysqlForeignKeyRow[];\n const indexRows = (await runSelectNode<MysqlIndexRow>(indexQuery, ctx)) as MysqlIndexRow[];\n\n const tableComments = new Map<string, string>();\n tableRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n if (r.table_comment) {\n tableComments.set(key, r.table_comment);\n }\n });\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const list = pkMap.get(key) || [];\n list.push(r.column_name);\n pkMap.set(key, list);\n });\n\n const fkMap = new Map<string, MysqlForeignKeyEntry[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const list = fkMap.get(key) || [];\n list.push({\n table: `${r.referenced_table_schema}.${r.referenced_table_name}`,\n column: r.referenced_column_name,\n onDelete: r.delete_rule,\n onUpdate: r.update_rule,\n name: r.constraint_name\n });\n fkMap.set(key, list);\n });\n\n const tablesByKey = new Map<string, DatabaseTable>();\n\n columnRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!tablesByKey.has(key)) {\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key) || undefined\n });\n }\n const table = tablesByKey.get(key)!;\n const columnType = r.column_type || r.data_type;\n const comment = r.column_comment?.trim() ? r.column_comment : undefined;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: columnType,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment'),\n comment\n };\n const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];\n if (fk) {\n column.references = {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete as ReferentialAction | undefined,\n onUpdate: fk.onUpdate as ReferentialAction | undefined,\n name: fk.name\n };\n }\n table.columns.push(column);\n });\n\n indexRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const table = tablesByKey.get(key);\n if (!table) return;\n const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map(c => ({ column: c.trim() }));\n const idx: DatabaseIndex = {\n name: r.index_name,\n columns: cols,\n unique: r.non_unique === 0\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable, queryRows } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode } from '../../ast/expression-nodes.js';\nimport { eq, notLike, and, valueToOperand } from '../../ast/expression-builders.js';\nimport { fnTable } from '../../ast/builders.js';\nimport type { ReferentialAction } from '../../../schema/column-types.js';\n\ntype SqliteTableRow = {\n name: string;\n};\n\ntype SqliteTableInfoRow = {\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n};\n\ntype SqliteForeignKeyRow = {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string | null;\n on_delete: string | null;\n};\n\ntype SqliteIndexListRow = {\n seq: number;\n name: string;\n unique: number;\n};\n\ntype SqliteIndexInfoRow = {\n seqno: number;\n cid: number;\n name: string;\n};\n\nconst toReferentialAction = (value: string | null | undefined): ReferentialAction | undefined => {\n if (!value) return undefined;\n const normalized = value.toUpperCase();\n if (\n normalized === 'NO ACTION' ||\n normalized === 'RESTRICT' ||\n normalized === 'CASCADE' ||\n normalized === 'SET NULL' ||\n normalized === 'SET DEFAULT'\n ) {\n return normalized as ReferentialAction;\n }\n return undefined;\n};\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst buildPragmaQuery = (\n name: string,\n table: string,\n alias: string,\n columnAliases: string[]\n): SelectQueryNode => ({\n type: 'SelectQuery',\n from: fnTable(name, [valueToOperand(table)], alias, { columnAliases }),\n columns: columnAliases.map(column => columnNode(alias, column)),\n joins: []\n});\n\nconst runPragma = async <T>(\n name: string,\n table: string,\n alias: string,\n columnAliases: string[],\n ctx: IntrospectContext\n): Promise<T[]> => {\n const query = buildPragmaQuery(name, table, alias, columnAliases);\n return (await runSelectNode<T>(query, ctx)) as T[];\n};\n\nconst loadSqliteSchemaComments = async (ctx: IntrospectContext) => {\n const tableComments = new Map<string, string>();\n const columnComments = new Map<string, string>();\n const tableExists = await queryRows(\n ctx.executor,\n `SELECT name FROM sqlite_master WHERE type='table' AND name='schema_comments' LIMIT 1`\n );\n if (!tableExists.length) {\n return { tableComments, columnComments };\n }\n\n const commentRows = await queryRows(\n ctx.executor,\n `SELECT object_type, schema_name, table_name, column_name, comment FROM schema_comments`\n );\n for (const row of commentRows) {\n const objectType = typeof row.object_type === 'string' ? row.object_type.toLowerCase() : '';\n const tableName = typeof row.table_name === 'string' ? row.table_name : '';\n if (!tableName) continue;\n const columnName = typeof row.column_name === 'string' ? row.column_name : '';\n const schemaName = typeof row.schema_name === 'string' ? row.schema_name : '';\n const rawComment = row.comment;\n if (rawComment == null) continue;\n const commentText = String(rawComment).trim();\n if (!commentText) continue;\n\n const addTableComment = () => {\n tableComments.set(tableName, commentText);\n if (schemaName) {\n tableComments.set(`${schemaName}.${tableName}`, commentText);\n }\n };\n const addColumnComment = () => {\n columnComments.set(`${tableName}.${columnName}`, commentText);\n if (schemaName) {\n columnComments.set(`${schemaName}.${tableName}.${columnName}`, commentText);\n }\n };\n\n if (objectType === 'table') {\n addTableComment();\n } else if (objectType === 'column' && columnName) {\n addColumnComment();\n }\n }\n\n return {\n tableComments,\n columnComments\n };\n};\n\n/**\n * Schema introspector for SQLite.\n * Uses PRAGMA commands and sqlite_master to extract schema metadata.\n */\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const alias = 'sqlite_master';\n const tablesQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: { type: 'Table', name: 'sqlite_master' } as TableNode,\n columns: [columnNode(alias, 'name')],\n joins: [],\n where: and(\n eq(columnNode(alias, 'type'), 'table'),\n notLike(columnNode(alias, 'name'), 'sqlite_%')\n )\n };\n\n const { tableComments, columnComments } = await loadSqliteSchemaComments(ctx);\n const tableRows = (await runSelectNode<SqliteTableRow>(tablesQuery, ctx)) as SqliteTableRow[];\n const tables: DatabaseTable[] = [];\n\n for (const row of tableRows) {\n const tableName = row.name;\n if (!shouldIncludeTable(tableName, options)) continue;\n\n const tableInfo = await runPragma<SqliteTableInfoRow>(\n 'pragma_table_info',\n tableName,\n 'ti',\n ['cid', 'name', 'type', 'notnull', 'dflt_value', 'pk'],\n ctx\n );\n\n const foreignKeys = await runPragma<SqliteForeignKeyRow>(\n 'pragma_foreign_key_list',\n tableName,\n 'fk',\n ['id', 'seq', 'table', 'from', 'to', 'on_update', 'on_delete', 'match'],\n ctx\n );\n\n const indexList = await runPragma<SqliteIndexListRow>(\n 'pragma_index_list',\n tableName,\n 'idx',\n ['seq', 'name', 'unique'],\n ctx\n );\n\n const tableEntry: DatabaseTable = {\n name: tableName,\n columns: [],\n primaryKey: [],\n indexes: [],\n comment: tableComments.get(tableName)\n };\n\n tableInfo.forEach(info => {\n const column: DatabaseColumn = {\n name: info.name,\n type: info.type,\n notNull: info.notnull === 1,\n default: info.dflt_value ?? undefined,\n autoIncrement: false\n };\n const columnComment = columnComments.get(`${tableName}.${info.name}`);\n if (columnComment) {\n column.comment = columnComment;\n }\n tableEntry.columns.push(column);\n if (info.pk && info.pk > 0) {\n tableEntry.primaryKey = tableEntry.primaryKey || [];\n tableEntry.primaryKey.push(info.name);\n }\n });\n\n foreignKeys.forEach(fk => {\n const column = tableEntry.columns.find(col => col.name === fk.from);\n if (column) {\n column.references = {\n table: fk.table,\n column: fk.to,\n onDelete: toReferentialAction(fk.on_delete),\n onUpdate: toReferentialAction(fk.on_update)\n };\n }\n });\n\n for (const idx of indexList) {\n if (!idx.name) continue;\n const indexColumns = await runPragma<SqliteIndexInfoRow>(\n 'pragma_index_info',\n idx.name,\n 'info',\n ['seqno', 'cid', 'name'],\n ctx\n );\n const idxEntry: DatabaseIndex = {\n name: idx.name,\n columns: indexColumns.map(col => ({ column: col.name })),\n unique: idx.unique === 1\n };\n tableEntry.indexes!.push(idxEntry);\n }\n\n tables.push(tableEntry);\n }\n\n return { tables };\n }\n};\n","import { defineTable } from '../../../../schema/table.js';\nimport { col } from '../../../../schema/column-types.js';\n\n/** Table definitions for SQL Server catalog views used during introspection. */\nexport const SysColumns = defineTable(\n 'columns',\n {\n object_id: col.int(),\n name: col.varchar(255),\n column_id: col.int(),\n max_length: col.int(),\n precision: col.int(),\n scale: col.int(),\n is_nullable: col.boolean(),\n is_identity: col.boolean(),\n default_object_id: col.int(),\n user_type_id: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysTables = defineTable(\n 'tables',\n {\n object_id: col.int(),\n name: col.varchar(255),\n schema_id: col.int(),\n is_ms_shipped: col.boolean()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysSchemas = defineTable(\n 'schemas',\n {\n schema_id: col.int(),\n name: col.varchar(255)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysTypes = defineTable(\n 'types',\n {\n user_type_id: col.int(),\n name: col.varchar(255)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysIndexes = defineTable(\n 'indexes',\n {\n object_id: col.int(),\n index_id: col.int(),\n name: col.varchar(255),\n is_primary_key: col.boolean(),\n is_unique: col.boolean(),\n has_filter: col.boolean(),\n filter_definition: col.varchar(1024),\n is_hypothetical: col.boolean()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysIndexColumns = defineTable(\n 'index_columns',\n {\n object_id: col.int(),\n index_id: col.int(),\n column_id: col.int(),\n key_ordinal: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysForeignKeys = defineTable(\n 'foreign_keys',\n {\n object_id: col.int(),\n name: col.varchar(255),\n delete_referential_action_desc: col.varchar(64),\n update_referential_action_desc: col.varchar(64)\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport const SysForeignKeyColumns = defineTable(\n 'foreign_key_columns',\n {\n constraint_object_id: col.int(),\n parent_object_id: col.int(),\n parent_column_id: col.int(),\n referenced_object_id: col.int(),\n referenced_column_id: col.int(),\n constraint_column_id: col.int()\n },\n {},\n undefined,\n { schema: 'sys' }\n);\n\nexport default {\n SysColumns,\n SysTables,\n SysSchemas,\n SysTypes,\n SysIndexes,\n SysIndexColumns,\n SysForeignKeys,\n SysForeignKeyColumns\n};\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Converts a string to lowercase.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LOWER SQL function.\r\n */\r\nexport const lower = (value: OperandInput): FunctionNode => fn('LOWER', [value]);\r\n\r\n/**\r\n * Converts a string to uppercase.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the UPPER SQL function.\r\n */\r\nexport const upper = (value: OperandInput): FunctionNode => fn('UPPER', [value]);\r\n\r\n/**\r\n * Returns the ASCII code of the first character of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the ASCII SQL function.\r\n */\r\nexport const ascii = (value: OperandInput): FunctionNode => fn('ASCII', [value]);\r\n\r\n/**\r\n * Returns a string from one or more ASCII codes.\r\n * @param codes - The ASCII codes.\r\n * @returns A FunctionNode representing the CHAR SQL function.\r\n */\r\nexport const char = (...codes: OperandInput[]): FunctionNode => {\r\n if (codes.length === 0) throw new Error('char() expects at least 1 argument');\r\n return fn('CHAR', codes);\r\n};\r\n\r\n/**\r\n * Returns the number of characters in a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the CHAR_LENGTH SQL function.\r\n */\r\nexport const charLength = (value: OperandInput): FunctionNode => fn('CHAR_LENGTH', [value]);\r\n\r\n/**\r\n * Returns the length of a string in bytes or characters.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LENGTH SQL function.\r\n */\r\nexport const length = (value: OperandInput): FunctionNode => fn('LENGTH', [value]);\r\n\r\n/**\r\n * Removes leading and trailing whitespace or specified characters from a string.\r\n * @param value - The string value.\r\n * @param chars - The characters to trim (optional).\r\n * @returns A FunctionNode representing the TRIM SQL function.\r\n */\r\nexport const trim = (value: OperandInput, chars?: OperandInput): FunctionNode =>\r\n chars === undefined ? fn('TRIM', [value]) : fn('TRIM', [value, chars]);\r\n\r\n/**\r\n * Removes leading whitespace from a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the LTRIM SQL function.\r\n */\r\nexport const ltrim = (value: OperandInput): FunctionNode => fn('LTRIM', [value]);\r\n\r\n/**\r\n * Removes trailing whitespace from a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the RTRIM SQL function.\r\n */\r\nexport const rtrim = (value: OperandInput): FunctionNode => fn('RTRIM', [value]);\r\n\r\n/**\r\n * Concatenates two or more strings.\r\n * @param args - The strings to concatenate.\r\n * @returns A FunctionNode representing the CONCAT SQL function.\r\n */\r\nexport const concat = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('concat() expects at least 2 arguments');\r\n return fn('CONCAT', args);\r\n};\r\n\r\n/**\r\n * Concatenates strings with a separator.\r\n * @param separator - The separator string.\r\n * @param args - The strings to concatenate.\r\n * @returns A FunctionNode representing the CONCAT_WS SQL function.\r\n */\r\nexport const concatWs = (separator: OperandInput, ...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 1) throw new Error('concatWs() expects at least 2 arguments including the separator');\r\n return fn('CONCAT_WS', [separator, ...args]);\r\n};\r\n\r\n/**\r\n * Extracts a substring from a string.\r\n * @param value - The string value.\r\n * @param start - The starting position.\r\n * @param length - The length of the substring (optional).\r\n * @returns A FunctionNode representing the SUBSTR SQL function.\r\n */\r\nexport const substr = (value: OperandInput, start: OperandInput, length?: OperandInput): FunctionNode =>\r\n length === undefined ? fn('SUBSTR', [value, start]) : fn('SUBSTR', [value, start, length]);\r\n\r\n/**\r\n * Returns the leftmost characters of a string.\r\n * @param value - The string value.\r\n * @param len - The number of characters to return.\r\n * @returns A FunctionNode representing the LEFT SQL function.\r\n */\r\nexport const left = (value: OperandInput, len: OperandInput): FunctionNode => fn('LEFT', [value, len]);\r\n\r\n/**\r\n * Returns the rightmost characters of a string.\r\n * @param value - The string value.\r\n * @param len - The number of characters to return.\r\n * @returns A FunctionNode representing the RIGHT SQL function.\r\n */\r\nexport const right = (value: OperandInput, len: OperandInput): FunctionNode => fn('RIGHT', [value, len]);\r\n\r\n/**\r\n * Returns the position of a substring in a string.\r\n * @param substring - The substring to search for.\r\n * @param value - The string to search in.\r\n * @returns A FunctionNode representing the POSITION SQL function.\r\n */\r\nexport const position = (substring: OperandInput, value: OperandInput): FunctionNode => fn('POSITION', [substring, value]);\r\n\r\n/**\r\n * Returns the position of a substring in a string.\r\n * @param value - The string to search in.\r\n * @param substring - The substring to search for.\r\n * @returns A FunctionNode representing the INSTR SQL function.\r\n */\r\nexport const instr = (value: OperandInput, substring: OperandInput): FunctionNode => fn('INSTR', [value, substring]);\r\n\r\n/**\r\n * Returns the position of a substring in a string, optionally starting from a position.\r\n * @param substring - The substring to search for.\r\n * @param value - The string to search in.\r\n * @param start - The starting position (optional).\r\n * @returns A FunctionNode representing the LOCATE SQL function.\r\n */\r\nexport const locate = (substring: OperandInput, value: OperandInput, start?: OperandInput): FunctionNode =>\r\n start === undefined ? fn('LOCATE', [substring, value]) : fn('LOCATE', [substring, value, start]);\r\n\r\n/**\r\n * Replaces occurrences of a substring in a string.\r\n * @param value - The string to search in.\r\n * @param search - The substring to replace.\r\n * @param replacement - The replacement string.\r\n * @returns A FunctionNode representing the REPLACE SQL function.\r\n */\r\nexport const replace = (value: OperandInput, search: OperandInput, replacement: OperandInput): FunctionNode =>\r\n fn('REPLACE', [value, search, replacement]);\r\n\r\n/**\r\n * Repeats a string a specified number of times.\r\n * @param value - The string to repeat.\r\n * @param count - The number of times to repeat.\r\n * @returns A FunctionNode representing the REPEAT SQL function.\r\n */\r\nexport const repeat = (value: OperandInput, count: OperandInput): FunctionNode => fn('REPEAT', [value, count]);\r\n\r\n/**\r\n * Left-pads a string to a certain length with another string.\r\n * @param value - The string to pad.\r\n * @param len - The length to pad to.\r\n * @param pad - The padding string.\r\n * @returns A FunctionNode representing the LPAD SQL function.\r\n */\r\nexport const lpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('LPAD', [value, len, pad]);\r\n\r\n/**\r\n * Right-pads a string to a certain length with another string.\r\n * @param value - The string to pad.\r\n * @param len - The length to pad to.\r\n * @param pad - The padding string.\r\n * @returns A FunctionNode representing the RPAD SQL function.\r\n */\r\nexport const rpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('RPAD', [value, len, pad]);\r\n\r\n/**\r\n * Returns a string consisting of a specified number of spaces.\r\n * @param count - The number of spaces.\r\n * @returns A FunctionNode representing the SPACE SQL function.\r\n */\r\nexport const space = (count: OperandInput): FunctionNode => fn('SPACE', [count]);\r\n\r\n/**\r\n * Reverses a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the REVERSE SQL function.\r\n */\r\nexport const reverse = (value: OperandInput): FunctionNode => fn('REVERSE', [value]);\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the INITCAP SQL function.\r\n */\r\nexport const initcap = (value: OperandInput): FunctionNode => fn('INITCAP', [value]);\r\n\r\n/**\r\n * Returns the MD5 hash of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the MD5 SQL function.\r\n */\r\nexport const md5 = (value: OperandInput): FunctionNode => fn('MD5', [value]);\r\n\r\n/**\r\n * Returns the SHA-1 hash of a string.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the SHA1 SQL function.\r\n */\r\nexport const sha1 = (value: OperandInput): FunctionNode => fn('SHA1', [value]);\r\n\r\n/**\r\n * Returns the SHA-2 hash of a string with a specified bit length.\r\n * @param value - The string value.\r\n * @param bits - The bit length (e.g., 224, 256, 384, 512).\r\n * @returns A FunctionNode representing the SHA2 SQL function.\r\n */\r\nexport const sha2 = (value: OperandInput, bits: OperandInput): FunctionNode => fn('SHA2', [value, bits]);\r\n\r\n/**\r\n * Returns the length of a string in bits.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the BIT_LENGTH SQL function.\r\n */\r\nexport const bitLength = (value: OperandInput): FunctionNode => fn('BIT_LENGTH', [value]);\r\n\r\n/**\r\n * Returns the length of a string in bytes.\r\n * @param value - The string value.\r\n * @returns A FunctionNode representing the OCTET_LENGTH SQL function.\r\n */\r\nexport const octetLength = (value: OperandInput): FunctionNode => fn('OCTET_LENGTH', [value]);\r\n\r\n/**\r\n * Returns a string from an ASCII code.\r\n * @param code - The ASCII code.\r\n * @returns A FunctionNode representing the CHR/CHAR SQL function.\r\n */\r\nexport const chr = (code: OperandInput): FunctionNode => fn('CHR', [code]);\r\n\r\n","import { caseWhen, cast, div, eq, inList, valueToOperand, columnOperand, ValueOperandInput } from '../../../ast/expression-builders.js';\nimport { isOperandNode } from '../../../ast/expression-nodes.js';\nimport type { OperandNode } from '../../../ast/expression.js';\nimport type { ColumnRef } from '../../../ast/types.js';\nimport { concat, lower } from '../../../functions/text.js';\n\ntype OperandInput = OperandNode | ColumnRef | string | number | boolean | null;\n\nconst isColumnReference = (value: unknown): value is ColumnRef =>\n typeof value === 'object' &&\n value !== null &&\n !('type' in value) &&\n 'name' in value &&\n typeof (value as ColumnRef).name === 'string';\n\nconst toOperandNode = (value: OperandInput): OperandNode => {\n if (isOperandNode(value)) return value;\n if (isColumnReference(value)) return columnOperand(value);\n return valueToOperand(value as ValueOperandInput);\n};\n\nconst fn = (name: string, args: OperandInput[]): OperandNode => ({\n type: 'Function',\n name,\n fn: name,\n args: args.map(arg => toOperandNode(arg))\n});\n\nconst CHAR_TYPES = ['varchar', 'char', 'varbinary', 'binary', 'nvarchar', 'nchar'];\nconst DECIMAL_TYPES = ['decimal', 'numeric'];\n\n/**\n * Returns an expression that calls OBJECT_DEFINITION for the given object ID.\n * Used to retrieve the source text of views, procedures, etc.\n */\nexport const objectDefinition = (objectId: OperandInput): OperandNode => fn('OBJECT_DEFINITION', [objectId]);\n\n/**\n * Builds a SQL Server data type string representation from its components.\n * \n * @param typeName The base type name.\n * @param maxLength The maximum length for char/binary types.\n * @param precision The precision for decimal/numeric types.\n * @param scale The scale for decimal/numeric types.\n * @returns An expression that evaluates to the full data type string.\n */\nexport const buildMssqlDataType = (\n typeName: OperandInput,\n maxLength: OperandInput,\n precision: OperandInput,\n scale: OperandInput\n): OperandNode => {\n const typeOperand = toOperandNode(typeName);\n const maxLenOperand = toOperandNode(maxLength);\n const precisionOperand = toOperandNode(precision);\n const scaleOperand = toOperandNode(scale);\n const typeLower = lower(typeOperand);\n\n const lengthCase = caseWhen(\n [\n {\n when: eq(maxLenOperand, -1),\n then: 'max'\n },\n {\n when: inList(typeLower, ['nvarchar', 'nchar']),\n then: cast(div(maxLenOperand, 2), 'varchar(10)')\n }\n ],\n cast(maxLenOperand, 'varchar(10)')\n );\n\n const charSuffix = concat('(', lengthCase, ')');\n\n const decimalSuffix = concat(\n '(',\n cast(precisionOperand, 'varchar(10)'),\n ',',\n cast(scaleOperand, 'varchar(10)'),\n ')'\n );\n\n const suffix = caseWhen(\n [\n { when: inList(typeLower, CHAR_TYPES), then: charSuffix },\n { when: inList(typeLower, DECIMAL_TYPES), then: decimalSuffix }\n ],\n ''\n );\n\n return concat(typeLower, suffix);\n};\n\nexport default {\n objectDefinition,\n buildMssqlDataType\n};\n","import type { ReferentialAction } from '../../../schema/column-types.js';\nimport { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { shouldIncludeTable, queryRows } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport type { IntrospectContext } from './context.js';\nimport { runSelectNode } from './run-select.js';\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\nimport type { ColumnNode, ExpressionNode, FunctionNode } from '../../ast/expression-nodes.js';\nimport type { JoinNode } from '../../ast/join.js';\nimport { eq, and } from '../../ast/expression-builders.js';\nimport type { TableDef } from '../../../schema/table.js';\nimport {\n SysColumns,\n SysTables,\n SysSchemas,\n SysTypes,\n SysIndexes,\n SysIndexColumns,\n SysForeignKeys,\n SysForeignKeyColumns\n} from './catalogs/mssql.js';\nimport { buildMssqlDataType, objectDefinition } from './functions/mssql.js';\n\ntype MssqlColumnRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: boolean | number;\n is_identity: boolean | number;\n column_default: string | null;\n};\n\ntype MssqlPrimaryKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n key_ordinal: number;\n};\n\ntype MssqlIndexRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n is_unique: boolean | number;\n has_filter: boolean | number;\n filter_definition: string | null;\n};\n\ntype MssqlIndexColumnRow = {\n table_schema: string;\n table_name: string;\n index_name: string;\n column_name: string;\n key_ordinal: number;\n};\n\ntype MssqlForeignKeyRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n constraint_name: string;\n referenced_schema: string;\n referenced_table: string;\n referenced_column: string;\n delete_rule: string | null;\n update_rule: string | null;\n};\n\ntype MssqlTableCommentRow = {\n table_schema: string;\n table_name: string;\n comment: string | null;\n};\n\ntype MssqlColumnCommentRow = {\n table_schema: string;\n table_name: string;\n column_name: string;\n comment: string | null;\n};\n\ntype ForeignKeyEntry = {\n table: string;\n column: string;\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n name?: string;\n};\n\nconst normalizeReferentialAction = (value: string | null | undefined): ReferentialAction | undefined => {\n if (!value) return undefined;\n const normalized = value.replace(/_/g, ' ').toUpperCase();\n const allowed: ReferentialAction[] = ['NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL', 'SET DEFAULT'];\n return allowed.includes(normalized as ReferentialAction) ? (normalized as ReferentialAction) : undefined;\n};\n\nconst tableNode = (table: TableDef, alias: string): TableNode => ({\n type: 'Table',\n name: table.name,\n schema: table.schema,\n alias\n});\n\nconst columnNode = (table: string, name: string, alias?: string): ColumnNode => ({\n type: 'Column',\n table,\n name,\n alias\n});\n\nconst combineConditions = (...expressions: (ExpressionNode | undefined)[]): ExpressionNode | undefined => {\n const filtered = expressions.filter(Boolean) as ExpressionNode[];\n if (!filtered.length) return undefined;\n if (filtered.length === 1) return filtered[0];\n return and(...filtered);\n};\n\n/**\n * Schema introspector for Microsoft SQL Server.\n * Queryies system catalogs (sys.tables, sys.columns, etc.) to extract schema metadata.\n */\nexport const mssqlIntrospector: SchemaIntrospector = {\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const schemaCondition = schema ? eq(columnNode('sch', 'name'), schema) : undefined;\n const schemaFilter = schema ? 'AND sch.name = @p1' : '';\n const schemaParams = schema ? [schema] : [];\n const tableCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n CONVERT(nvarchar(4000), ep.value) AS comment\n FROM sys.extended_properties ep\n JOIN sys.tables t ON t.object_id = ep.major_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE ep.class = 1\n AND ep.minor_id = 0\n AND ep.name = 'MS_Description'\n ${schemaFilter}\n `,\n schemaParams\n )) as MssqlTableCommentRow[];\n const columnCommentRows = (await queryRows(\n ctx.executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n col.name AS column_name,\n CONVERT(nvarchar(4000), ep.value) AS comment\n FROM sys.extended_properties ep\n JOIN sys.columns col ON col.object_id = ep.major_id AND col.column_id = ep.minor_id\n JOIN sys.tables t ON t.object_id = col.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE ep.class = 1\n AND ep.minor_id > 0\n AND ep.name = 'MS_Description'\n ${schemaFilter}\n `,\n schemaParams\n )) as MssqlColumnCommentRow[];\n const tableComments = new Map<string, string>();\n tableCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.comment) return;\n const trimmed = r.comment.trim();\n if (!trimmed) return;\n tableComments.set(`${r.table_schema}.${r.table_name}`, trimmed);\n });\n const columnComments = new Map<string, string>();\n columnCommentRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n if (!r.comment) return;\n const trimmed = r.comment.trim();\n if (!trimmed) return;\n columnComments.set(`${r.table_schema}.${r.table_name}.${r.column_name}`, trimmed);\n });\n\n const dataTypeExpression = buildMssqlDataType(\n { table: 'ty', name: 'name' },\n { table: 'c', name: 'max_length' },\n { table: 'c', name: 'precision' },\n { table: 'c', name: 'scale' }\n ) as FunctionNode;\n\n const defaultExpression = objectDefinition({ table: 'c', name: 'default_object_id' }) as FunctionNode;\n\n const columnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysColumns, 'c'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n { ...dataTypeExpression, alias: 'data_type' },\n columnNode('c', 'is_nullable'),\n columnNode('c', 'is_identity'),\n { ...defaultExpression, alias: 'column_default' }\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'c', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTypes, 'ty'),\n condition: eq({ table: 'ty', name: 'user_type_id' }, { table: 'c', name: 'user_type_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 't', name: 'is_ms_shipped' }, 0),\n schemaCondition\n )\n };\n\n const pkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexes, 'i'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('ic', 'key_ordinal', 'key_ordinal')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysIndexColumns, 'ic'),\n condition: and(\n eq({ table: 'ic', name: 'object_id' }, { table: 'i', name: 'object_id' }),\n eq({ table: 'ic', name: 'index_id' }, { table: 'i', name: 'index_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'ic', name: 'object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'ic', name: 'column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 1),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('ic', 'key_ordinal'),\n direction: 'ASC'\n }\n ]\n };\n\n const fkQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysForeignKeyColumns, 'fkc'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('fk', 'name', 'constraint_name'),\n columnNode('rsch', 'name', 'referenced_schema'),\n columnNode('rt', 'name', 'referenced_table'),\n columnNode('rc', 'name', 'referenced_column'),\n columnNode('fk', 'delete_referential_action_desc', 'delete_rule'),\n columnNode('fk', 'update_referential_action_desc', 'update_rule')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysForeignKeys, 'fk'),\n condition: eq({ table: 'fk', name: 'object_id' }, { table: 'fkc', name: 'constraint_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'fkc', name: 'parent_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'fkc', name: 'parent_object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'fkc', name: 'parent_column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 'rt'),\n condition: eq({ table: 'rt', name: 'object_id' }, { table: 'fkc', name: 'referenced_object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'rsch'),\n condition: eq({ table: 'rsch', name: 'schema_id' }, { table: 'rt', name: 'schema_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'rc'),\n condition: and(\n eq({ table: 'rc', name: 'object_id' }, { table: 'fkc', name: 'referenced_object_id' }),\n eq({ table: 'rc', name: 'column_id' }, { table: 'fkc', name: 'referenced_column_id' })\n )\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 't', name: 'is_ms_shipped' }, 0),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('fk', 'name'),\n direction: 'ASC'\n },\n {\n type: 'OrderBy',\n term: columnNode('fkc', 'constraint_column_id'),\n direction: 'ASC'\n }\n ]\n };\n\n const indexQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexes, 'i'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('i', 'name', 'index_name'),\n columnNode('i', 'is_unique'),\n columnNode('i', 'has_filter'),\n columnNode('i', 'filter_definition')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 0),\n eq({ table: 'i', name: 'is_hypothetical' }, 0),\n schemaCondition\n )\n };\n\n const indexColumnsQuery: SelectQueryNode = {\n type: 'SelectQuery',\n from: tableNode(SysIndexColumns, 'ic'),\n columns: [\n columnNode('sch', 'name', 'table_schema'),\n columnNode('t', 'name', 'table_name'),\n columnNode('i', 'name', 'index_name'),\n columnNode('c', 'name', 'column_name'),\n columnNode('ic', 'key_ordinal', 'key_ordinal')\n ],\n joins: [\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysIndexes, 'i'),\n condition: and(\n eq({ table: 'ic', name: 'object_id' }, { table: 'i', name: 'object_id' }),\n eq({ table: 'ic', name: 'index_id' }, { table: 'i', name: 'index_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysColumns, 'c'),\n condition: and(\n eq({ table: 'c', name: 'object_id' }, { table: 'ic', name: 'object_id' }),\n eq({ table: 'c', name: 'column_id' }, { table: 'ic', name: 'column_id' })\n )\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysTables, 't'),\n condition: eq({ table: 't', name: 'object_id' }, { table: 'i', name: 'object_id' })\n } as JoinNode,\n {\n type: 'Join',\n kind: 'INNER',\n table: tableNode(SysSchemas, 'sch'),\n condition: eq({ table: 'sch', name: 'schema_id' }, { table: 't', name: 'schema_id' })\n } as JoinNode\n ],\n where: combineConditions(\n eq({ table: 'i', name: 'is_primary_key' }, 0),\n schemaCondition\n ),\n orderBy: [\n {\n type: 'OrderBy',\n term: columnNode('ic', 'key_ordinal'),\n direction: 'ASC'\n }\n ]\n };\n\n const columnRows = (await runSelectNode<MssqlColumnRow>(columnsQuery, ctx)) as MssqlColumnRow[];\n const pkRows = (await runSelectNode<MssqlPrimaryKeyRow>(pkQuery, ctx)) as MssqlPrimaryKeyRow[];\n const fkRows = (await runSelectNode<MssqlForeignKeyRow>(fkQuery, ctx)) as MssqlForeignKeyRow[];\n const indexRows = (await runSelectNode<MssqlIndexRow>(indexQuery, ctx)) as MssqlIndexRow[];\n const indexColsRows = (await runSelectNode<MssqlIndexColumnRow>(indexColumnsQuery, ctx)) as MssqlIndexColumnRow[];\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const list = pkMap.get(key) || [];\n list.push(r.column_name);\n pkMap.set(key, list);\n });\n\n const fkMap = new Map<string, ForeignKeyEntry[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n const list = fkMap.get(key) || [];\n list.push({\n table: `${r.referenced_schema}.${r.referenced_table}`,\n column: r.referenced_column,\n onDelete: normalizeReferentialAction(r.delete_rule),\n onUpdate: normalizeReferentialAction(r.update_rule),\n name: r.constraint_name\n });\n fkMap.set(key, list);\n });\n\n const indexColumnsMap = new Map<string, { column: string; order: number }[]>();\n indexColsRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\n const list = indexColumnsMap.get(key) || [];\n list.push({ column: r.column_name, order: r.key_ordinal });\n indexColumnsMap.set(key, list);\n });\n\n const tablesByKey = new Map<string, DatabaseTable>();\n\n columnRows.forEach(r => {\n if (!shouldIncludeTable(r.table_name, options)) return;\n const key = `${r.table_schema}.${r.table_name}`;\n if (!tablesByKey.has(key)) {\n tablesByKey.set(key, {\n name: r.table_name,\n schema: r.table_schema,\n columns: [],\n primaryKey: pkMap.get(key) || [],\n indexes: [],\n comment: tableComments.get(key)\n });\n }\n const table = tablesByKey.get(key)!;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === false || r.is_nullable === 0,\n default: r.column_default ?? undefined,\n autoIncrement: !!r.is_identity\n };\n const columnComment = columnComments.get(`${key}.${r.column_name}`);\n if (columnComment) {\n column.comment = columnComment;\n }\n const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];\n if (fk) {\n column.references = {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n name: fk.name\n };\n }\n table.columns.push(column);\n });\n\n indexRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}`;\n const table = tablesByKey.get(key);\n if (!table) return;\n const cols = (indexColumnsMap.get(`${r.table_schema}.${r.table_name}.${r.index_name}`) || [])\n .sort((a, b) => a.order - b.order)\n .map(c => ({ column: c.column }));\n const idx: DatabaseIndex = {\n name: r.index_name,\n columns: cols,\n unique: !!r.is_unique,\n where: r.has_filter ? r.filter_definition ?? undefined : undefined\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import type { DialectName } from '../schema-generator.js';\r\nimport type { SchemaIntrospector } from './types.js';\r\nimport { postgresIntrospector } from './postgres.js';\r\nimport { mysqlIntrospector } from './mysql.js';\r\nimport { sqliteIntrospector } from './sqlite.js';\r\nimport { mssqlIntrospector } from './mssql.js';\r\n\r\n/** Registry mapping dialect names to their corresponding schema introspectors. */\r\nconst registry = new Map<DialectName, SchemaIntrospector>();\r\n\r\n/**\r\n * Registers the built-in schema introspectors for all supported database dialects.\r\n */\r\nconst registerBuiltInIntrospectors = () => {\r\n registry.set('postgres', postgresIntrospector);\r\n registry.set('mysql', mysqlIntrospector);\r\n registry.set('sqlite', sqliteIntrospector);\r\n registry.set('mssql', mssqlIntrospector);\r\n};\r\n\r\nregisterBuiltInIntrospectors();\r\n\r\n/**\r\n * Registers a schema introspector for a dialect.\r\n * @param dialect - The dialect name.\r\n * @param introspector - The schema introspector.\r\n */\r\nexport const registerSchemaIntrospector = (dialect: DialectName, introspector: SchemaIntrospector): void => {\r\n registry.set(dialect, introspector);\r\n};\r\n\r\n/**\r\n * Gets the schema introspector for a dialect.\r\n * @param dialect - The dialect name.\r\n * @returns The schema introspector or undefined if not found.\r\n */\r\nexport const getSchemaIntrospector = (dialect: DialectName): SchemaIntrospector | undefined => {\r\n return registry.get(dialect);\r\n};\r\n\r\n","import type { DialectName } from './schema-generator.js';\r\nimport { DatabaseSchema } from './schema-types.js';\r\nimport { DbExecutor } from '../execution/db-executor.js';\r\nimport type { IntrospectOptions, SchemaIntrospector, IntrospectContext } from './introspect/types.js';\r\nimport { getSchemaIntrospector } from './introspect/registry.js';\r\nimport { DialectFactory } from '../dialect/dialect-factory.js';\r\n\r\n/**\r\n * Introspects an existing database schema using the dialect-specific strategy.\r\n */\r\nexport const introspectSchema = async (\r\n executor: DbExecutor,\r\n dialect: DialectName,\r\n options: IntrospectOptions = {}\r\n): Promise<DatabaseSchema> => {\r\n const handler = getSchemaIntrospector(dialect);\r\n if (!handler) {\r\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\r\n }\r\n const dialectInstance = DialectFactory.create(dialect);\r\n const ctx: IntrospectContext = { executor, dialect: dialectInstance };\r\n return handler.introspect(ctx, options);\r\n};\r\n\r\nexport type { IntrospectOptions, SchemaIntrospector };\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Returns the absolute value of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ABS SQL function.\r\n */\r\nexport const abs = (value: OperandInput): FunctionNode => fn('ABS', [value]);\r\n\r\n/**\r\n * Returns the arccosine (inverse cosine) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ACOS SQL function.\r\n */\r\nexport const acos = (value: OperandInput): FunctionNode => fn('ACOS', [value]);\r\n\r\n/**\r\n * Returns the arcsine (inverse sine) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ASIN SQL function.\r\n */\r\nexport const asin = (value: OperandInput): FunctionNode => fn('ASIN', [value]);\r\n\r\n/**\r\n * Returns the arctangent (inverse tangent) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the ATAN SQL function.\r\n */\r\nexport const atan = (value: OperandInput): FunctionNode => fn('ATAN', [value]);\r\n\r\n/**\r\n * Returns the arctangent of the two arguments.\r\n * @param y - The y-coordinate.\r\n * @param x - The x-coordinate.\r\n * @returns A FunctionNode representing the ATAN2 SQL function.\r\n */\r\nexport const atan2 = (y: OperandInput, x: OperandInput): FunctionNode => fn('ATAN2', [y, x]);\r\n\r\n/**\r\n * Returns the smallest integer greater than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CEIL SQL function.\r\n */\r\nexport const ceil = (value: OperandInput): FunctionNode => fn('CEIL', [value]);\r\n\r\n/**\r\n * Alias for ceil. Returns the smallest integer greater than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CEILING SQL function.\r\n */\r\nexport const ceiling = (value: OperandInput): FunctionNode => fn('CEILING', [value]);\r\n\r\n/**\r\n * Returns the cosine of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the COS SQL function.\r\n */\r\nexport const cos = (value: OperandInput): FunctionNode => fn('COS', [value]);\r\n\r\n/**\r\n * Returns the cotangent of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the COT SQL function.\r\n */\r\nexport const cot = (value: OperandInput): FunctionNode => fn('COT', [value]);\r\n\r\n/**\r\n * Converts radians to degrees.\r\n * @param value - The angle in radians.\r\n * @returns A FunctionNode representing the DEGREES SQL function.\r\n */\r\nexport const degrees = (value: OperandInput): FunctionNode => fn('DEGREES', [value]);\r\n\r\n/**\r\n * Returns e raised to the power of the argument.\r\n * @param value - The exponent.\r\n * @returns A FunctionNode representing the EXP SQL function.\r\n */\r\nexport const exp = (value: OperandInput): FunctionNode => fn('EXP', [value]);\r\n\r\n/**\r\n * Returns the largest integer less than or equal to a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the FLOOR SQL function.\r\n */\r\nexport const floor = (value: OperandInput): FunctionNode => fn('FLOOR', [value]);\r\n\r\n/**\r\n * Returns the natural logarithm (base e) of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LN SQL function.\r\n */\r\nexport const ln = (value: OperandInput): FunctionNode => fn('LN', [value]);\r\n\r\n/**\r\n * Returns the base-10 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG SQL function.\r\n */\r\nexport const log = (value: OperandInput): FunctionNode => fn('LOG', [value]);\r\n\r\n/**\r\n * Returns the base-10 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG10 SQL function.\r\n */\r\nexport const log10 = (value: OperandInput): FunctionNode => fn('LOG10', [value]);\r\n\r\n/**\r\n * Returns the logarithm of a number for a specific base.\r\n * @param base - The base of the logarithm.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG_BASE SQL function.\r\n */\r\nexport const logBase = (base: OperandInput, value: OperandInput): FunctionNode => fn('LOG_BASE', [base, value]);\r\n\r\n/**\r\n * Returns the remainder of dividing x by y.\r\n * @param x - The dividend.\r\n * @param y - The divisor.\r\n * @returns A FunctionNode representing the MOD SQL function.\r\n */\r\nexport const mod = (x: OperandInput, y: OperandInput): FunctionNode => fn('MOD', [x, y]);\r\n\r\n/**\r\n * Returns the value of PI (approximately 3.14159...).\r\n * @returns A FunctionNode representing the PI SQL function.\r\n */\r\nexport const pi = (): FunctionNode => fn('PI', []);\r\n\r\n/**\r\n * Returns x raised to the power of y.\r\n * @param x - The base.\r\n * @param y - The exponent.\r\n * @returns A FunctionNode representing the POWER SQL function.\r\n */\r\nexport const power = (x: OperandInput, y: OperandInput): FunctionNode => fn('POWER', [x, y]);\r\n\r\n/**\r\n * Alias for power. Returns x raised to the power of y.\r\n * @param x - The base.\r\n * @param y - The exponent.\r\n * @returns A FunctionNode representing the POW SQL function.\r\n */\r\nexport const pow = (x: OperandInput, y: OperandInput): FunctionNode => fn('POW', [x, y]);\r\n\r\n/**\r\n * Converts degrees to radians.\r\n * @param value - The angle in degrees.\r\n * @returns A FunctionNode representing the RADIANS SQL function.\r\n */\r\nexport const radians = (value: OperandInput): FunctionNode => fn('RADIANS', [value]);\r\n\r\n/**\r\n * Returns a random number between 0 and 1.\r\n * @returns A FunctionNode representing the RANDOM SQL function.\r\n */\r\nexport const random = (): FunctionNode => fn('RANDOM', []);\r\n\r\n/**\r\n * Alias for random. Returns a random number between 0 and 1.\r\n * @returns A FunctionNode representing the RAND SQL function.\r\n */\r\nexport const rand = (): FunctionNode => fn('RAND', []);\r\n\r\n/**\r\n * Rounds a number to a specified number of decimal places.\r\n * @param value - The numeric value to round.\r\n * @param decimals - The number of decimal places (optional).\r\n * @returns A FunctionNode representing the ROUND SQL function.\r\n */\r\nexport const round = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('ROUND', [value]) : fn('ROUND', [value, decimals]);\r\n\r\n/**\r\n * Returns the sign of a number (-1 for negative, 0 for zero, 1 for positive).\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the SIGN SQL function.\r\n */\r\nexport const sign = (value: OperandInput): FunctionNode => fn('SIGN', [value]);\r\n\r\n/**\r\n * Returns the sine of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the SIN SQL function.\r\n */\r\nexport const sin = (value: OperandInput): FunctionNode => fn('SIN', [value]);\r\n\r\n/**\r\n * Returns the square root of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the SQRT SQL function.\r\n */\r\nexport const sqrt = (value: OperandInput): FunctionNode => fn('SQRT', [value]);\r\n\r\n/**\r\n * Returns the tangent of a number (in radians).\r\n * @param value - The numeric value in radians.\r\n * @returns A FunctionNode representing the TAN SQL function.\r\n */\r\nexport const tan = (value: OperandInput): FunctionNode => fn('TAN', [value]);\r\n\r\n/**\r\n * Truncates a number to a specified number of decimal places without rounding.\r\n * @param value - The numeric value to truncate.\r\n * @param decimals - The number of decimal places (optional).\r\n * @returns A FunctionNode representing the TRUNC SQL function.\r\n */\r\nexport const trunc = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('TRUNC', [value]) : fn('TRUNC', [value, decimals]);\r\n\r\n/**\r\n * Alias for trunc. Truncates a number to a specified number of decimal places without rounding.\r\n * @param value - The numeric value to truncate.\r\n * @param decimals - The number of decimal places.\r\n * @returns A FunctionNode representing the TRUNCATE SQL function.\r\n */\r\nexport const truncate = (value: OperandInput, decimals: OperandInput): FunctionNode =>\r\n fn('TRUNCATE', [value, decimals]);\r\n\r\n/**\r\n * Returns the base-2 logarithm of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the LOG2 SQL function.\r\n */\r\nexport const log2 = (value: OperandInput): FunctionNode => fn('LOG2', [value]);\r\n\r\n/**\r\n * Returns the cube root of a number.\r\n * @param value - The numeric value.\r\n * @returns A FunctionNode representing the CBRT SQL function.\r\n */\r\nexport const cbrt = (value: OperandInput): FunctionNode => fn('CBRT', [value]);\r\n\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Returns the current local date and time.\r\n * @returns A FunctionNode representing the NOW() SQL function.\r\n */\r\nexport const now = (): FunctionNode => fn('NOW', []);\r\n\r\n/**\r\n * Returns the current date without time.\r\n * @returns A FunctionNode representing the CURRENT_DATE SQL function.\r\n */\r\nexport const currentDate = (): FunctionNode => fn('CURRENT_DATE', []);\r\n\r\n/**\r\n * Returns the current time without date.\r\n * @returns A FunctionNode representing the CURRENT_TIME SQL function.\r\n */\r\nexport const currentTime = (): FunctionNode => fn('CURRENT_TIME', []);\r\n\r\n/**\r\n * Returns the current UTC date and time.\r\n * @returns A FunctionNode representing the UTC_NOW() SQL function.\r\n */\r\nexport const utcNow = (): FunctionNode => fn('UTC_NOW', []);\r\n\r\n/**\r\n * Returns the current local time.\r\n * @returns A FunctionNode representing the LOCALTIME SQL function.\r\n */\r\nexport const localTime = (): FunctionNode => fn('LOCALTIME', []);\r\n\r\n/**\r\n * Returns the current local timestamp.\r\n * @returns A FunctionNode representing the LOCALTIMESTAMP SQL function.\r\n */\r\nexport const localTimestamp = (): FunctionNode => fn('LOCALTIMESTAMP', []);\r\n\r\n/**\r\n * Extracts a specified part from a date or datetime value.\r\n * @param part - The date part to extract (e.g., 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND').\r\n * @param date - The date or datetime value to extract from.\r\n * @returns A FunctionNode representing the EXTRACT SQL function.\r\n */\r\nexport const extract = (part: OperandInput, date: OperandInput): FunctionNode => fn('EXTRACT', [part, date]);\r\n\r\n/**\r\n * Extracts the year from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the YEAR SQL function.\r\n */\r\nexport const year = (date: OperandInput): FunctionNode => fn('YEAR', [date]);\r\n\r\n/**\r\n * Extracts the month from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the MONTH SQL function.\r\n */\r\nexport const month = (date: OperandInput): FunctionNode => fn('MONTH', [date]);\r\n\r\n/**\r\n * Extracts the day of the month from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the DAY SQL function.\r\n */\r\nexport const day = (date: OperandInput): FunctionNode => fn('DAY', [date]);\r\n\r\n/**\r\n * Adds a specified time interval to a date or datetime value.\r\n * @param date - The date or datetime value to add to.\r\n * @param interval - The number of units to add.\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND').\r\n * @returns A FunctionNode representing the DATE_ADD SQL function.\r\n */\r\nexport const dateAdd = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_ADD', [date, interval, unit]);\r\n\r\n/**\r\n * Subtracts a specified time interval from a date or datetime value.\r\n * @param date - The date or datetime value to subtract from.\r\n * @param interval - The number of units to subtract.\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND').\r\n * @returns A FunctionNode representing the DATE_SUB SQL function.\r\n */\r\nexport const dateSub = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_SUB', [date, interval, unit]);\r\n\r\n/**\r\n * Returns the difference between two dates in days.\r\n * @param date1 - The end date.\r\n * @param date2 - The start date.\r\n * @returns A FunctionNode representing the DATE_DIFF SQL function.\r\n */\r\nexport const dateDiff = (date1: OperandInput, date2: OperandInput): FunctionNode => fn('DATE_DIFF', [date1, date2]);\r\n\r\n/**\r\n * Converts a date or datetime value to a formatted string.\r\n * @param date - The date or datetime value to format.\r\n * @param format - The format string (dialect-specific).\r\n * @returns A FunctionNode representing the DATE_FORMAT SQL function.\r\n */\r\nexport const dateFormat = (date: OperandInput, format: OperandInput): FunctionNode => fn('DATE_FORMAT', [date, format]);\r\n\r\n/**\r\n * Returns the current Unix timestamp (seconds since 1970-01-01 00:00:00 UTC).\r\n * @returns A FunctionNode representing the UNIX_TIMESTAMP SQL function.\r\n */\r\nexport const unixTimestamp = (): FunctionNode => fn('UNIX_TIMESTAMP', []);\r\n\r\n/**\r\n * Converts a Unix timestamp (seconds since 1970-01-01 00:00:00 UTC) to a date.\r\n * @param timestamp - Unix timestamp in seconds.\r\n * @returns A FunctionNode representing the FROM_UNIXTIME SQL function.\r\n */\r\nexport const fromUnixTime = (timestamp: OperandInput): FunctionNode => fn('FROM_UNIXTIME', [timestamp]);\r\n\r\n/**\r\n * Returns the last day of the month for a given date.\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the END_OF_MONTH SQL function.\r\n */\r\nexport const endOfMonth = (date: OperandInput): FunctionNode => fn('END_OF_MONTH', [date]);\r\n\r\n/**\r\n * Returns the index of the weekday for a given date (1 = Sunday, 2 = Monday, etc.).\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the DAY_OF_WEEK SQL function.\r\n */\r\nexport const dayOfWeek = (date: OperandInput): FunctionNode => fn('DAY_OF_WEEK', [date]);\r\n\r\n/**\r\n * Returns the week number of the year for a given date.\r\n * @param date - The date value.\r\n * @returns A FunctionNode representing the WEEK_OF_YEAR SQL function.\r\n */\r\nexport const weekOfYear = (date: OperandInput): FunctionNode => fn('WEEK_OF_YEAR', [date]);\r\n\r\n/**\r\n * Truncates a date or datetime value to a specified precision (e.g., first day of the month/year).\r\n * @param part - The truncation precision (e.g., 'YEAR', 'MONTH', 'DAY').\r\n * @param date - The date or datetime value to truncate.\r\n * @returns A FunctionNode representing the DATE_TRUNC SQL function.\r\n */\r\nexport const dateTrunc = (part: OperandInput, date: OperandInput): FunctionNode => fn('DATE_TRUNC', [part, date]);\r\n\r\n/**\r\n * Returns the difference between two timestamps as an interval.\r\n * @param timestamp - The end timestamp.\r\n * @param baseTimestamp - The start timestamp (optional, defaults to current time).\r\n * @returns A FunctionNode representing the AGE SQL function.\r\n */\r\nexport const age = (timestamp: OperandInput, baseTimestamp?: OperandInput): FunctionNode =>\r\n baseTimestamp === undefined ? fn('AGE', [timestamp]) : fn('AGE', [timestamp, baseTimestamp]);\r\n\r\n/**\r\n * Extracts the hour from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the HOUR SQL function.\r\n */\r\nexport const hour = (date: OperandInput): FunctionNode => fn('HOUR', [date]);\r\n\r\n/**\r\n * Extracts the minute from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the MINUTE SQL function.\r\n */\r\nexport const minute = (date: OperandInput): FunctionNode => fn('MINUTE', [date]);\r\n\r\n/**\r\n * Extracts the second from a date or datetime value.\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the SECOND SQL function.\r\n */\r\nexport const second = (date: OperandInput): FunctionNode => fn('SECOND', [date]);\r\n\r\n/**\r\n * Extracts the quarter from a date or datetime value (1-4).\r\n * @param date - The date or datetime value.\r\n * @returns A FunctionNode representing the QUARTER SQL function.\r\n */\r\nexport const quarter = (date: OperandInput): FunctionNode => fn('QUARTER', [date]);\r\n\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column-types.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Returns the first non-null value in a list.\r\n * @param args - The list of values to check.\r\n * @returns A FunctionNode representing the COALESCE SQL function.\r\n */\r\nexport const coalesce = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('coalesce() expects at least 2 arguments');\r\n return fn('COALESCE', args);\r\n};\r\n\r\n/**\r\n * Returns null if the two arguments are equal, otherwise returns the first argument.\r\n * @param val1 - The first value.\r\n * @param val2 - The second value.\r\n * @returns A FunctionNode representing the NULLIF SQL function.\r\n */\r\nexport const nullif = (val1: OperandInput, val2: OperandInput): FunctionNode => fn('NULLIF', [val1, val2]);\r\n\r\n/**\r\n * Returns the largest value in a list.\r\n * @param args - The list of values to compare.\r\n * @returns A FunctionNode representing the GREATEST SQL function.\r\n */\r\nexport const greatest = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('greatest() expects at least 2 arguments');\r\n return fn('GREATEST', args);\r\n};\r\n\r\n/**\r\n * Returns the smallest value in a list.\r\n * @param args - The list of values to compare.\r\n * @returns A FunctionNode representing the LEAST SQL function.\r\n */\r\nexport const least = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('least() expects at least 2 arguments');\r\n return fn('LEAST', args);\r\n};\r\n\r\n/**\r\n * Returns the first argument if it is not null, otherwise returns the second argument.\r\n * @param val - The value to check.\r\n * @param defaultValue - The default value to return if val is null.\r\n * @returns A FunctionNode representing the COALESCE SQL function.\r\n */\r\nexport const ifNull = (val: OperandInput, defaultValue: OperandInput): FunctionNode => coalesce(val, defaultValue);\r\n","// Pure AST Builders - No Dialect Logic Here!\n\nimport { ColumnDef } from '../../schema/column-types.js';\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\n\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\n\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\n\nconst toOperand = (input: OperandInput): OperandNode => {\n if (isOperandNode(input)) return input;\n if (isColumnDef(input)) return columnOperand(input);\n\n return valueToOperand(input);\n};\n\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\n type: 'Function',\n name: key,\n fn: key,\n args: args.map(toOperand)\n});\n\nexport const jsonLength = (target: OperandInput, path?: OperandInput): FunctionNode =>\n path === undefined ? fn('JSON_LENGTH', [target]) : fn('JSON_LENGTH', [target, path]);\n\nexport const jsonSet = (target: OperandInput, path: OperandInput, value: OperandInput): FunctionNode =>\n fn('JSON_SET', [target, path, value]);\n\nexport const jsonArrayAgg = (value: OperandInput): FunctionNode => fn('JSON_ARRAYAGG', [value]);\n\nexport const jsonContains = (\n target: OperandInput,\n candidate: OperandInput,\n path?: OperandInput\n): FunctionNode =>\n path === undefined ? fn('JSON_CONTAINS', [target, candidate]) : fn('JSON_CONTAINS', [target, candidate, path]);\r\n","// Pure AST Builders - No Dialect Logic Here!\n\nimport { ColumnDef } from '../../schema/column-types.js';\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\n\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\n\nconst isColumnDef = (val: unknown): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\n\nconst toOperand = (input: OperandInput): OperandNode => {\n if (isOperandNode(input)) return input;\n if (isColumnDef(input)) return columnOperand(input);\n\n return valueToOperand(input);\n};\n\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\n type: 'Function',\n name: key,\n fn: key,\n args: args.map(toOperand)\n});\n\nexport const arrayAppend = (array: OperandInput, value: OperandInput): FunctionNode =>\n fn('ARRAY_APPEND', [array, value]);\r\n","// In a real Node environment: import { AsyncLocalStorage } from 'node:async_hooks';\r\n\r\n/**\r\n * Browser-compatible implementation of AsyncLocalStorage.\r\n * Provides a simple in-memory store for browser environments while maintaining\r\n * Node.js AsyncLocalStorage API compatibility.\r\n * \r\n * @template T Type of the data stored in the async context\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback function within a context containing the specified store value.\r\n * The store value is only available during the callback's execution and is automatically\r\n * cleared afterward.\r\n * \r\n * @param store - The context value to make available during callback execution\r\n * @param callback - Function to execute with the store value available\r\n * @returns Result of the callback function execution\r\n * \r\n * @example\r\n * ```\r\n * const als = new AsyncLocalStorage<number>();\r\n * als.run(42, () => {\r\n * console.log(als.getStore()); // Outputs: 42\r\n * });\r\n * ```\r\n */\r\n run<R>(store: T, callback: () => R): R {\r\n this.store = store;\r\n try {\r\n return callback();\r\n } finally {\r\n this.store = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the current store value from the async context.\r\n * Returns undefined if called outside of a `run()` callback execution.\r\n * \r\n * @returns Current store value or undefined if no context exists\r\n * \r\n * @example\r\n * ```\r\n * const als = new AsyncLocalStorage<string>();\r\n * console.log(als.getStore()); // Outputs: undefined\r\n * \r\n * als.run('hello', () => {\r\n * console.log(als.getStore()); // Outputs: 'hello'\r\n * });\r\n * ```\r\n */\r\n getStore(): T | undefined {\r\n return this.store;\r\n }\r\n}\r\n","import { SQL_OPERATORS, SqlOperator } from './sql.js';\r\n\r\n/**\r\n * Configuration for how SQL operators map to TypeScript builder helpers\r\n */\r\nexport interface SqlOperatorConfig {\r\n /**\r\n * SQL operator literal\r\n */\r\n sql: SqlOperator;\r\n /**\r\n * Corresponding TypeScript helper name\r\n */\r\n tsName: string;\r\n}\r\n\r\n/**\r\n * Registry of supported SQL operators and their companion helper names\r\n */\r\nexport const SQL_OPERATOR_REGISTRY: Record<SqlOperator, SqlOperatorConfig> = {\r\n [SQL_OPERATORS.EQUALS]: { sql: SQL_OPERATORS.EQUALS, tsName: 'eq' },\r\n [SQL_OPERATORS.NOT_EQUALS]: { sql: SQL_OPERATORS.NOT_EQUALS, tsName: 'neq' },\r\n [SQL_OPERATORS.GREATER_THAN]: { sql: SQL_OPERATORS.GREATER_THAN, tsName: 'gt' },\r\n [SQL_OPERATORS.GREATER_OR_EQUAL]: { sql: SQL_OPERATORS.GREATER_OR_EQUAL, tsName: 'gte' },\r\n [SQL_OPERATORS.LESS_THAN]: { sql: SQL_OPERATORS.LESS_THAN, tsName: 'lt' },\r\n [SQL_OPERATORS.LESS_OR_EQUAL]: { sql: SQL_OPERATORS.LESS_OR_EQUAL, tsName: 'lte' },\r\n [SQL_OPERATORS.LIKE]: { sql: SQL_OPERATORS.LIKE, tsName: 'like' },\r\n [SQL_OPERATORS.NOT_LIKE]: { sql: SQL_OPERATORS.NOT_LIKE, tsName: 'notLike' },\r\n [SQL_OPERATORS.IN]: { sql: SQL_OPERATORS.IN, tsName: 'inList' },\r\n [SQL_OPERATORS.NOT_IN]: { sql: SQL_OPERATORS.NOT_IN, tsName: 'notInList' },\r\n [SQL_OPERATORS.IS_NULL]: { sql: SQL_OPERATORS.IS_NULL, tsName: 'isNull' },\r\n [SQL_OPERATORS.IS_NOT_NULL]: { sql: SQL_OPERATORS.IS_NOT_NULL, tsName: 'isNotNull' },\r\n [SQL_OPERATORS.AND]: { sql: SQL_OPERATORS.AND, tsName: 'and' },\r\n [SQL_OPERATORS.OR]: { sql: SQL_OPERATORS.OR, tsName: 'or' },\r\n [SQL_OPERATORS.BETWEEN]: { sql: SQL_OPERATORS.BETWEEN, tsName: 'between' },\r\n [SQL_OPERATORS.NOT_BETWEEN]: { sql: SQL_OPERATORS.NOT_BETWEEN, tsName: 'notBetween' },\r\n [SQL_OPERATORS.EXISTS]: { sql: SQL_OPERATORS.EXISTS, tsName: 'exists' },\r\n [SQL_OPERATORS.NOT_EXISTS]: { sql: SQL_OPERATORS.NOT_EXISTS, tsName: 'notExists' }\r\n};\r\n","import type { TableNode, FunctionTableNode, DerivedTableNode, TableSourceNode } from '../core/ast/query.js';\nimport type { ColumnNode } from '../core/ast/expression.js';\r\n\r\n/**\r\n * Strategy interface for converting database names to TypeScript identifiers\r\n */\r\nexport interface NamingStrategy {\r\n /**\r\n * Converts a table name to a TypeScript symbol name\r\n * @param table - Table node, function table node, or name\n * @returns Valid TypeScript identifier\n */\n tableToSymbol(table: TableSourceNode | string): string;\n\r\n /**\r\n * Converts a column reference to a property name\r\n * @param column - Column node\r\n * @returns Valid TypeScript property name\r\n */\r\n columnToProperty(column: ColumnNode): string;\r\n}\r\n\r\n/**\r\n * Default naming strategy that maintains backward compatibility\r\n * with the original capitalize() behavior\r\n */\r\nexport class DefaultNamingStrategy implements NamingStrategy {\r\n /**\r\n * Converts table names to TypeScript symbols\r\n * @param table - Table node, function table node, or string name\n * @returns Capitalized table name (handles schema-qualified names)\n */\n tableToSymbol(table: TableNode | FunctionTableNode | DerivedTableNode | string): string {\n const tableName =\n typeof table === 'string'\n ? table\n : table.type === 'DerivedTable'\n ? table.alias\n : table.type === 'FunctionTable'\n ? table.alias ?? table.name\n : table.name;\n\r\n // Handle schema-qualified names (e.g., \"auth.user\" → \"AuthUser\")\r\n if (tableName.includes('.')) {\r\n return tableName.split('.')\r\n .map(part => this.capitalize(part))\r\n .join('');\r\n }\r\n\r\n return this.capitalize(tableName);\r\n }\r\n\r\n /**\r\n * Converts column references to property names\r\n * @param column - Column node\r\n * @returns Column name as-is (for backward compatibility)\r\n */\r\n columnToProperty(column: ColumnNode): string {\r\n return column.name;\r\n }\r\n\r\n /**\r\n * Capitalizes the first letter of a string\r\n * @param s - String to capitalize\r\n * @returns Capitalized string\r\n */\r\n private capitalize(s: string): string {\r\n if (!s) return s;\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n }\r\n}\r\n","import { OrderingTerm, SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n OperandNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n InExpressionNode,\r\n NullExpressionNode,\r\n JsonPathNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ArithmeticExpressionNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n AliasRefNode,\r\n CastExpressionNode,\r\n CollateExpressionNode,\r\n ExpressionVisitor,\r\n OperandVisitor,\r\n visitExpression,\r\n visitOperand\r\n} from '../core/ast/expression.js';\r\nimport { SQL_OPERATOR_REGISTRY } from '../core/sql/sql-operator-config.js';\r\nimport { SqlOperator } from '../core/sql/sql.js';\r\nimport { isRelationAlias } from '../query-builder/relation-alias.js';\r\nimport { HydrationMetadata } from '../core/hydration/types.js';\r\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\r\nimport { NamingStrategy, DefaultNamingStrategy } from './naming-strategy.js';\r\n\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled SQL operator: ${value}`);\r\n};\r\n\r\n/**\r\n * Generates TypeScript code from query AST nodes\r\n */\r\ntype SelectionColumn =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode\r\n | CastExpressionNode;\r\n\r\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\r\n constructor(private namingStrategy: NamingStrategy = new DefaultNamingStrategy()) { }\r\n\r\n /**\r\n * Generates TypeScript code from a query AST\r\n * @param ast - Query AST to generate code from\r\n * @returns Generated TypeScript code\r\n */\r\n generate(ast: SelectQueryNode): string {\r\n const chainLines = this.buildSelectLines(ast);\r\n const lines = chainLines.map((line, index) => (index === 0 ? `const query = ${line}` : line));\r\n lines.push(';', '', 'await query.execute();');\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Builds TypeScript method chain lines from query AST\r\n * @param ast - Query AST\r\n * @returns Array of TypeScript method chain lines\r\n */\r\n private buildSelectLines(ast: SelectQueryNode): string[] {\r\n const lines: string[] = [];\r\n const hydration = (ast.meta as HydrationMetadata | undefined)?.hydration;\r\n const hydratedRelations = new Set(hydration?.relations?.map(r => r.name) ?? []);\r\n\r\n const selections = ast.columns\r\n .filter((col): col is SelectionColumn => !(hydration && isRelationAlias(col.alias)))\r\n .map((col, index) => `${this.getSelectionKey(col, index)}: ${this.printOperand(col)}`);\r\n\r\n lines.push(`db.select({`);\r\n selections.forEach((sel, index) => {\r\n lines.push(` ${sel}${index < selections.length - 1 ? ',' : ''}`);\r\n });\r\n lines.push(`})`);\r\n lines.push(`.from(${this.namingStrategy.tableToSymbol(ast.from)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n const relationName = getJoinRelationName(join);\r\n if (relationName && hydratedRelations.has(relationName)) {\r\n return;\r\n }\r\n\r\n if (relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = this.namingStrategy.tableToSymbol(join.table);\r\n const cond = this.printExpression(join.condition);\r\n let method = 'innerJoin';\r\n if (join.kind === 'LEFT') method = 'leftJoin';\r\n if (join.kind === 'RIGHT') method = 'rightJoin';\r\n lines.push(`.${method}(${table}, ${cond})`);\r\n }\r\n });\r\n\r\n if (hydration?.relations?.length) {\r\n hydration.relations.forEach(rel => {\r\n const options: string[] = [];\r\n if (rel.columns.length) options.push(`columns: [${rel.columns.map(c => `'${c}'`).join(', ')}]`);\r\n if (rel.aliasPrefix !== rel.name) options.push(`aliasPrefix: '${rel.aliasPrefix}'`);\r\n const opts = options.length ? `, { ${options.join(', ')} }` : '';\r\n lines.push(`.include('${rel.name}'${opts})`);\r\n });\r\n }\r\n\r\n if (ast.where) {\r\n lines.push(`.where(${this.printExpression(ast.where)})`);\r\n }\r\n\r\n if (ast.groupBy && ast.groupBy.length) {\r\n const cols = ast.groupBy.map(term => this.printOrderingTerm(term)).join(', ');\r\n lines.push(`.groupBy(${cols})`);\r\n }\r\n\r\n if (ast.having) {\r\n lines.push(`.having(${this.printExpression(ast.having)})`);\r\n }\r\n\r\n if (ast.orderBy && ast.orderBy.length) {\r\n ast.orderBy.forEach(o => {\r\n const term = this.printOrderingTerm(o.term);\r\n const opts: string[] = [`direction: '${o.direction}'`];\r\n if (o.nulls) opts.push(`nulls: '${o.nulls}'`);\r\n if (o.collation) opts.push(`collation: '${o.collation}'`);\r\n const hasOpts = opts.length > 1;\r\n if (hasOpts) {\r\n lines.push(`.orderBy(${term}, { ${opts.join(', ')} })`);\r\n } else {\r\n lines.push(`.orderBy(${term}, '${o.direction}')`);\r\n }\r\n });\r\n }\r\n\r\n if (ast.limit) lines.push(`.limit(${ast.limit})`);\r\n if (ast.offset) lines.push(`.offset(${ast.offset})`);\r\n\r\n return lines;\r\n }\r\n\r\n /**\r\n * Prints an expression node to TypeScript code\r\n * @param expr - Expression node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printExpression(expr: ExpressionNode): string {\r\n return visitExpression(expr, this);\r\n }\r\n\r\n /**\r\n * Prints an operand node to TypeScript code\r\n * @param node - Operand node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printOperand(node: OperandNode): string {\r\n return visitOperand(node, this);\r\n }\r\n\r\n /**\r\n * Prints an ordering term (operand/expression/alias) to TypeScript code.\r\n */\r\n private printOrderingTerm(term: OrderingTerm): string {\r\n if (!term || !('type' in term)) {\r\n throw new Error('Unsupported ordering term');\r\n }\r\n\r\n switch (term.type) {\r\n case 'Column':\r\n return `${this.namingStrategy.tableToSymbol(term.table)}.${term.name}`;\r\n case 'AliasRef':\r\n return this.visitAliasRef(term);\r\n case 'Literal':\r\n case 'Function':\r\n case 'JsonPath':\r\n case 'ScalarSubquery':\r\n case 'CaseExpression':\r\n case 'WindowFunction':\r\n case 'Cast':\r\n case 'Collate':\r\n return this.printOperand(term);\r\n default:\r\n return this.printExpression(term);\r\n }\r\n }\r\n\r\n private getSelectionKey(selection: SelectionColumn, index: number): string {\r\n if (selection.alias) {\r\n return selection.alias;\r\n }\r\n if (this.isNamedSelection(selection)) {\r\n return selection.name;\r\n }\r\n return `selection${index + 1}`;\r\n }\r\n\r\n private isNamedSelection(selection: SelectionColumn): selection is ColumnNode | FunctionNode | WindowFunctionNode {\r\n return 'name' in selection;\r\n }\r\n\r\n public visitBinaryExpression(binary: BinaryExpressionNode): string {\r\n return this.printBinaryExpression(binary);\r\n }\r\n\r\n public visitLogicalExpression(logical: LogicalExpressionNode): string {\r\n return this.printLogicalExpression(logical);\r\n }\r\n\r\n public visitNullExpression(nullExpr: NullExpressionNode): string {\r\n return this.printNullExpression(nullExpr);\r\n }\r\n\r\n public visitInExpression(inExpr: InExpressionNode): string {\r\n return this.printInExpression(inExpr);\r\n }\r\n\r\n public visitExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n return this.printExistsExpression(existsExpr);\r\n }\r\n\r\n public visitBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n return this.printBetweenExpression(betweenExpr);\r\n }\r\n\r\n public visitArithmeticExpression(arithExpr: ArithmeticExpressionNode): string {\r\n return this.printArithmeticExpression(arithExpr);\r\n }\r\n\r\n public visitColumn(node: ColumnNode): string {\r\n return this.printColumnOperand(node);\r\n }\r\n\r\n public visitLiteral(node: LiteralNode): string {\r\n return this.printLiteralOperand(node);\r\n }\r\n\r\n public visitFunction(node: FunctionNode): string {\r\n return this.printFunctionOperand(node);\r\n }\r\n\r\n public visitJsonPath(node: JsonPathNode): string {\r\n return this.printJsonPathOperand(node);\r\n }\r\n\r\n public visitScalarSubquery(node: ScalarSubqueryNode): string {\r\n return this.printScalarSubqueryOperand(node);\r\n }\r\n\r\n public visitCaseExpression(node: CaseExpressionNode): string {\r\n return this.printCaseExpressionOperand(node);\r\n }\r\n\r\n public visitWindowFunction(node: WindowFunctionNode): string {\r\n return this.printWindowFunctionOperand(node);\r\n }\r\n\r\n public visitCast(node: CastExpressionNode): string {\r\n return this.printCastOperand(node);\r\n }\r\n\r\n public visitCollate(node: CollateExpressionNode): string {\r\n return this.printCollateOperand(node);\r\n }\r\n\r\n public visitAliasRef(node: AliasRefNode): string {\r\n return `aliasRef('${node.name}')`;\r\n }\r\n\r\n /**\r\n * Prints a binary expression to TypeScript code\r\n * @param binary - Binary expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBinaryExpression(binary: BinaryExpressionNode): string {\r\n const left = this.printOperand(binary.left);\r\n const right = this.printOperand(binary.right);\r\n const fn = this.mapOp(binary.operator);\r\n const args = [left, right];\r\n if (binary.escape) {\r\n args.push(this.printOperand(binary.escape));\r\n }\r\n return `${fn}(${args.join(', ')})`;\r\n }\r\n\r\n /**\r\n * Prints a logical expression to TypeScript code\r\n * @param logical - Logical expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printLogicalExpression(logical: LogicalExpressionNode): string {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.printExpression(op);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return `${this.mapOp(logical.operator)}(\\n ${parts.join(',\\n ')}\\n )`;\r\n }\r\n\r\n private printArithmeticExpression(expr: ArithmeticExpressionNode): string {\r\n const left = this.printOperand(expr.left);\r\n const right = this.printOperand(expr.right);\r\n return `${left} ${expr.operator} ${right}`;\r\n }\r\n\r\n /**\r\n * Prints an IN expression to TypeScript code\r\n * @param inExpr - IN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printInExpression(inExpr: InExpressionNode): string {\r\n const left = this.printOperand(inExpr.left);\r\n const fn = this.mapOp(inExpr.operator);\r\n if (Array.isArray(inExpr.right)) {\r\n const values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n return `${fn}(${left}, [${values}])`;\r\n }\r\n const subquery = this.inlineChain(this.buildSelectLines(inExpr.right.query));\r\n return `${fn}(${left}, (${subquery}))`;\r\n }\r\n\r\n /**\r\n * Prints a null expression to TypeScript code\r\n * @param nullExpr - Null expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printNullExpression(nullExpr: NullExpressionNode): string {\r\n const left = this.printOperand(nullExpr.left);\r\n const fn = this.mapOp(nullExpr.operator);\r\n return `${fn}(${left})`;\r\n }\r\n\r\n /**\r\n * Prints a BETWEEN expression to TypeScript code\r\n * @param betweenExpr - BETWEEN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n const left = this.printOperand(betweenExpr.left);\r\n const lower = this.printOperand(betweenExpr.lower);\r\n const upper = this.printOperand(betweenExpr.upper);\r\n return `${this.mapOp(betweenExpr.operator)}(${left}, ${lower}, ${upper})`;\r\n }\r\n\r\n /**\r\n * Prints an EXISTS expression to TypeScript code\r\n * @param existsExpr - EXISTS expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(existsExpr.subquery));\r\n return `${this.mapOp(existsExpr.operator)}(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a column operand to TypeScript code\r\n * @param column - Column node\r\n * @returns TypeScript code representation\r\n */\r\n private printColumnOperand(column: ColumnNode): string {\r\n return `${this.namingStrategy.tableToSymbol(column.table)}.${column.name}`;\r\n }\r\n\r\n /**\r\n * Prints a literal operand to TypeScript code\r\n * @param literal - Literal node\r\n * @returns TypeScript code representation\r\n */\r\n private printLiteralOperand(literal: LiteralNode): string {\r\n if (literal.value === null) return 'null';\r\n return typeof literal.value === 'string' ? `'${literal.value}'` : String(literal.value);\r\n }\r\n\r\n /**\r\n * Prints a function operand to TypeScript code\r\n * @param fn - Function node\r\n * @returns TypeScript code representation\r\n */\r\n private printFunctionOperand(fn: FunctionNode): string {\r\n const args = fn.args.map(a => this.printOperand(a)).join(', ');\r\n return `${fn.name.toLowerCase()}(${args})`;\r\n }\r\n\r\n /**\r\n * Prints a JSON path operand to TypeScript code\r\n * @param json - JSON path node\r\n * @returns TypeScript code representation\r\n */\r\n private printJsonPathOperand(json: JsonPathNode): string {\r\n return `jsonPath(${this.namingStrategy.tableToSymbol(json.column.table)}.${json.column.name}, '${json.path}')`;\r\n }\r\n\r\n /**\r\n * Prints a scalar subquery operand to TypeScript code\r\n * @param node - Scalar subquery node\r\n * @returns TypeScript code representation\r\n */\r\n private printScalarSubqueryOperand(node: ScalarSubqueryNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(node.query));\r\n return `(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a CASE expression operand to TypeScript code\r\n * @param node - CASE expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printCaseExpressionOperand(node: CaseExpressionNode): string {\r\n const clauses = node.conditions.map(\r\n condition =>\r\n `{ when: ${this.printExpression(condition.when)}, then: ${this.printOperand(condition.then)} }`\r\n );\r\n const elseValue = node.else ? `, ${this.printOperand(node.else)}` : '';\r\n return `caseWhen([${clauses.join(', ')}]${elseValue})`;\r\n }\r\n\r\n /**\r\n * Prints a window function operand to TypeScript code\r\n * @param node - Window function node\r\n * @returns TypeScript code representation\r\n */\r\n private printWindowFunctionOperand(node: WindowFunctionNode): string {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.printOperand(arg)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause =\r\n 'PARTITION BY ' + node.partitionBy.map(col => `${this.namingStrategy.tableToSymbol(col.table)}.${col.name}`).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause =\r\n 'ORDER BY ' +\r\n node.orderBy\r\n .map(o => {\r\n const term = this.printOrderingTerm(o.term);\r\n const collation = o.collation ? ` COLLATE ${o.collation}` : '';\r\n const nulls = o.nulls ? ` NULLS ${o.nulls}` : '';\r\n return `${term} ${o.direction}${collation}${nulls}`;\r\n })\r\n .join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n }\r\n\r\n private printCastOperand(node: CastExpressionNode): string {\r\n const typeLiteral = node.castType.replace(/'/g, \"\\\\'\");\r\n return `cast(${this.printOperand(node.expression)}, '${typeLiteral}')`;\r\n }\r\n\r\n private printCollateOperand(node: CollateExpressionNode): string {\r\n return `collate(${this.printOperand(node.expression)}, '${node.collation}')`;\r\n }\r\n\r\n /**\r\n * Converts method chain lines to inline format\r\n * @param lines - Method chain lines\r\n * @returns Inline method chain string\r\n */\r\n private inlineChain(lines: string[]): string {\r\n return lines\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0)\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * Maps SQL operators to TypeScript function names\r\n * @param op - SQL operator\r\n * @returns TypeScript function name\r\n */\r\n private mapOp(op: SqlOperator): string {\r\n const config = SQL_OPERATOR_REGISTRY[op];\r\n if (!config) {\r\n return assertNever(op as never);\r\n }\r\n return config.tsName;\r\n }\r\n}\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Simple identity map for tracking entities within a session.\r\n * Ensures that the same database record is represented by a single entity instance.\r\n */\r\nexport class IdentityMap {\r\n private readonly buckets = new Map<string, Map<string, TrackedEntity>>();\r\n\r\n get bucketsMap(): Map<string, Map<string, TrackedEntity>> {\r\n return this.buckets;\r\n }\r\n\r\n /**\r\n * Retrieves an entity from the identity map if it exists.\r\n * @param table The table definition of the entity.\r\n * @param pk The primary key value.\r\n * @returns The entity instance if found, undefined otherwise.\r\n */\r\n getEntity(table: TableDef, pk: string | number): unknown | undefined {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket?.get(this.toIdentityKey(pk))?.entity;\r\n }\r\n\r\n /**\r\n * Registers a tracked entity in the identity map.\r\n * @param tracked The tracked entity metadata and instance.\r\n */\r\n register(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name) ?? new Map<string, TrackedEntity>();\r\n bucket.set(this.toIdentityKey(tracked.pk), tracked);\r\n this.buckets.set(tracked.table.name, bucket);\r\n }\r\n\r\n remove(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name);\r\n bucket?.delete(this.toIdentityKey(tracked.pk));\r\n }\r\n\r\n /**\r\n * Returns all tracked entities for a specific table.\r\n * @param table The table definition.\r\n * @returns Array of tracked entities.\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket ? Array.from(bucket.values()) : [];\r\n }\r\n\r\n clear(): void {\r\n this.buckets.clear();\r\n }\r\n\r\n private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\r\n}\r\n","import { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\n/**\r\n * Entity status enum representing the lifecycle state of an entity\r\n */\r\nexport enum EntityStatus {\r\n /** Entity is newly created and not yet persisted */\r\n New = 'new',\r\n /** Entity is managed by the ORM and synchronized with the database */\r\n Managed = 'managed',\r\n /** Entity has been modified but not yet persisted */\r\n Dirty = 'dirty',\r\n /** Entity has been marked for removal */\r\n Removed = 'removed',\r\n /** Entity is detached from the ORM context */\r\n Detached = 'detached'\r\n}\r\n\r\n/**\r\n * Represents an entity being tracked by the ORM\r\n */\r\nexport interface TrackedEntity {\r\n /** The table definition this entity belongs to */\r\n table: TableDef;\r\n /** The actual entity instance */\r\n entity: unknown;\r\n /** Primary key value of the entity */\r\n pk: string | number | null;\r\n /** Current status of the entity */\r\n status: EntityStatus;\r\n /** Original values of the entity when it was loaded */\r\n original: Record<string, unknown> | null;\r\n}\r\n\r\n/**\r\n * Type representing a key for relation navigation\r\n */\r\nexport type RelationKey = string;\r\n\r\n/**\r\n * Represents a change operation on a relation\r\n * @typeParam T - Type of the related entity\r\n */\r\nexport type RelationChange<T> =\r\n | { kind: 'add'; entity: T }\r\n | { kind: 'attach'; entity: T }\r\n | { kind: 'remove'; entity: T }\r\n | { kind: 'detach'; entity: T };\r\n\r\n/**\r\n * Represents a relation change entry in the unit of work\r\n */\r\nexport interface RelationChangeEntry {\r\n /** Root entity that owns the relation */\r\n root: unknown;\r\n /** Key of the relation being changed */\r\n relationKey: RelationKey;\r\n /** Table definition of the root entity */\r\n rootTable: TableDef;\r\n /** Name of the relation */\r\n relationName: string;\r\n /** Relation definition */\r\n relation: RelationDef;\r\n /** The change being applied */\r\n change: RelationChange<unknown>;\r\n}\r\n\r\n/**\r\n * Represents a domain event that can be emitted by entities\r\n * @typeParam TType - Type of the event (string literal)\r\n */\r\nexport interface DomainEvent<TType extends string = string> {\r\n /** Type identifier for the event */\r\n readonly type: TType;\r\n /** Timestamp when the event occurred */\r\n readonly occurredAt?: Date;\r\n}\r\n\r\n/**\r\n * Type representing any domain event\r\n */\r\nexport type AnyDomainEvent = DomainEvent<string>;\r\n\r\n/**\r\n * Type representing ORM-specific domain events\r\n */\r\nexport type OrmDomainEvent = AnyDomainEvent;\r\n\r\n/**\r\n * Interface for entities that can emit domain events\r\n * @typeParam E - Type of domain events this entity can emit\r\n */\r\nexport interface HasDomainEvents<E extends DomainEvent = AnyDomainEvent> {\r\n /** Array of domain events emitted by this entity */\r\n domainEvents?: E[];\r\n}\r\n","import { ColumnNode, eq } from '../core/ast/expression.js';\r\nimport type { Dialect, CompiledQuery } from '../core/dialect/abstract.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { UpdateQueryBuilder } from '../query-builder/update.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { TableDef, TableHooks } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { EntityStatus } from './runtime-types.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Unit of Work pattern implementation for tracking entity changes.\r\n */\r\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<unknown, TrackedEntity>();\r\n\r\n /**\r\n * Creates a new UnitOfWork instance.\r\n * @param dialect - The database dialect\r\n * @param executor - The database executor\r\n * @param identityMap - The identity map\r\n * @param hookContext - Function to get the hook context\r\n */\r\n constructor(\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor,\r\n private readonly identityMap: IdentityMap,\r\n private readonly hookContext: () => unknown\r\n ) { }\r\n\r\n /**\r\n * Gets the identity buckets map.\r\n */\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n /**\r\n * Gets all tracked entities.\r\n * @returns Array of tracked entities\r\n */\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n /**\r\n * Gets an entity by table and primary key.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @returns The entity or undefined if not found\r\n */\r\n getEntity(table: TableDef, pk: string | number): unknown | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n /**\r\n * Gets all tracked entities for a specific table.\r\n * @param table - The table definition\r\n * @returns Array of tracked entities\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n /**\r\n * Finds a tracked entity.\r\n * @param entity - The entity to find\r\n * @returns The tracked entity or undefined if not found\r\n */\r\n findTracked(entity: unknown): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n /**\r\n * Sets an entity in the identity map.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n setEntity(table: TableDef, pk: string | number, entity: unknown): void {\r\n if (pk === null || pk === undefined) return;\r\n let tracked = this.trackedEntities.get(entity);\r\n if (!tracked) {\r\n tracked = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity as Record<string, unknown>)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n } else {\r\n tracked.pk = pk;\r\n }\r\n\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n /**\r\n * Tracks a new entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @param pk - Optional primary key value\r\n */\r\n trackNew(table: TableDef, entity: unknown, pk?: string | number): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk: pk ?? null,\r\n status: EntityStatus.New,\r\n original: null\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n if (pk != null) {\r\n this.registerIdentity(tracked);\r\n }\r\n }\r\n\r\n /**\r\n * Tracks a managed entity.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n trackManaged(table: TableDef, pk: string | number, entity: unknown): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity as Record<string, unknown>)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n /**\r\n * Marks an entity as dirty (modified).\r\n * @param entity - The entity to mark as dirty\r\n */\r\n markDirty(entity: unknown): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n if (tracked.status === EntityStatus.New || tracked.status === EntityStatus.Removed) return;\r\n tracked.status = EntityStatus.Dirty;\r\n }\r\n\r\n /**\r\n * Marks an entity as removed.\r\n * @param entity - The entity to mark as removed\r\n */\r\n markRemoved(entity: unknown): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n tracked.status = EntityStatus.Removed;\r\n }\r\n\r\n /**\r\n * Flushes pending changes to the database.\r\n */\r\n async flush(): Promise<void> {\r\n const toFlush = Array.from(this.trackedEntities.values());\r\n for (const tracked of toFlush) {\r\n switch (tracked.status) {\r\n case EntityStatus.New:\r\n await this.flushInsert(tracked);\r\n break;\r\n case EntityStatus.Dirty:\r\n await this.flushUpdate(tracked);\r\n break;\r\n case EntityStatus.Removed:\r\n await this.flushDelete(tracked);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the unit of work by clearing all tracked entities and identity map.\r\n */\r\n reset(): void {\r\n this.trackedEntities.clear();\r\n this.identityMap.clear();\r\n }\r\n\r\n /**\r\n * Flushes an insert operation for a new entity.\r\n * @param tracked - The tracked entity to insert\r\n */\r\n private async flushInsert(tracked: TrackedEntity): Promise<void> {\r\n await this.runHook(tracked.table.hooks?.beforeInsert, tracked);\r\n\r\n const payload = this.extractColumns(tracked.table, tracked.entity as Record<string, unknown>);\r\n let builder = new InsertQueryBuilder(tracked.table).values(payload);\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity as Record<string, unknown>);\r\n tracked.pk = this.getPrimaryKeyValue(tracked);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterInsert, tracked);\r\n }\r\n\r\n /**\r\n * Flushes an update operation for a modified entity.\r\n * @param tracked - The tracked entity to update\r\n */\r\n private async flushUpdate(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n const changes = this.computeChanges(tracked);\r\n if (!Object.keys(changes).length) {\r\n tracked.status = EntityStatus.Managed;\r\n return;\r\n }\r\n\r\n await this.runHook(tracked.table.hooks?.beforeUpdate, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n let builder = new UpdateQueryBuilder(tracked.table)\r\n .set(changes)\r\n .where(eq(pkColumn, tracked.pk));\r\n\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity as Record<string, unknown>);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\r\n\r\n /**\r\n * Flushes a delete operation for a removed entity.\r\n * @param tracked - The tracked entity to delete\r\n */\r\n private async flushDelete(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n await this.runHook(tracked.table.hooks?.beforeDelete, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n const builder = new DeleteQueryBuilder(tracked.table).where(eq(pkColumn, tracked.pk));\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Detached;\r\n this.trackedEntities.delete(tracked.entity);\r\n this.identityMap.remove(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterDelete, tracked);\r\n }\r\n\r\n /**\r\n * Runs a table hook if defined.\r\n * @param hook - The hook function\r\n * @param tracked - The tracked entity\r\n */\r\n private async runHook(\r\n hook: TableHooks[keyof TableHooks] | undefined,\r\n tracked: TrackedEntity\r\n ): Promise<void> {\r\n if (!hook) return;\r\n await hook(this.hookContext(), tracked.entity);\r\n }\r\n\r\n /**\r\n * Computes changes between current entity state and original snapshot.\r\n * @param tracked - The tracked entity\r\n * @returns Object with changed column values\r\n */\r\n private computeChanges(tracked: TrackedEntity): Record<string, unknown> {\r\n const snapshot = tracked.original ?? {};\r\n const changes: Record<string, unknown> = {};\r\n for (const column of Object.keys(tracked.table.columns)) {\r\n const current = tracked.entity[column];\r\n if (snapshot[column] !== current) {\r\n changes[column] = current;\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Extracts column values from an entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @returns Object with column values\r\n */\r\n private extractColumns(table: TableDef, entity: Record<string, unknown>): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n if (entity[column] === undefined) continue;\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n /**\r\n * Executes a compiled query.\r\n * @param compiled - The compiled query\r\n * @returns Query results\r\n */\r\n private async executeCompiled(compiled: CompiledQuery): Promise<QueryResult[]> {\r\n return this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Gets columns for RETURNING clause.\r\n * @param table - The table definition\r\n * @returns Array of column nodes\r\n */\r\n private getReturningColumns(table: TableDef): ColumnNode[] {\r\n return Object.values(table.columns).map(column => ({\r\n type: 'Column',\r\n table: table.name,\r\n name: column.name,\r\n alias: column.name\r\n }));\r\n }\r\n\r\n /**\r\n * Applies RETURNING clause results to the tracked entity.\r\n * @param tracked - The tracked entity\r\n * @param results - Query results\r\n */\r\n private applyReturningResults(tracked: TrackedEntity, results: QueryResult[]): void {\r\n if (!this.dialect.supportsReturning()) return;\r\n const first = results[0];\r\n if (!first || first.values.length === 0) return;\r\n\r\n const row = first.values[0];\r\n for (let i = 0; i < first.columns.length; i++) {\r\n const columnName = this.normalizeColumnName(first.columns[i]);\r\n if (!(columnName in tracked.table.columns)) continue;\r\n tracked.entity[columnName] = row[i];\r\n }\r\n }\r\n\r\n /**\r\n * Normalizes a column name by removing quotes and table prefixes.\r\n * @param column - The column name to normalize\r\n * @returns Normalized column name\r\n */\r\n private normalizeColumnName(column: string): string {\r\n const parts = column.split('.');\r\n const candidate = parts[parts.length - 1];\r\n return candidate.replace(/^[\"`[\\]]+|[\"`[\\]]+$/g, '');\r\n }\r\n\r\n /**\r\n * Registers an entity in the identity map.\r\n * @param tracked - The tracked entity to register\r\n */\r\n private registerIdentity(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n this.identityMap.register(tracked);\r\n }\r\n\r\n /**\r\n * Creates a snapshot of an entity's current state.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @returns Object with entity state\r\n */\r\n private createSnapshot(table: TableDef, entity: Record<string, unknown>): Record<string, unknown> {\r\n const snapshot: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n snapshot[column] = entity[column];\r\n }\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Gets the primary key value from a tracked entity.\r\n * @param tracked - The tracked entity\r\n * @returns Primary key value or null\r\n */\r\n private getPrimaryKeyValue(tracked: TrackedEntity): string | number | null {\r\n const key = findPrimaryKey(tracked.table);\r\n const val = tracked.entity[key];\r\n if (val === undefined || val === null) return null;\r\n return val;\r\n }\r\n}\r\n","import type { DomainEvent, HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\n/**\r\n * Extracts domain events of a specific type.\r\n * @template E - The domain event type\r\n * @template TType - The specific event type\r\n */\r\ntype EventOfType<E extends DomainEvent, TType extends E['type']> =\r\n Extract<E, { type: TType }>;\r\n\r\n/**\r\n * Domain event handler function.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n * @param event - The domain event\r\n * @param ctx - The context\r\n */\r\nexport type DomainEventHandler<E extends DomainEvent, Context> =\r\n (event: E, ctx: Context) => Promise<void> | void;\r\n\r\n/**\r\n * Initial handlers for domain events.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n */\r\nexport type InitialHandlers<E extends DomainEvent, Context> = {\r\n [K in E['type']]?: DomainEventHandler<EventOfType<E, K>, Context>[];\r\n};\r\n\r\n/**\r\n * Domain event bus for managing and dispatching domain events.\r\n * @template E - The domain event type\r\n * @template Context - The context type\r\n */\r\nexport class DomainEventBus<E extends DomainEvent, Context> {\r\n private readonly handlers = new Map<E['type'], DomainEventHandler<E, Context>[]>();\r\n\r\n /**\r\n * Creates a new DomainEventBus instance.\r\n * @param initialHandlers - Optional initial event handlers\r\n */\r\n constructor(initialHandlers?: InitialHandlers<E, Context>) {\r\n if (initialHandlers) {\r\n for (const key in initialHandlers) {\r\n const type = key as E['type'];\r\n const list = initialHandlers[type] ?? [];\r\n this.handlers.set(type, [...(list as DomainEventHandler<E, Context>[])]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Registers an event handler for a specific event type.\r\n * @template TType - The event type\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n on<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n const key = type as E['type'];\r\n const existing = this.handlers.get(key) ?? [];\r\n existing.push(handler as unknown as DomainEventHandler<E, Context>);\r\n this.handlers.set(key, existing);\r\n }\r\n\r\n /**\r\n * Registers an event handler for a specific event type (alias for on).\r\n * @template TType - The event type\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n register<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n this.on(type, handler);\r\n }\r\n\r\n /**\r\n * Dispatches domain events for tracked entities.\r\n * @param trackedEntities - Iterable of tracked entities\r\n * @param ctx - The context to pass to handlers\r\n */\r\n async dispatch(trackedEntities: Iterable<TrackedEntity>, ctx: Context): Promise<void> {\r\n for (const tracked of trackedEntities) {\r\n const entity = tracked.entity as HasDomainEvents<E>;\r\n if (!entity.domainEvents?.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const handlers = this.handlers.get(event.type as E['type']);\r\n if (!handlers?.length) continue;\r\n\r\n for (const handler of handlers) {\r\n await handler(event, ctx);\r\n }\r\n }\r\n\r\n entity.domainEvents = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Adds a domain event to an entity.\r\n * @template E - The domain event type\r\n * @param entity - The entity to add the event to\r\n * @param event - The domain event to add\r\n */\r\nexport const addDomainEvent = <E extends DomainEvent>(\r\n entity: HasDomainEvents<E>,\r\n event: E\r\n): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import { and, eq } from '../core/ast/expression.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { BelongsToManyRelation, HasManyRelation, HasOneRelation } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\n/**\r\n * Processes relation changes for entity relationships.\r\n */\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\r\n\r\n /**\r\n * Creates a new RelationChangeProcessor instance.\r\n * @param unitOfWork - The unit of work instance\r\n * @param dialect - The database dialect\r\n * @param executor - The database executor\r\n */\r\n constructor(\r\n private readonly unitOfWork: UnitOfWork,\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor\r\n ) { }\r\n\r\n /**\r\n * Registers a relation change for processing.\r\n * @param entry - The relation change entry\r\n */\r\n registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\r\n\r\n /**\r\n * Resets the relation change processor by clearing all pending changes.\r\n */\r\n reset(): void {\r\n this.relationChanges.length = 0;\r\n }\r\n\r\n /**\r\n * Processes all pending relation changes.\r\n */\r\n async process(): Promise<void> {\r\n if (!this.relationChanges.length) return;\r\n const entries = [...this.relationChanges];\r\n this.relationChanges.length = 0;\r\n\r\n for (const entry of entries) {\r\n switch (entry.relation.type) {\r\n case RelationKinds.HasMany:\r\n await this.handleHasManyChange(entry);\r\n break;\r\n case RelationKinds.HasOne:\r\n await this.handleHasOneChange(entry);\r\n break;\r\n case RelationKinds.BelongsToMany:\r\n await this.handleBelongsToManyChange(entry);\r\n break;\r\n case RelationKinds.BelongsTo:\r\n await this.handleBelongsToChange(entry);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for has-many relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleHasManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasManyRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'add' || entry.change.kind === 'attach') {\r\n this.assignHasManyForeignKey(tracked.entity as Record<string, unknown>, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasManyChild(tracked.entity as Record<string, unknown>, relation);\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for has-one relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleHasOneChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasOneRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n this.assignHasOneForeignKey(tracked.entity as Record<string, unknown>, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasOneChild(tracked.entity as Record<string, unknown>, relation);\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes for belongs-to relations.\r\n * @param _entry - The relation change entry (reserved for future use)\r\n */\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n void _entry;\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\r\n\r\n /**\r\n * Handles changes for belongs-to-many relations.\r\n * @param entry - The relation change entry\r\n */\r\n private async handleBelongsToManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as BelongsToManyRelation;\r\n const rootKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootId = entry.root[rootKey];\r\n if (rootId === undefined || rootId === null) return;\r\n\r\n const targetId = this.resolvePrimaryKeyValue(entry.change.entity as Record<string, unknown>, relation.target);\r\n if (targetId === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n await this.insertPivotRow(relation, rootId, targetId);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'detach' || entry.change.kind === 'remove') {\r\n await this.deletePivotRow(relation, rootId, targetId);\r\n\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(entry.change.entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Assigns a foreign key for has-many relations.\r\n * @param child - The child entity\r\n * @param relation - The has-many relation\r\n * @param rootValue - The root entity's primary key value\r\n */\r\n private assignHasManyForeignKey(child: Record<string, unknown>, relation: HasManyRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n /**\r\n * Detaches a child entity from has-many relations.\r\n * @param child - The child entity\r\n * @param relation - The has-many relation\r\n */\r\n private detachHasManyChild(child: Record<string, unknown>, relation: HasManyRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n /**\r\n * Assigns a foreign key for has-one relations.\r\n * @param child - The child entity\r\n * @param relation - The has-one relation\r\n * @param rootValue - The root entity's primary key value\r\n */\r\n private assignHasOneForeignKey(child: Record<string, unknown>, relation: HasOneRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n /**\r\n * Detaches a child entity from has-one relations.\r\n * @param child - The child entity\r\n * @param relation - The has-one relation\r\n */\r\n private detachHasOneChild(child: Record<string, unknown>, relation: HasOneRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n /**\r\n * Inserts a pivot row for belongs-to-many relations.\r\n * @param relation - The belongs-to-many relation\r\n * @param rootId - The root entity's primary key value\r\n * @param targetId - The target entity's primary key value\r\n */\r\n private async insertPivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const payload = {\r\n [relation.pivotForeignKeyToRoot]: rootId,\r\n [relation.pivotForeignKeyToTarget]: targetId\r\n };\r\n const builder = new InsertQueryBuilder(relation.pivotTable).values(payload);\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Deletes a pivot row for belongs-to-many relations.\r\n * @param relation - The belongs-to-many relation\r\n * @param rootId - The root entity's primary key value\r\n * @param targetId - The target entity's primary key value\r\n */\r\n private async deletePivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const rootCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n const targetCol = relation.pivotTable.columns[relation.pivotForeignKeyToTarget];\r\n if (!rootCol || !targetCol) return;\r\n\r\n const builder = new DeleteQueryBuilder(relation.pivotTable).where(\r\n and(eq(rootCol, rootId), eq(targetCol, targetId))\r\n );\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n /**\r\n * Resolves the primary key value from an entity.\r\n * @param entity - The entity\r\n * @param table - The table definition\r\n * @returns The primary key value or null\r\n */\r\n private resolvePrimaryKeyValue(entity: Record<string, unknown>, table: TableDef): string | number | null {\r\n if (!entity) return null;\r\n const key = findPrimaryKey(table);\r\n const value = entity[key];\r\n if (value === undefined || value === null) return null;\r\n return (value as string | number | null | undefined) ?? null;\r\n }\r\n}\r\n","import type { DbExecutor } from '../core/execution/db-executor.js';\n\n/**\n * Represents a single SQL query log entry\n */\nexport interface QueryLogEntry {\n /** The SQL query that was executed */\n sql: string;\n /** Parameters used in the query */\n params?: unknown[];\n}\n\n/**\n * Function type for query logging callbacks\n * @param entry - The query log entry to process\n */\nexport type QueryLogger = (entry: QueryLogEntry) => void;\n\n/**\n * Creates a wrapped database executor that logs all SQL queries\n * @param executor - Original database executor to wrap\n * @param logger - Optional logger function to receive query log entries\n * @returns Wrapped executor that logs queries before execution\n */\nexport const createQueryLoggingExecutor = (\n executor: DbExecutor,\n logger?: QueryLogger\n): DbExecutor => {\n if (!logger) {\n return executor;\n }\n\n const wrapped: DbExecutor = {\n capabilities: executor.capabilities,\n async executeSql(sql, params) {\n logger({ sql, params });\n return executor.executeSql(sql, params);\n }\n ,\n beginTransaction: () => executor.beginTransaction(),\n commitTransaction: () => executor.commitTransaction(),\n rollbackTransaction: () => executor.rollbackTransaction(),\n dispose: () => executor.dispose(),\n };\n\n return wrapped;\n};\n","import type { DbExecutor } from '../core/execution/db-executor.js';\r\n\r\n/**\r\n * Executes a function within a database transaction\r\n * @param executor - Database executor to use for transaction operations\r\n * @param action - Function to execute within the transaction\r\n * @returns Promise that resolves when the transaction is complete\r\n * @throws Re-throws any errors that occur during the transaction (after rolling back)\r\n */\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.capabilities.transactions) {\r\n await action();\r\n return;\r\n }\r\n\r\n await executor.beginTransaction();\r\n try {\r\n await action();\r\n await executor.commitTransaction();\r\n } catch (error) {\r\n await executor.rollbackTransaction();\r\n throw error;\r\n }\r\n};\r\n","import type {\n EntityInstance,\n HasManyCollection,\n HasOneReference,\n BelongsToReference,\n ManyToManyCollection\n} from '../schema/types.js';\nimport { normalizeColumnType, type ColumnDef } from '../schema/column-types.js';\nimport {\n RelationKinds,\n type BelongsToManyRelation,\n type BelongsToRelation,\n type HasManyRelation,\n type HasOneRelation,\r\n type RelationDef\r\n} from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport { createEntityFromRow } from './entity.js';\r\nimport type { EntityConstructor } from './entity-metadata.js';\r\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\r\nimport type { OrmSession } from './orm-session.js';\r\n\r\n/**\r\n * Options for controlling the behavior of save graph operations.\r\n */\r\nexport interface SaveGraphOptions {\n /** Remove existing collection members that are not present in the payload */\n pruneMissing?: boolean;\n /**\n * Coerce JSON-friendly input values into DB-friendly primitives.\n * Currently:\n * - Date -> ISO string (for DATE/DATETIME/TIMESTAMP/TIMESTAMPTZ columns)\n */\n coerce?: 'json';\n}\n\r\n/** Represents an entity object with arbitrary properties. */\r\n\r\n/** Represents an entity object with arbitrary properties. */\r\n\r\ntype AnyEntity = Record<string, unknown>;\r\n\r\n/**\r\n\r\n * Converts a value to a string key, returning an empty string for null or undefined.\r\n\r\n * @param value - The value to convert.\r\n\r\n * @returns The string representation or empty string.\r\n\r\n */\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst coerceColumnValue = (\n table: TableDef,\n columnName: string,\n value: unknown,\n options: SaveGraphOptions\n): unknown => {\n if (options.coerce !== 'json') return value;\n if (value === null || value === undefined) return value;\n\n const column = table.columns[columnName] as unknown as ColumnDef | undefined;\n if (!column) return value;\n\n const normalized = normalizeColumnType(column.type);\n\n const isDateLikeColumn =\n normalized === 'date' ||\n normalized === 'datetime' ||\n normalized === 'timestamp' ||\n normalized === 'timestamptz';\n\n if (isDateLikeColumn && value instanceof Date) {\n return value.toISOString();\n }\n\n // Future coercions can be added here based on `normalized`.\n return value;\n};\n\nconst pickColumns = (table: TableDef, payload: AnyEntity, options: SaveGraphOptions): Record<string, unknown> => {\n const columns: Record<string, unknown> = {};\n for (const key of Object.keys(table.columns)) {\n if (payload[key] !== undefined) {\n columns[key] = coerceColumnValue(table, key, payload[key], options);\n }\n }\n return columns;\n};\n\r\nconst ensureEntity = <TTable extends TableDef>(\n session: OrmSession,\n table: TTable,\n payload: AnyEntity,\n options: SaveGraphOptions\n): EntityInstance<TTable> => {\n const pk = findPrimaryKey(table);\n const row = pickColumns(table, payload, options);\n const pkValue = payload[pk];\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = session.getEntity(table, pkValue);\r\n if (tracked) {\r\n return tracked as EntityInstance<TTable>;\r\n }\r\n // Seed the stub with PK to track a managed entity when updating.\r\n if (row[pk] === undefined) {\r\n row[pk] = pkValue;\r\n }\r\n }\r\n\r\n return createEntityFromRow(session, table, row) as EntityInstance<TTable>;\n};\n\nconst assignColumns = (table: TableDef, entity: AnyEntity, payload: AnyEntity, options: SaveGraphOptions): void => {\n for (const key of Object.keys(table.columns)) {\n if (payload[key] !== undefined) {\n entity[key] = coerceColumnValue(table, key, payload[key], options);\n }\n }\n};\n\r\nconst isEntityInCollection = (items: AnyEntity[], pkName: string, entity: AnyEntity): boolean => {\r\n if (items.includes(entity)) return true;\r\n const entityPk = entity[pkName];\r\n if (entityPk === undefined || entityPk === null) return false;\r\n return items.some(item => toKey(item[pkName]) === toKey(entityPk));\r\n};\r\n\r\nconst findInCollectionByPk = (items: AnyEntity[], pkName: string, pkValue: unknown): AnyEntity | undefined => {\r\n if (pkValue === undefined || pkValue === null) return undefined;\r\n return items.find(item => toKey(item[pkName]) === toKey(pkValue));\r\n};\r\n\r\nconst handleHasMany = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: HasManyRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n if (!Array.isArray(payload)) return;\r\n const collection = root[relationName] as unknown as HasManyCollection<unknown>;\r\n await collection.load();\r\n\r\n const targetTable = relation.target;\r\n const targetPk = findPrimaryKey(targetTable);\r\n const existing = collection.getItems() as unknown as AnyEntity[];\r\n const seen = new Set<string>();\r\n\r\n for (const item of payload) {\r\n if (item === null || item === undefined) continue;\r\n const asObj = typeof item === 'object' ? (item as AnyEntity) : { [targetPk]: item };\r\n const pkValue = asObj[targetPk];\r\n\r\n const current =\n findInCollectionByPk(existing, targetPk, pkValue) ??\n (pkValue !== undefined && pkValue !== null ? session.getEntity(targetTable, pkValue) : undefined);\n\n const entity = current ?? ensureEntity(session, targetTable, asObj, options);\n assignColumns(targetTable, entity as AnyEntity, asObj, options);\n await applyGraphToEntity(session, targetTable, entity as AnyEntity, asObj, options);\n\r\n if (!isEntityInCollection(collection.getItems() as unknown as AnyEntity[], targetPk, entity as unknown as AnyEntity)) {\r\n collection.attach(entity);\r\n }\r\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n seen.add(toKey(pkValue));\r\n }\r\n }\r\n\r\n if (options.pruneMissing) {\r\n for (const item of [...collection.getItems()]) {\r\n const pkValue = item[targetPk];\r\n if (pkValue !== undefined && pkValue !== null && !seen.has(toKey(pkValue))) {\r\n collection.remove(item);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst handleHasOne = async (\n session: OrmSession,\n root: AnyEntity,\n relationName: string,\n relation: HasOneRelation,\n payload: unknown,\n options: SaveGraphOptions\n): Promise<void> => {\n const ref = root[relationName] as unknown as HasOneReference<object>;\n if (payload === undefined) return;\r\n if (payload === null) {\r\n ref.set(null);\r\n return;\r\n }\r\n const pk = findPrimaryKey(relation.target);\r\n if (typeof payload === 'number' || typeof payload === 'string') {\r\n const entity = ref.set({ [pk]: payload });\r\n if (entity) {\r\n await applyGraphToEntity(session, relation.target, entity as AnyEntity, { [pk]: payload }, options);\r\n }\r\n return;\r\n }\r\n const attached = ref.set(payload as AnyEntity);\n if (attached) {\n await applyGraphToEntity(session, relation.target, attached as AnyEntity, payload as AnyEntity, options);\n }\n};\n\r\nconst handleBelongsTo = async (\n session: OrmSession,\n root: AnyEntity,\n relationName: string,\n relation: BelongsToRelation,\n payload: unknown,\n options: SaveGraphOptions\n): Promise<void> => {\n const ref = root[relationName] as unknown as BelongsToReference<object>;\n if (payload === undefined) return;\r\n if (payload === null) {\r\n ref.set(null);\r\n return;\r\n }\r\n const pk = relation.localKey || findPrimaryKey(relation.target);\r\n if (typeof payload === 'number' || typeof payload === 'string') {\r\n const entity = ref.set({ [pk]: payload });\r\n if (entity) {\r\n await applyGraphToEntity(session, relation.target, entity as AnyEntity, { [pk]: payload }, options);\r\n }\r\n return;\r\n }\r\n const attached = ref.set(payload as AnyEntity);\n if (attached) {\n await applyGraphToEntity(session, relation.target, attached as AnyEntity, payload as AnyEntity, options);\n }\n};\n\r\nconst handleBelongsToMany = async (\r\n session: OrmSession,\r\n root: AnyEntity,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n if (!Array.isArray(payload)) return;\r\n const collection = root[relationName] as unknown as ManyToManyCollection<unknown>;\r\n await collection.load();\r\n\r\n const targetTable = relation.target;\r\n const targetPk = relation.targetKey || findPrimaryKey(targetTable);\r\n const seen = new Set<string>();\r\n\r\n for (const item of payload) {\r\n if (item === null || item === undefined) continue;\r\n if (typeof item === 'number' || typeof item === 'string') {\r\n const id = item;\r\n collection.attach(id);\r\n seen.add(toKey(id));\r\n continue;\r\n }\r\n\r\n const asObj = item as AnyEntity;\n const pkValue = asObj[targetPk];\n const entity = pkValue !== undefined && pkValue !== null\n ? session.getEntity(targetTable, pkValue) ?? ensureEntity(session, targetTable, asObj, options)\n : ensureEntity(session, targetTable, asObj, options);\n\n assignColumns(targetTable, entity as AnyEntity, asObj, options);\n await applyGraphToEntity(session, targetTable, entity as AnyEntity, asObj, options);\n\r\n if (!isEntityInCollection(collection.getItems() as unknown as AnyEntity[], targetPk, entity as unknown as AnyEntity)) {\r\n collection.attach(entity);\r\n }\r\n\r\n if (pkValue !== undefined && pkValue !== null) {\r\n seen.add(toKey(pkValue));\r\n }\r\n }\r\n\r\n if (options.pruneMissing) {\r\n for (const item of [...collection.getItems()] as unknown as AnyEntity[]) {\r\n const pkValue = item[targetPk];\r\n if (pkValue !== undefined && pkValue !== null && !seen.has(toKey(pkValue))) {\r\n collection.detach(item);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst applyRelation = async (\r\n session: OrmSession,\r\n table: TableDef,\r\n entity: AnyEntity,\r\n relationName: string,\r\n relation: RelationDef,\r\n payload: unknown,\r\n options: SaveGraphOptions\r\n): Promise<void> => {\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\r\n return handleHasMany(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.HasOne:\r\n return handleHasOne(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.BelongsTo:\r\n return handleBelongsTo(session, entity, relationName, relation, payload, options);\r\n case RelationKinds.BelongsToMany:\r\n return handleBelongsToMany(session, entity, relationName, relation, payload, options);\r\n }\r\n};\r\n\r\nconst applyGraphToEntity = async (\n session: OrmSession,\n table: TableDef,\n entity: AnyEntity,\n payload: AnyEntity,\n options: SaveGraphOptions\n): Promise<void> => {\n assignColumns(table, entity, payload, options);\n\n for (const [relationName, relation] of Object.entries(table.relations)) {\n if (!(relationName in payload)) continue;\n await applyRelation(session, table, entity, relationName, relation as RelationDef, payload[relationName], options);\n }\n};\n\r\nexport const saveGraph = async <TTable extends TableDef>(\n session: OrmSession,\n entityClass: EntityConstructor,\n payload: AnyEntity,\n options: SaveGraphOptions = {}\n): Promise<EntityInstance<TTable>> => {\n const table = getTableDefFromEntity(entityClass);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n\r\n const root = ensureEntity<TTable>(session, table as TTable, payload, options);\n await applyGraphToEntity(session, table, root as AnyEntity, payload, options);\n return root;\n};\n\r\n/**\r\n\r\n * Internal version of saveGraph with typed return based on the constructor.\r\n\r\n * @param session - The ORM session.\r\n\r\n * @param entityClass - The entity constructor.\r\n\r\n * @param payload - The payload data for the root entity and its relations.\r\n\r\n * @param options - Options for the save operation.\r\n\r\n * @returns The root entity instance.\r\n\r\n */\r\n\r\nexport const saveGraphInternal = async <TCtor extends EntityConstructor>(\n\r\n session: OrmSession,\r\n\r\n entityClass: TCtor,\r\n\r\n payload: AnyEntity,\r\n\r\n options: SaveGraphOptions = {}\r\n\r\n): Promise<InstanceType<TCtor>> => {\r\n\r\n const table = getTableDefFromEntity(entityClass);\n\r\n if (!table) {\r\n\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n\r\n }\r\n\r\n const root = ensureEntity(session, table, payload, options);\n\n await applyGraphToEntity(session, table, root as AnyEntity, payload, options);\n\n return root as unknown as InstanceType<TCtor>;\n\n};\n","import { Dialect } from '../core/dialect/abstract.js';\r\nimport { eq } from '../core/ast/expression.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { ColumnDef } from '../schema/column-types.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport { EntityInstance } from '../schema/types.js';\r\nimport { RelationDef } from '../schema/relation.js';\r\n\r\nimport { selectFromEntity, getTableDefFromEntity } from '../decorators/bootstrap.js';\r\nimport type { EntityConstructor } from './entity-metadata.js';\r\nimport { Orm } from './orm.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\nimport { DomainEventBus, DomainEventHandler, InitialHandlers } from './domain-event-bus.js';\r\nimport { RelationChangeProcessor } from './relation-change-processor.js';\r\nimport { createQueryLoggingExecutor, QueryLogger } from './query-logger.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport type { HydrationContext } from './hydration-context.js';\r\nimport type { EntityContext } from './entity-context.js';\r\nimport {\r\n DomainEvent,\r\n OrmDomainEvent,\r\n RelationChange,\r\n RelationChangeEntry,\r\n RelationKey,\r\n TrackedEntity\r\n} from './runtime-types.js';\r\nimport { executeHydrated } from './execute.js';\nimport { runInTransaction } from './transaction-runner.js';\nimport { saveGraphInternal, SaveGraphOptions } from './save-graph.js';\nimport type { SaveGraphInputPayload } from './save-graph-types.js';\n\r\n/**\r\n * Interface for ORM interceptors that allow hooking into the flush lifecycle.\r\n */\r\nexport interface OrmInterceptor {\r\n /**\r\n * Called before the flush operation begins.\r\n * @param ctx - The entity context\r\n */\r\n beforeFlush?(ctx: EntityContext): Promise<void> | void;\r\n\r\n /**\r\n * Called after the flush operation completes.\r\n * @param ctx - The entity context\r\n */\r\n afterFlush?(ctx: EntityContext): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Options for creating an OrmSession instance.\r\n * @template E - The domain event type\r\n */\r\nexport interface OrmSessionOptions<E extends DomainEvent = OrmDomainEvent> {\r\n /** The ORM instance */\r\n orm: Orm<E>;\r\n /** The database executor */\r\n executor: DbExecutor;\r\n /** Optional query logger for debugging */\r\n queryLogger?: QueryLogger;\r\n /** Optional interceptors for flush lifecycle hooks */\r\n interceptors?: OrmInterceptor[];\r\n /** Optional domain event handlers */\r\n domainEventHandlers?: InitialHandlers<E, OrmSession<E>>;\r\n}\r\n\r\n/**\r\n * ORM Session that manages entity lifecycle, identity mapping, and database operations.\r\n * @template E - The domain event type\r\n */\r\nexport class OrmSession<E extends DomainEvent = OrmDomainEvent> implements EntityContext {\r\n /** The ORM instance */\r\n readonly orm: Orm<E>;\r\n /** The database executor */\r\n readonly executor: DbExecutor;\r\n /** The identity map for tracking entity instances */\r\n readonly identityMap: IdentityMap;\r\n /** The unit of work for tracking entity changes */\r\n readonly unitOfWork: UnitOfWork;\r\n /** The domain event bus */\r\n readonly domainEvents: DomainEventBus<E, OrmSession<E>>;\r\n /** The relation change processor */\r\n readonly relationChanges: RelationChangeProcessor;\r\n\r\n private readonly interceptors: OrmInterceptor[];\r\n\r\n /**\r\n * Creates a new OrmSession instance.\r\n * @param opts - Session options\r\n */\r\n constructor(opts: OrmSessionOptions<E>) {\r\n this.orm = opts.orm;\r\n this.executor = createQueryLoggingExecutor(opts.executor, opts.queryLogger);\r\n this.interceptors = [...(opts.interceptors ?? [])];\r\n\r\n this.identityMap = new IdentityMap();\r\n this.unitOfWork = new UnitOfWork(this.orm.dialect, this.executor, this.identityMap, () => this);\r\n this.relationChanges = new RelationChangeProcessor(this.unitOfWork, this.orm.dialect, this.executor);\r\n this.domainEvents = new DomainEventBus<E, OrmSession<E>>(opts.domainEventHandlers);\r\n }\r\n\r\n /**\r\n * Releases resources associated with this session (executor/pool leases) and resets tracking.\r\n * Must be safe to call multiple times.\r\n */\r\n async dispose(): Promise<void> {\r\n try {\r\n await this.executor.dispose();\r\n } finally {\r\n // Always reset in-memory tracking.\r\n this.unitOfWork.reset();\r\n this.relationChanges.reset();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the database dialect.\r\n */\r\n get dialect(): Dialect {\r\n return this.orm.dialect;\r\n }\r\n\r\n /**\r\n * Gets the identity buckets map.\r\n */\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.unitOfWork.identityBuckets;\r\n }\r\n\r\n /**\r\n * Gets all tracked entities.\r\n */\r\n get tracked(): TrackedEntity[] {\r\n return this.unitOfWork.getTracked();\r\n }\r\n\r\n /**\r\n * Gets an entity by table and primary key.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @returns The entity or undefined if not found\r\n */\r\n getEntity(table: TableDef, pk: unknown): unknown | undefined {\r\n return this.unitOfWork.getEntity(table, pk as string | number);\r\n }\r\n\r\n /**\r\n * Sets an entity in the identity map.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n setEntity(table: TableDef, pk: unknown, entity: unknown): void {\r\n this.unitOfWork.setEntity(table, pk as string | number, entity);\r\n }\r\n\r\n /**\r\n * Tracks a new entity.\r\n * @param table - The table definition\r\n * @param entity - The entity instance\r\n * @param pk - Optional primary key value\r\n */\r\n trackNew(table: TableDef, entity: unknown, pk?: unknown): void {\r\n this.unitOfWork.trackNew(table, entity, pk as string | number);\r\n }\r\n\r\n /**\r\n * Tracks a managed entity.\r\n * @param table - The table definition\r\n * @param pk - The primary key value\r\n * @param entity - The entity instance\r\n */\r\n trackManaged(table: TableDef, pk: unknown, entity: unknown): void {\r\n this.unitOfWork.trackManaged(table, pk as string | number, entity);\r\n }\r\n\r\n /**\r\n * Marks an entity as dirty (modified).\r\n * @param entity - The entity to mark as dirty\r\n */\r\n markDirty(entity: unknown): void {\r\n this.unitOfWork.markDirty(entity);\r\n }\r\n\r\n /**\r\n * Marks an entity as removed.\r\n * @param entity - The entity to mark as removed\r\n */\r\n markRemoved(entity: unknown): void {\r\n this.unitOfWork.markRemoved(entity);\r\n }\r\n\r\n /**\r\n * Registers a relation change.\r\n * @param root - The root entity\r\n * @param relationKey - The relation key\r\n * @param rootTable - The root table definition\r\n * @param relationName - The relation name\r\n * @param relation - The relation definition\r\n * @param change - The relation change\r\n */\r\n registerRelationChange = (\r\n root: unknown,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<unknown>\r\n ): void => {\r\n this.relationChanges.registerChange(\r\n buildRelationChangeEntry(root, relationKey, rootTable, relationName, relation, change)\r\n );\r\n };\r\n\r\n /**\r\n * Gets all tracked entities for a specific table.\r\n * @param table - The table definition\r\n * @returns Array of tracked entities\r\n */\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.unitOfWork.getEntitiesForTable(table);\r\n }\r\n\r\n /**\r\n * Registers an interceptor for flush lifecycle hooks.\r\n * @param interceptor - The interceptor to register\r\n */\r\n registerInterceptor(interceptor: OrmInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n /**\r\n * Registers a domain event handler.\r\n * @param type - The event type\r\n * @param handler - The event handler\r\n */\r\n registerDomainEventHandler<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<Extract<E, { type: TType }>, OrmSession<E>>\r\n ): void {\r\n this.domainEvents.on(type, handler);\r\n }\r\n\r\n /**\r\n * Finds an entity by its primary key.\r\n * @template TCtor - The entity constructor type\r\n * @param entityClass - The entity constructor\r\n * @param id - The primary key value\r\n * @returns The entity instance or null if not found\r\n * @throws If entity metadata is not bootstrapped or table has no primary key\r\n */\r\n async find<TCtor extends EntityConstructor<object>>(\r\n entityClass: TCtor,\r\n id: unknown\r\n ): Promise<InstanceType<TCtor> | null> {\r\n const table = getTableDefFromEntity(entityClass);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n const primaryKey = findPrimaryKey(table);\r\n const column = table.columns[primaryKey];\r\n if (!column) {\r\n throw new Error('Entity table does not expose a primary key');\r\n }\r\n const columnSelections = Object.values(table.columns).reduce<Record<string, ColumnDef>>((acc, col) => {\r\n acc[col.name] = col;\r\n return acc;\r\n }, {});\r\n const qb = selectFromEntity(entityClass)\r\n .select(columnSelections)\r\n .where(eq(column, id as string | number))\r\n .limit(1);\r\n const rows = await executeHydrated(this, qb);\r\n return (rows[0] ?? null) as InstanceType<TCtor> | null;\r\n }\r\n\r\n /**\r\n * Finds a single entity using a query builder.\r\n * @template TTable - The table type\r\n * @param qb - The query builder\r\n * @returns The first entity instance or null if not found\r\n */\r\n async findOne<TTable extends TableDef>(qb: SelectQueryBuilder<unknown, TTable>): Promise<EntityInstance<TTable> | null> {\r\n const limited = qb.limit(1);\r\n const rows = await executeHydrated(this, limited);\r\n return rows[0] ?? null;\r\n }\r\n\r\n /**\r\n * Finds multiple entities using a query builder.\r\n * @template TTable - The table type\r\n * @param qb - The query builder\r\n * @returns Array of entity instances\r\n */\r\n async findMany<TTable extends TableDef>(qb: SelectQueryBuilder<unknown, TTable>): Promise<EntityInstance<TTable>[]> {\r\n return executeHydrated(this, qb);\r\n }\r\n\r\n /**\n * Saves an entity graph (root + nested relations) based on a DTO-like payload.\n * @param entityClass - Root entity constructor\n * @param payload - DTO payload containing column values and nested relations\n * @param options - Graph save options\n * @returns The root entity instance\n */\n async saveGraph<TCtor extends EntityConstructor<object>>(\n entityClass: TCtor,\n payload: SaveGraphInputPayload<InstanceType<TCtor>>,\n options?: SaveGraphOptions & { transactional?: boolean }\n ): Promise<InstanceType<TCtor>>;\n async saveGraph<TCtor extends EntityConstructor<object>>(\n entityClass: TCtor,\n payload: Record<string, unknown>,\n options?: SaveGraphOptions & { transactional?: boolean }\n ): Promise<InstanceType<TCtor>> {\n const { transactional = true, ...graphOptions } = options ?? {};\n const execute = () => saveGraphInternal(this, entityClass, payload, graphOptions);\n if (!transactional) {\n return execute();\n }\n return this.transaction(() => execute());\n }\n\r\n /**\r\n * Persists an entity (either inserts or updates).\r\n * @param entity - The entity to persist\r\n * @throws If entity metadata is not bootstrapped\r\n */\r\n async persist(entity: object): Promise<void> {\r\n if (this.unitOfWork.findTracked(entity)) {\r\n return;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const table = getTableDefFromEntity((entity as { constructor: EntityConstructor }).constructor);\r\n if (!table) {\r\n throw new Error('Entity metadata has not been bootstrapped');\r\n }\r\n const primaryKey = findPrimaryKey(table);\r\n const pkValue = (entity as Record<string, unknown>)[primaryKey];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n this.trackManaged(table, pkValue, entity);\r\n } else {\r\n this.trackNew(table, entity);\r\n }\r\n }\r\n\r\n /**\r\n * Marks an entity for removal.\r\n * @param entity - The entity to remove\r\n */\r\n async remove(entity: object): Promise<void> {\r\n this.markRemoved(entity);\r\n }\r\n\r\n /**\n * Flushes pending changes to the database without session hooks, relation processing, or domain events.\n */\n async flush(): Promise<void> {\n await this.unitOfWork.flush();\n }\n\r\n /**\r\n * Flushes pending changes with interceptors and relation processing.\r\n */\r\n private async flushWithHooks(): Promise<void> {\r\n for (const interceptor of this.interceptors) {\r\n await interceptor.beforeFlush?.(this);\r\n }\r\n\r\n await this.unitOfWork.flush();\r\n await this.relationChanges.process();\r\n await this.unitOfWork.flush();\r\n\r\n for (const interceptor of this.interceptors) {\r\n await interceptor.afterFlush?.(this);\r\n }\r\n }\r\n\r\n /**\r\n * Commits the current transaction.\r\n */\r\n async commit(): Promise<void> {\r\n await runInTransaction(this.executor, async () => {\r\n await this.flushWithHooks();\r\n });\r\n\r\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n }\r\n\r\n /**\r\n * Executes a function within a transaction.\r\n * @template T - The return type\r\n * @param fn - The function to execute\r\n * @returns The result of the function\r\n * @throws If the transaction fails\r\n */\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n // If the executor can't do transactions, just run and commit once.\r\n if (!this.executor.capabilities.transactions) {\r\n const result = await fn(this);\r\n await this.commit();\r\n return result;\r\n }\r\n\r\n await this.executor.beginTransaction();\r\n try {\r\n const result = await fn(this);\r\n await this.flushWithHooks();\r\n await this.executor.commitTransaction();\r\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n return result;\r\n } catch (err) {\r\n await this.rollback();\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Rolls back the current transaction.\r\n */\r\n async rollback(): Promise<void> {\r\n if (this.executor.capabilities.transactions) {\r\n await this.executor.rollbackTransaction();\r\n }\r\n this.unitOfWork.reset();\r\n this.relationChanges.reset();\r\n }\r\n\r\n /**\r\n * Gets the execution context.\r\n * @returns The execution context\r\n */\r\n getExecutionContext(): ExecutionContext {\r\n return {\r\n dialect: this.orm.dialect,\r\n executor: this.executor,\r\n interceptors: this.orm.interceptors\r\n };\r\n }\r\n\r\n /**\r\n * Gets the hydration context.\r\n * @returns The hydration context\r\n */\r\n getHydrationContext(): HydrationContext<E> {\r\n return {\r\n identityMap: this.identityMap,\r\n unitOfWork: this.unitOfWork,\r\n domainEvents: this.domainEvents,\r\n relationChanges: this.relationChanges,\r\n entityContext: this\r\n };\r\n }\r\n}\r\n\r\nconst buildRelationChangeEntry = (\r\n root: unknown,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<unknown>\r\n): RelationChangeEntry => ({\r\n root,\r\n relationKey,\r\n rootTable,\r\n relationName,\r\n relation,\r\n change\r\n});\r\n\r\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\n\r\nexport interface QueryContext {\r\n sql: string;\r\n params: unknown[];\r\n // maybe metadata like entity type, operation type, etc.\r\n}\r\n\r\nexport type QueryInterceptor = (ctx: QueryContext, next: () => Promise<QueryResult[]>) => Promise<QueryResult[]>;\r\n\r\n/**\r\n * Pipeline for query interceptors.\r\n * Interceptors can wrap query execution to add logging, tracing, caching, etc.\r\n */\r\nexport class InterceptorPipeline {\r\n private interceptors: QueryInterceptor[] = [];\r\n\r\n use(interceptor: QueryInterceptor) {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async run(ctx: QueryContext, executor: DbExecutor): Promise<QueryResult[]> {\r\n let i = 0;\r\n const dispatch = async (): Promise<QueryResult[]> => {\r\n const interceptor = this.interceptors[i++];\r\n if (!interceptor) {\r\n return executor.executeSql(ctx.sql, ctx.params);\r\n }\r\n return interceptor(ctx, dispatch);\r\n };\r\n return dispatch();\r\n }\r\n}\r\n","import type { DomainEvent, OrmDomainEvent } from './runtime-types.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { NamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { InterceptorPipeline } from './interceptor-pipeline.js';\r\nimport { DefaultNamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { OrmSession } from './orm-session.js';\r\n\r\n/**\r\n * Options for creating an ORM instance.\r\n */\r\nexport interface OrmOptions {\r\n /** The database dialect */\r\n dialect: Dialect;\r\n /** The database executor factory */\r\n executorFactory: DbExecutorFactory;\r\n /** Optional interceptors pipeline */\r\n interceptors?: InterceptorPipeline;\r\n /** Optional naming strategy */\r\n namingStrategy?: NamingStrategy;\r\n // model registrations etc.\r\n}\r\n\r\n/**\r\n * Database executor factory interface.\r\n */\r\nexport interface DbExecutorFactory {\r\n /**\r\n * Creates a database executor.\r\n * @returns The database executor\r\n */\r\n createExecutor(): DbExecutor;\r\n\r\n /**\r\n * Creates a transactional database executor.\r\n * @returns The transactional database executor\r\n */\r\n createTransactionalExecutor(): DbExecutor;\r\n\r\n /**\r\n * Disposes any underlying resources (connection pools, background timers, etc).\r\n */\r\n dispose(): Promise<void>;\r\n}\r\n\r\n/**\r\n * ORM (Object-Relational Mapping) main class.\r\n * @template E - The domain event type\r\n */\r\nexport class Orm<E extends DomainEvent = OrmDomainEvent> {\r\n /** The database dialect */\r\n readonly dialect: Dialect;\r\n /** The interceptors pipeline */\r\n readonly interceptors: InterceptorPipeline;\r\n /** The naming strategy */\r\n readonly namingStrategy: NamingStrategy;\r\n private readonly executorFactory: DbExecutorFactory;\r\n\r\n /**\r\n * Creates a new ORM instance.\r\n * @param opts - ORM options\r\n */\r\n constructor(opts: OrmOptions) {\r\n this.dialect = opts.dialect;\r\n this.interceptors = opts.interceptors ?? new InterceptorPipeline();\r\n this.namingStrategy = opts.namingStrategy ?? new DefaultNamingStrategy();\r\n this.executorFactory = opts.executorFactory;\r\n }\r\n\r\n /**\r\n * Creates a new ORM session.\r\n * @param options - Optional session options\r\n * @returns The ORM session\r\n */\r\n createSession(): OrmSession<E> {\r\n // No implicit transaction binding; callers should use Orm.transaction() for transactional work.\r\n const executor = this.executorFactory.createExecutor();\r\n return new OrmSession<E>({ orm: this, executor });\r\n }\r\n\r\n /**\r\n * Executes a function within a transaction.\r\n * @template T - The return type\r\n * @param fn - The function to execute\r\n * @returns The result of the function\r\n * @throws If the transaction fails\r\n */\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n const executor = this.executorFactory.createTransactionalExecutor();\r\n const session = new OrmSession<E>({ orm: this, executor });\r\n try {\r\n // A real transaction scope: begin before running user code, commit/rollback after.\r\n return await session.transaction(() => fn(session));\r\n } finally {\r\n await session.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Shuts down the ORM and releases underlying resources (pools, timers).\r\n */\r\n async dispose(): Promise<void> {\r\n await this.executorFactory.dispose();\r\n }\r\n}\r\n","export type JsonifyScalar<T> = T extends Date ? string : T;\n\n/**\n * Shallow JSON-friendly mapping:\n * - Date -> ISO string\n * - Everything else unchanged\n */\nexport type Jsonify<T> = {\n [K in keyof T]: JsonifyScalar<T[K]>;\n};\n\n/**\n * Creates a shallow, JSON-friendly copy of an object by converting `Date` values to ISO strings.\n * This intentionally does not deep-walk nested objects/relations.\n */\nexport const jsonify = <T extends object>(value: T): Jsonify<T> => {\n const record = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(record)) {\n const entry = record[key];\n result[key] = entry instanceof Date ? entry.toISOString() : entry;\n }\n\n return result as Jsonify<T>;\n};\n\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\n/**\n * Context object provided by standard decorators in newer TypeScript versions.\n */\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n static?: boolean;\n private?: boolean;\n}\n\n/**\n * Dual-mode property decorator that supports both legacy and standard decorator syntax.\n */\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\n/**\n * Dual-mode class decorator that supports both legacy and standard decorator syntax.\n */\nexport interface DualModeClassDecorator {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n <TFunction extends Function>(value: TFunction): void | TFunction;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\n/**\n * Bag for storing decorator metadata during the decoration phase.\n */\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\n/**\n * Checks if a value is a StandardDecoratorContext.\n * @param value - The value to check.\n * @returns True if the value is a StandardDecoratorContext.\n */\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as object);\n};\n\n/**\n * Gets or creates a metadata bag for the given decorator context.\n * @param context - The decorator context.\n * @returns The metadata bag.\n */\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\n/**\n * Reads the metadata bag from the given decorator context.\n * @param context - The decorator context.\n * @returns The metadata bag if present.\n */\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\n/**\n * Reads the metadata bag from a decorated constructor when using standard decorators.\n * @param ctor - The entity constructor.\n * @returns The metadata bag if present.\n */\nexport const readMetadataBagFromConstructor = (ctor: object): DecoratorMetadataBag | undefined => {\n const metadataSymbol = (Symbol as { metadata?: symbol }).metadata;\n if (!metadataSymbol) return undefined;\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\n/**\n * Public helper to read decorator metadata from a class constructor.\n * Standard decorators only; legacy metadata is intentionally ignored.\n * @param ctor - The entity constructor.\n * @returns The metadata bag if present.\n */\nexport const getDecoratorMetadata = (ctor: object): DecoratorMetadataBag | undefined =>\n readMetadataBagFromConstructor(ctor);\n","import { TableHooks } from '../schema/table.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\n/**\n * Options for defining an entity.\n */\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: EntityConstructor<unknown>): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\n/**\n * Class decorator to mark a class as an entity and configure its table mapping.\n * @param options - Configuration options for the entity.\n * @returns A class decorator that registers the entity metadata.\n */\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (meta.columns[entry.propertyName]) {\n throw new Error(\n `Column '${entry.propertyName}' is already defined on entity '${ctor.name}'.`\n );\n }\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n for (const entry of bag.relations) {\n if (meta.relations[entry.propertyName]) {\n throw new Error(\n `Relation '${entry.propertyName}' is already defined on entity '${ctor.name}'.`\n );\n }\n const relationCopy =\n entry.relation.kind === RelationKinds.BelongsToMany\n ? {\n ...entry.relation,\n defaultPivotColumns: entry.relation.defaultPivotColumns\n ? [...entry.relation.defaultPivotColumns]\n : undefined\n }\n : { ...entry.relation };\n addRelationMetadata(ctor, entry.propertyName, relationCopy);\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column-types.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\n/**\n * Options for defining a column in an entity.\n */\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n dialectTypes?: ColumnDef['dialectTypes'];\n notNull?: boolean;\n primary?: boolean;\n tsType?: ColumnDef['tsType'];\n}\n\n/**\n * Input type for column definitions, either as options object or direct ColumnDef.\n */\nexport type ColumnInput = ColumnOptions | ColumnDef;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n dialectTypes: asOptions.dialectTypes ?? asDefinition.dialectTypes,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n tsType: asDefinition.tsType ?? asOptions.tsType,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as { constructor: unknown }).constructor === 'function') {\n return (target as { constructor: unknown }).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n};\n\n/**\n * Decorator to define a column on an entity property.\n * @param definition - The column definition or options.\n * @returns A property decorator that registers the column metadata.\n */\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\n/**\n * Decorator to define a primary key column on an entity property.\n * Sets the primary flag to true and delegates to Column decorator.\n * @param definition - The column definition or options.\n * @returns A property decorator that registers the primary key column metadata.\n */\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\n/**\n * Options for HasMany relation.\n */\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for HasOne relation.\n */\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for BelongsTo relation.\n */\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\n/**\n * Options for BelongsToMany relation.\n */\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as { constructor: new (...args: unknown[]) => unknown }).constructor === 'function') {\n return (instanceOrCtor as { constructor: new (...args: unknown[]) => unknown }).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\n/**\n * Decorator to define a HasMany relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a HasOne relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a BelongsTo relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\n/**\n * Decorator to define a BelongsToMany relation on an entity property.\n * @param options - The relation options.\n * @returns A property decorator that registers the relation metadata.\n */\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","// src/core/execution/db-executor.ts\r\n\r\n// low-level canonical shape\r\nexport type QueryResult = {\r\n columns: string[];\r\n values: unknown[][];\r\n};\r\n\r\nexport interface DbExecutor {\r\n /** Capability flags so the runtime can make correct decisions without relying on optional methods. */\r\n readonly capabilities: {\r\n /** True if begin/commit/rollback are real and should be used to provide atomicity. */\r\n transactions: boolean;\r\n };\r\n\r\n executeSql(sql: string, params?: unknown[]): Promise<QueryResult[]>;\r\n\r\n beginTransaction(): Promise<void>;\r\n commitTransaction(): Promise<void>;\r\n rollbackTransaction(): Promise<void>;\r\n\r\n /** Release any underlying resources (connections, pool leases, etc). Must be idempotent. */\r\n dispose(): Promise<void>;\r\n}\r\n\r\n// --- helpers ---\r\n\r\n/**\r\n * Convert an array of row objects into a QueryResult.\r\n */\r\nexport function rowsToQueryResult(\r\n rows: Array<Record<string, unknown>>\r\n): QueryResult {\r\n if (rows.length === 0) {\r\n return { columns: [], values: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]);\r\n const values = rows.map(row => columns.map(c => row[c]));\r\n return { columns, values };\r\n}\r\n\r\n/**\r\n * Minimal contract that most SQL clients can implement.\r\n */\r\nexport interface SimpleQueryRunner {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n\r\n /** Optional: used to support real transactions. */\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n\r\n /** Optional: release resources (connection close, pool lease release, etc). */\r\n dispose?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Generic factory: turn any SimpleQueryRunner into a DbExecutor.\r\n */\r\nexport function createExecutorFromQueryRunner(\r\n runner: SimpleQueryRunner\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof runner.beginTransaction === 'function' &&\r\n typeof runner.commitTransaction === 'function' &&\r\n typeof runner.rollbackTransaction === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const rows = await runner.query(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.beginTransaction!.call(runner);\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.commitTransaction!.call(runner);\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await runner.rollbackTransaction!.call(runner);\r\n },\r\n async dispose() {\r\n await runner.dispose?.call(runner);\r\n },\r\n };\r\n}\r\n","import type { PoolAdapter, PoolLease, PoolOptions } from './pool-types.js';\r\n\r\n/**\r\n * Node.js Timer with optional unref method (for preventing event loop from staying alive)\r\n */\r\ntype NodeTimer = ReturnType<typeof setInterval> & {\r\n unref?: () => void;\r\n};\r\n\r\ntype Deferred<T> = {\r\n promise: Promise<T>;\r\n resolve: (value: T) => void;\r\n reject: (err: unknown) => void;\r\n};\r\n\r\nconst deferred = <T>(): Deferred<T> => {\r\n let resolve!: (value: T) => void;\r\n let reject!: (err: unknown) => void;\r\n const promise = new Promise<T>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n return { promise, resolve, reject };\r\n};\r\n\r\ntype IdleEntry<T> = {\r\n resource: T;\r\n lastUsedAt: number;\r\n};\r\n\r\nexport class Pool<TResource> {\r\n private readonly adapter: PoolAdapter<TResource>;\r\n private readonly options: Required<Pick<PoolOptions, 'max'>> & PoolOptions;\r\n\r\n private destroyed = false;\r\n private creating = 0;\r\n private leased = 0;\r\n private readonly idle: IdleEntry<TResource>[] = [];\r\n private readonly waiters: Array<Deferred<PoolLease<TResource>>> = [];\r\n private reapTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n constructor(adapter: PoolAdapter<TResource>, options: PoolOptions) {\r\n if (!Number.isFinite(options.max) || options.max <= 0) {\r\n throw new Error('Pool options.max must be a positive number');\r\n }\r\n\r\n this.adapter = adapter;\r\n this.options = { max: options.max, ...options };\r\n\r\n const idleTimeout = this.options.idleTimeoutMillis;\r\n if (idleTimeout && idleTimeout > 0) {\r\n const interval =\r\n this.options.reapIntervalMillis ?? Math.max(1_000, Math.floor(idleTimeout / 2));\r\n this.reapTimer = setInterval(() => {\r\n void this.reapIdle();\r\n }, interval);\r\n\r\n // Best-effort: avoid keeping the event loop alive.\r\n (this.reapTimer as NodeTimer).unref?.();\r\n }\r\n\r\n // Best-effort warmup.\r\n const min = this.options.min ?? 0;\r\n if (min > 0) {\r\n void this.warm(min);\r\n }\r\n }\r\n\r\n /**\r\n * Acquire a resource lease.\r\n * The returned lease MUST be released or destroyed.\r\n */\r\n async acquire(): Promise<PoolLease<TResource>> {\r\n if (this.destroyed) {\r\n throw new Error('Pool is destroyed');\r\n }\r\n\r\n // 1) Prefer idle.\r\n const idle = await this.takeIdleValidated();\r\n if (idle) {\r\n this.leased++;\r\n return this.makeLease(idle);\r\n }\r\n\r\n // 2) Create if capacity allows.\r\n if (this.totalLive() < this.options.max) {\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.leased++;\r\n return this.makeLease(created);\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n\r\n // 3) Wait.\r\n const waiter = deferred<PoolLease<TResource>>();\r\n this.waiters.push(waiter);\r\n\r\n const timeout = this.options.acquireTimeoutMillis;\r\n let timer: NodeTimer | null = null;\r\n if (timeout && timeout > 0) {\r\n timer = setTimeout(() => {\r\n // Remove from queue if still waiting.\r\n const idx = this.waiters.indexOf(waiter);\r\n if (idx >= 0) this.waiters.splice(idx, 1);\r\n waiter.reject(new Error('Pool acquire timeout'));\r\n }, timeout) as NodeTimer;\r\n // Best-effort: avoid keeping the event loop alive.\r\n timer.unref?.();\r\n }\r\n\r\n try {\r\n return await waiter.promise;\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n /** Destroy pool and all idle resources; waits for in-flight creations to settle. */\r\n async destroy(): Promise<void> {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n if (this.reapTimer) {\r\n clearInterval(this.reapTimer);\r\n this.reapTimer = null;\r\n }\r\n\r\n // Reject all waiters.\r\n while (this.waiters.length) {\r\n this.waiters.shift()!.reject(new Error('Pool destroyed'));\r\n }\r\n\r\n // Destroy idle resources.\r\n while (this.idle.length) {\r\n const entry = this.idle.shift()!;\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n\r\n private totalLive(): number {\r\n return this.idle.length + this.leased + this.creating;\r\n }\r\n\r\n private makeLease(resource: TResource): PoolLease<TResource> {\r\n let done = false;\r\n return {\r\n resource,\r\n release: async () => {\r\n if (done) return;\r\n done = true;\r\n await this.releaseResource(resource);\r\n },\r\n destroy: async () => {\r\n if (done) return;\r\n done = true;\r\n await this.destroyResource(resource);\r\n },\r\n };\r\n }\r\n\r\n private async releaseResource(resource: TResource): Promise<void> {\r\n this.leased = Math.max(0, this.leased - 1);\r\n if (this.destroyed) {\r\n await this.adapter.destroy(resource);\r\n return;\r\n }\r\n\r\n // Prefer handing directly to waiters.\r\n const next = this.waiters.shift();\r\n if (next) {\r\n this.leased++;\r\n next.resolve(this.makeLease(resource));\r\n return;\r\n }\r\n\r\n this.idle.push({ resource, lastUsedAt: Date.now() });\r\n await this.trimToMinMax();\r\n }\r\n\r\n private async destroyResource(resource: TResource): Promise<void> {\r\n this.leased = Math.max(0, this.leased - 1);\r\n await this.adapter.destroy(resource);\r\n\r\n // If there are waiters and we have capacity, create a replacement.\r\n if (!this.destroyed && this.waiters.length && this.totalLive() < this.options.max) {\r\n const waiter = this.waiters.shift()!;\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.leased++;\r\n waiter.resolve(this.makeLease(created));\r\n } catch (err) {\r\n waiter.reject(err);\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n }\r\n\r\n private async takeIdleValidated(): Promise<TResource | null> {\r\n while (this.idle.length) {\r\n const entry = this.idle.pop()!;\r\n if (!this.adapter.validate) {\r\n return entry.resource;\r\n }\r\n const ok = await this.adapter.validate(entry.resource);\r\n if (ok) {\r\n return entry.resource;\r\n }\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n return null;\r\n }\r\n\r\n private async reapIdle(): Promise<void> {\r\n if (this.destroyed) return;\r\n const idleTimeout = this.options.idleTimeoutMillis;\r\n if (!idleTimeout || idleTimeout <= 0) return;\r\n\r\n const now = Date.now();\r\n const min = this.options.min ?? 0;\r\n\r\n // Remove expired resources beyond min.\r\n const keep: IdleEntry<TResource>[] = [];\r\n const kill: IdleEntry<TResource>[] = [];\r\n for (const entry of this.idle) {\r\n const expired = now - entry.lastUsedAt >= idleTimeout;\r\n if (expired) kill.push(entry);\r\n else keep.push(entry);\r\n }\r\n\r\n // Keep at least `min`.\r\n while (keep.length < min && kill.length) {\r\n keep.push(kill.pop()!);\r\n }\r\n\r\n this.idle.length = 0;\r\n this.idle.push(...keep);\r\n\r\n for (const entry of kill) {\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n\r\n private async warm(targetMin: number): Promise<void> {\r\n const min = Math.max(0, targetMin);\r\n while (!this.destroyed && this.idle.length < min && this.totalLive() < this.options.max) {\r\n this.creating++;\r\n try {\r\n const created = await this.adapter.create();\r\n this.idle.push({ resource: created, lastUsedAt: Date.now() });\r\n } catch {\r\n // If warmup fails, stop trying.\r\n break;\r\n } finally {\r\n this.creating--;\r\n }\r\n }\r\n }\r\n\r\n private async trimToMinMax(): Promise<void> {\r\n const max = this.options.max;\r\n const min = this.options.min ?? 0;\r\n\r\n // Ensure we don't exceed max in idle (best-effort; leased/creating already counted elsewhere).\r\n while (this.totalLive() > max && this.idle.length > min) {\r\n const entry = this.idle.shift();\r\n if (!entry) break;\r\n await this.adapter.destroy(entry.resource);\r\n }\r\n }\r\n}\r\n","// src/core/execution/executors/postgres-executor.ts\r\nimport {\r\n DbExecutor,\r\n createExecutorFromQueryRunner\r\n} from '../db-executor.js';\r\n\r\nexport interface PostgresClientLike {\r\n query(\r\n text: string,\r\n params?: unknown[]\r\n ): Promise<{ rows: Array<Record<string, unknown>> }>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for PostgreSQL.\r\n * @param client A PostgreSQL client or pool instance.\r\n * @returns A DbExecutor implementation for Postgres.\r\n */\r\nexport function createPostgresExecutor(\r\n client: PostgresClientLike\r\n): DbExecutor {\r\n return createExecutorFromQueryRunner({\r\n async query(sql, params) {\r\n const { rows } = await client.query(sql, params);\r\n return rows;\r\n },\r\n async beginTransaction() {\r\n await client.query('BEGIN');\r\n },\r\n async commitTransaction() {\r\n await client.query('COMMIT');\r\n },\r\n async rollbackTransaction() {\r\n await client.query('ROLLBACK');\r\n },\r\n });\r\n}\r\n","// src/core/execution/executors/mysql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MysqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<[unknown, unknown?]>; // rows, metadata\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for MySQL.\r\n * @param client A MySQL client instance.\r\n * @returns A DbExecutor implementation for MySQL.\r\n */\r\nexport function createMysqlExecutor(\r\n client: MysqlClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commit === 'function' &&\r\n typeof client.rollback === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const [rows] = await client.query(sql, params);\r\n\r\n if (!Array.isArray(rows)) {\r\n // e.g. insert/update returning only headers, treat as no rows\r\n return [{ columns: [], values: [] }];\r\n }\r\n\r\n const result = rowsToQueryResult(\r\n rows as Array<Record<string, unknown>>\r\n );\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commit!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollback!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/sqlite-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface SqliteClientLike {\r\n all(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n run?(sql: string, params?: unknown[]): Promise<unknown>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for SQLite.\r\n * @param client A SQLite client instance.\r\n * @returns A DbExecutor implementation for SQLite.\r\n */\r\nexport function createSqliteExecutor(\r\n client: SqliteClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commitTransaction === 'function' &&\r\n typeof client.rollbackTransaction === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const rows = await client.all(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commitTransaction!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollbackTransaction!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/mssql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MssqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<{ recordset: Array<Record<string, unknown>> }>;\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a database executor for Microsoft SQL Server.\r\n * @param client A SQL Server client instance.\r\n * @returns A DbExecutor implementation for MSSQL.\r\n */\r\nexport function createMssqlExecutor(\r\n client: MssqlClientLike\r\n): DbExecutor {\r\n const supportsTransactions =\r\n typeof client.beginTransaction === 'function' &&\r\n typeof client.commit === 'function' &&\r\n typeof client.rollback === 'function';\r\n\r\n return {\r\n capabilities: {\r\n transactions: supportsTransactions,\r\n },\r\n async executeSql(sql, params) {\r\n const { recordset } = await client.query(sql, params);\r\n const result = rowsToQueryResult(recordset ?? []);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.beginTransaction!();\r\n },\r\n async commitTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.commit!();\r\n },\r\n async rollbackTransaction() {\r\n if (!supportsTransactions) {\r\n throw new Error('Transactions are not supported by this executor');\r\n }\r\n await client.rollback!();\r\n },\r\n async dispose() {\r\n // Connection lifecycle is owned by the caller/driver. Pool lease executors should implement dispose.\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tedious integration helper (driver adapter)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface TediousColumn {\r\n metadata: { colName: string };\r\n value: unknown;\r\n}\r\n\r\nexport interface TediousRequest {\r\n addParameter(name: string, type: unknown, value: unknown): void;\r\n on(event: 'row', listener: (columns: TediousColumn[]) => void): void;\r\n}\r\n\r\nexport interface TediousRequestCtor {\r\n new(sql: string, callback: (err?: Error | null) => void): TediousRequest;\r\n}\r\n\r\nexport interface TediousTypes {\r\n NVarChar: unknown;\r\n Int: unknown;\r\n Float: unknown;\r\n BigInt: unknown;\r\n Bit: unknown;\r\n DateTime: unknown;\r\n VarBinary: unknown;\r\n}\r\n\r\nexport interface TediousModule {\r\n Request: TediousRequestCtor;\r\n TYPES: TediousTypes;\r\n}\r\n\r\nexport interface TediousConnectionLike {\r\n execSql(request: TediousRequest): void;\r\n beginTransaction?(cb: (err?: Error | null) => void): void;\r\n commitTransaction?(cb: (err?: Error | null) => void): void;\r\n rollbackTransaction?(cb: (err?: Error | null) => void): void;\r\n}\r\n\r\nexport interface CreateTediousClientOptions {\r\n inferType?(value: unknown, TYPES: TediousTypes): unknown;\r\n}\r\n\r\nconst defaultInferType = (value: unknown, TYPES: TediousTypes): unknown => {\r\n if (value === null || value === undefined) return TYPES.NVarChar;\r\n if (typeof value === 'number') {\r\n return Number.isInteger(value) ? TYPES.Int : TYPES.Float;\r\n }\r\n if (typeof value === 'bigint') return TYPES.BigInt;\r\n if (typeof value === 'boolean') return TYPES.Bit;\r\n if (value instanceof Date) return TYPES.DateTime;\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\r\n return TYPES.VarBinary;\r\n }\r\n return TYPES.NVarChar;\r\n};\r\n\r\nexport function createTediousMssqlClient(\r\n connection: TediousConnectionLike,\r\n { Request, TYPES }: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): MssqlClientLike {\r\n const inferType = options?.inferType ?? defaultInferType;\r\n\r\n return {\r\n async query(sql: string, params: unknown[] = []) {\r\n const rows = await new Promise<Array<Record<string, unknown>>>(\r\n (resolve, reject) => {\r\n const collected: Record<string, unknown>[] = [];\r\n\r\n const request = new Request(sql, err => {\r\n if (err) return reject(err);\r\n resolve(collected);\r\n });\r\n\r\n params.forEach((value, idx) => {\r\n const sqlType = inferType(value, TYPES);\r\n request.addParameter(\r\n `p${idx + 1}`,\r\n sqlType,\r\n value as unknown\r\n );\r\n });\r\n\r\n request.on('row', cols => {\r\n const row: Record<string, unknown> = {};\r\n for (const col of cols) {\r\n row[col.metadata.colName] = col.value;\r\n }\r\n collected.push(row);\r\n });\r\n\r\n connection.execSql(request);\r\n }\r\n );\r\n\r\n return { recordset: rows };\r\n },\r\n\r\n beginTransaction: connection.beginTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.beginTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n commit: connection.commitTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.commitTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n rollback: connection.rollbackTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.rollbackTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n };\r\n}\r\n\r\nexport function createTediousExecutor(\r\n connection: TediousConnectionLike,\r\n module: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): DbExecutor {\r\n const client = createTediousMssqlClient(connection, module, options);\r\n return createMssqlExecutor(client);\r\n}\r\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { rowsToQueryResult } from '../core/execution/db-executor.js';\r\nimport type { Pool } from '../core/execution/pooling/pool.js';\r\nimport type { DbExecutorFactory } from './orm.js';\r\n\r\nexport interface PooledConnectionAdapter<TConn> {\r\n query(\r\n conn: TConn,\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n\r\n beginTransaction(conn: TConn): Promise<void>;\r\n commitTransaction(conn: TConn): Promise<void>;\r\n rollbackTransaction(conn: TConn): Promise<void>;\r\n}\r\n\r\ntype PooledExecutorFactoryOptions<TConn> = {\r\n pool: Pool<TConn>;\r\n adapter: PooledConnectionAdapter<TConn>;\r\n};\r\n\r\n/**\r\n * Creates a first-class DbExecutorFactory backed by MetalORM's Pool.\r\n *\r\n * Design goals:\r\n * - No leaks by default: pool leases are always released in `finally`.\r\n * - Correct transactions: one leased connection per transaction.\r\n * - Session-friendly: createExecutor() supports transactions without permanently leasing a connection.\r\n */\r\nexport function createPooledExecutorFactory<TConn>(\r\n opts: PooledExecutorFactoryOptions<TConn>\r\n): DbExecutorFactory {\r\n const { pool, adapter } = opts;\r\n\r\n const makeExecutor = (mode: 'session' | 'sticky'): DbExecutor => {\r\n let lease: Awaited<ReturnType<typeof pool.acquire>> | null = null;\r\n\r\n const getLease = async () => {\r\n if (lease) return lease;\r\n lease = await pool.acquire();\r\n return lease;\r\n };\r\n\r\n const executeWithConn = async (\r\n conn: TConn,\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<QueryResult[]> => {\r\n const rows = await adapter.query(conn, sql, params);\r\n return [rowsToQueryResult(rows)];\r\n };\r\n\r\n return {\r\n capabilities: { transactions: true },\r\n\r\n async executeSql(sql, params) {\r\n // Sticky mode: always reuse a leased connection.\r\n if (mode === 'sticky') {\r\n const l = await getLease();\r\n return executeWithConn(l.resource, sql, params);\r\n }\r\n\r\n // Session mode: use the leased connection if we're currently in a transaction;\r\n // otherwise acquire/release per call.\r\n if (lease) {\r\n return executeWithConn(lease.resource, sql, params);\r\n }\r\n\r\n const l = await pool.acquire();\r\n try {\r\n return await executeWithConn(l.resource, sql, params);\r\n } finally {\r\n await l.release();\r\n }\r\n },\r\n\r\n async beginTransaction() {\r\n const l = await getLease();\r\n await adapter.beginTransaction(l.resource);\r\n },\r\n\r\n async commitTransaction() {\r\n if (!lease) {\r\n throw new Error('commitTransaction called without an active transaction');\r\n }\r\n const l = lease;\r\n try {\r\n await adapter.commitTransaction(l.resource);\r\n } finally {\r\n lease = null;\r\n await l.release();\r\n }\r\n },\r\n\r\n async rollbackTransaction() {\r\n if (!lease) {\r\n // Nothing to rollback; keep idempotent semantics.\r\n return;\r\n }\r\n const l = lease;\r\n try {\r\n await adapter.rollbackTransaction(l.resource);\r\n } finally {\r\n lease = null;\r\n await l.release();\r\n }\r\n },\r\n\r\n async dispose() {\r\n if (!lease) return;\r\n const l = lease;\r\n lease = null;\r\n await l.release();\r\n },\r\n };\r\n };\r\n\r\n return {\r\n createExecutor() {\r\n return makeExecutor('session');\r\n },\r\n createTransactionalExecutor() {\r\n return makeExecutor('sticky');\r\n },\r\n async dispose() {\r\n await pool.destroy();\r\n },\r\n };\r\n}\r\n\r\n"],"mappings":"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","names":["col","lower","length","col","left","right","lower","upper","col","col","col","col","registry","upper","left","right","lower","col","fn","col","col","fn","left","right","col","col","left","right","col","col","col","col","col","col","tableRef","col","state","hydration","col","relationSelectionResult","targetName","tableNode","tableRef","col","col","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","pkColumn","selection","toKey","hasOne","hasMany","belongsTo","col","sub","hasAlias","col","isTableSourceNode","col","col","col","executeSchemaPlan","col","columnNode","col","toOperand","length","count","toOperandNode","fn","tableNode","columnNode","combineConditions","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","assertNever","col","sel","left","right","fn","lower","upper","EntityStatus","toKey","col","fn","fn","normalizePropertyName","resolveConstructor","propertyName","min","now","max","col","l"]}
|