metal-orm 1.0.12 → 1.0.13

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schema/table.ts","../src/schema/column.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/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/query-builder/select-query-state.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/core/ast/builders.ts","../src/query-builder/raw-column-parser.ts","../src/query-builder/query-ast-service.ts","../src/query-builder/relation-projection-helper.ts","../src/core/ast/join-node.ts","../src/query-builder/relation-conditions.ts","../src/core/sql/sql.ts","../src/query-builder/relation-service.ts","../src/query-builder/select-query-builder-deps.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.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/select.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/dialect/abstract.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/postgres/index.ts","../src/core/ddl/dialects/base-schema-dialect.ts","../src/core/ddl/dialects/postgres-schema-dialect.ts","../src/core/ddl/dialects/mysql-schema-dialect.ts","../src/core/ddl/dialects/sqlite-schema-dialect.ts","../src/core/ddl/dialects/mssql-schema-dialect.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/schema-introspect.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/typescript.ts","../src/orm/domain-event-bus.ts","../src/orm/identity-map.ts","../src/orm/relation-change-processor.ts","../src/orm/transaction-runner.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/orm-context.ts"],"sourcesContent":["\r\nexport * from './schema/table.js';\r\nexport * from './schema/column.js';\r\nexport * from './schema/relation.js';\r\nexport * from './schema/types.js';\r\nexport * from './query-builder/select.js';\nexport * from './query-builder/insert.js';\nexport * from './query-builder/update.js';\nexport * from './query-builder/delete.js';\nexport * from './core/ast/expression.js';\nexport * from './core/dialect/mysql/index.js';\nexport * from './core/dialect/mssql/index.js';\nexport * from './core/dialect/sqlite/index.js';\nexport * from './core/dialect/postgres/index.js';\nexport * from './core/ddl/schema-generator.js';\nexport * from './core/ddl/schema-types.js';\nexport * from './core/ddl/schema-diff.js';\nexport * from './core/ddl/schema-introspect.js';\nexport * from './orm/als.js';\nexport * from './orm/hydration.js';\nexport * from './codegen/typescript.js';\nexport * from './orm/orm-context.js';\nexport * from './orm/entity.js';\nexport * from './orm/lazy-batch.js';\r\nexport * from './orm/relations/has-many.js';\r\nexport * from './orm/relations/belongs-to.js';\r\nexport * from './orm/relations/many-to-many.js';\r\nexport * from './orm/execute.js';\r\n","import { ColumnDef } from './column.js';\nimport { RelationDef } from './relation.js';\n\nexport interface IndexColumn {\n column: string;\n order?: 'ASC' | 'DESC';\n nulls?: 'FIRST' | 'LAST';\n}\n\nexport interface IndexDef {\n name?: string;\n columns: (string | IndexColumn)[];\n unique?: boolean;\n where?: string;\n}\n\nexport interface CheckConstraint {\n name?: string;\n expression: string;\n}\n\nexport interface TableOptions {\n schema?: string;\n primaryKey?: string[];\n indexes?: IndexDef[];\n checks?: CheckConstraint[];\n comment?: string;\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\nexport interface TableHooks {\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: any): 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>> {\n /** Name of the table */\n name: string;\n /** Optional schema/catalog name */\n schema?: string;\n /** Record of column definitions keyed by column name */\n columns: T;\n /** Record of relationship definitions keyed by relation name */\n relations: Record<string, RelationDef>;\n /** Optional lifecycle hooks */\n hooks?: TableHooks;\n /** Composite primary key definition (falls back to column.primary flags) */\n primaryKey?: string[];\n /** Secondary indexes */\n indexes?: IndexDef[];\n /** Table-level check constraints */\n checks?: CheckConstraint[];\n /** Table comment/description */\n comment?: string;\n /** Dialect-specific options */\n engine?: string;\n charset?: string;\n collation?: string;\n}\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>>(\n name: string,\n columns: T,\n relations: Record<string, RelationDef> = {},\n hooks?: TableHooks,\n options: TableOptions = {}\n): TableDef<T> => {\n // Runtime mutability to assign names to column definitions for convenience\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\n (acc as any)[key] = { ...def, name: key, table: name };\n return acc;\n }, {} as T);\n\n return {\n name,\n schema: options.schema,\n columns: colsWithNames,\n relations,\n hooks,\n primaryKey: options.primaryKey,\n indexes: options.indexes,\n checks: options.checks,\n comment: options.comment,\n engine: options.engine,\n charset: options.charset,\n collation: options.collation\n };\n};\n","/**\r\n * Supported column data types for database schema definitions\r\n */\r\nexport type ColumnType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'VARCHAR'\n | 'TEXT'\n | 'JSON'\n | 'ENUM'\n | 'DECIMAL'\n | 'FLOAT'\n | 'DOUBLE'\n | 'UUID'\n | 'DATE'\n | 'DATETIME'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'BOOLEAN'\n | 'int'\n | 'integer'\n | 'bigint'\n | 'varchar'\n | 'text'\n | 'json'\n | 'enum'\n | 'decimal'\n | 'float'\n | 'double'\n | 'uuid'\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'timestamptz'\n | 'boolean';\n\nexport type ReferentialAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\nexport interface RawDefaultValue {\n raw: string;\n}\n\nexport type DefaultValue = unknown | RawDefaultValue;\n\nexport interface ForeignKeyReference {\n /** Target table name */\n table: string;\n /** Target column name */\n column: string;\n /** Optional constraint name */\n name?: string;\n /** ON DELETE action */\n onDelete?: ReferentialAction;\n /** ON UPDATE action */\n onUpdate?: ReferentialAction;\n /** Whether the constraint is deferrable (Postgres) */\n deferrable?: boolean;\n}\n\n/**\n * Definition of a database column\n */\nexport interface ColumnDef<T extends ColumnType = ColumnType> {\n /** Column name (filled at runtime by defineTable) */\n name: string;\n /** Data type of the column */\n type: T;\n /** Whether this column is a primary key */\n primary?: boolean;\n /** Whether this column cannot be null */\n notNull?: boolean;\n /** Whether this column must be unique (or name of the unique constraint) */\n unique?: boolean | string;\n /** Default value for the column */\n default?: DefaultValue;\n /** Whether the column auto-increments / identity */\n autoIncrement?: boolean;\n /** Identity strategy where supported */\n generated?: 'always' | 'byDefault';\n /** Inline check constraint expression */\n check?: string;\n /** Foreign key reference */\n references?: ForeignKeyReference;\n /** Column comment/description */\n comment?: string;\n /** Additional arguments for the column type (e.g., VARCHAR length) */\n args?: any[];\n /** Table name this column belongs to (filled at runtime by defineTable) */\n table?: string;\n}\n\n/**\r\n * Factory for creating column definitions with common data types\r\n */\r\nexport const col = {\n /**\n * Creates an integer column definition\n * @returns ColumnDef with INT type\n */\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\n\n /**\n * Creates a big integer column definition\n */\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\n\n /**\n * Creates a variable character column definition\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 fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\n type: 'DECIMAL',\n args: [precision, scale]\n }),\n\n /**\n * Creates a floating point column definition\n */\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\n name: '',\n type: 'FLOAT',\n args: precision !== undefined ? [precision] : undefined\n }),\n\n /**\n * Creates a UUID column definition\n */\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\n\n /**\n * Creates a timestamp column definition\n */\n timestamp: (): ColumnDef<'TIMESTAMP'> => ({ name: '', type: 'TIMESTAMP' }),\n\n /**\n * Creates a timestamptz column definition\n */\n timestamptz: (): ColumnDef<'TIMESTAMPTZ'> => ({ name: '', type: 'TIMESTAMPTZ' }),\n\n /**\n * Creates a date column definition\n */\n date: (): ColumnDef<'DATE'> => ({ name: '', type: 'DATE' }),\n\n /**\n * Creates a datetime column definition\n */\n datetime: (): ColumnDef<'DATETIME'> => ({ name: '', type: 'DATETIME' }),\n\n /**\n * Creates a JSON column definition\n * @returns ColumnDef with JSON type\n */\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\n\r\n /**\n * Creates a boolean column definition\n * @returns ColumnDef with BOOLEAN type\n */\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\n\n /**\n * Creates an enum column definition\n * @param values - Enum values\n */\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\n\n /**\n * Marks a column definition as a primary key\n * @param def - Column definition to modify\n * @returns Modified ColumnDef with primary: true\n */\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, primary: true }),\n\n /**\n * Marks a column as NOT NULL\n */\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, notNull: true }),\n\n /**\n * Marks a column as UNIQUE\n */\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\n ({\n ...def,\n unique: name ?? true\n }),\n\n /**\n * Sets a default value for the column\n */\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\n ({\n ...def,\n default: value\n }),\n\n /**\n * Sets a raw SQL default value for the column\n */\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n default: { raw: expression }\n }),\n\n /**\n * Marks a column as auto-increment / identity\n */\n autoIncrement: <T extends ColumnType>(\n def: ColumnDef<T>,\n strategy: ColumnDef['generated'] = 'byDefault'\n ): ColumnDef<T> =>\n ({\n ...def,\n autoIncrement: true,\n generated: strategy\n }),\n\n /**\n * Adds a foreign key reference\n */\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\n ({\n ...def,\n references: ref\n }),\n\n /**\n * Adds a check constraint to the column\n */\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n check: expression\n })\n};\n","import { 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-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 * 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 | 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 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 { ColumnDef } from '../../schema/column.js';\r\nimport type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.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 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}\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 /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional alias for the function result */\r\n alias?: string;\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\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 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 * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(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 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: OperandNode[];\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","import { ColumnDef } from '../../schema/column.js';\r\nimport { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\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: unknown): OperandNode => {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean'\r\n ) {\r\n return { type: 'Literal', value: value === undefined ? null : value } as LiteralNode;\r\n }\r\n return value as OperandNode;\r\n};\r\n\r\nconst toNode = (col: ColumnDef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnDef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst toOperand = (val: OperandNode | ColumnDef | string | number | boolean | null): OperandNode => {\r\n if (val === null) return { type: 'Literal', value: null };\r\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\r\n return { type: 'Literal', value: val };\r\n }\r\n return toNode(val as OperandNode | ColumnDef);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnDef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(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 | ColumnDef, right: OperandNode | ColumnDef | string | number): 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 | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number\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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, 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 | ColumnDef, 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 | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(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 | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnDef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\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 | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\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 | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(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 | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | 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 | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\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: ColumnDef | 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 | ColumnDef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnDef | 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 * 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","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\nimport { OrderDirection } from '../sql/sql.js';\r\nimport { OrderByNode } from './query.js';\r\n\r\nconst buildWindowFunction = (\r\n name: string,\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: ColumnNode[],\r\n orderBy?: OrderByNode[]\r\n): WindowFunctionNode => {\r\n const node: WindowFunctionNode = {\r\n type: 'WindowFunction',\r\n name,\r\n args\r\n };\r\n\r\n if (partitionBy && partitionBy.length) {\r\n node.partitionBy = partitionBy;\r\n }\r\n\r\n if (orderBy && orderBy.length) {\r\n node.orderBy = orderBy;\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates a ROW_NUMBER window function\r\n * @returns Window function node for ROW_NUMBER\r\n */\r\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\r\n\r\n/**\r\n * Creates a RANK window function\r\n * @returns Window function node for RANK\r\n */\r\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\r\n\r\n/**\r\n * Creates a DENSE_RANK window function\r\n * @returns Window function node for DENSE_RANK\r\n */\r\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\r\n\r\n/**\r\n * Creates an NTILE window function\r\n * @param n - Number of buckets\r\n * @returns Window function node for NTILE\r\n */\r\nexport const ntile = (n: number): WindowFunctionNode =>\r\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\r\n\r\n/**\r\n * Creates a LAG window function\r\n * @param col - Column to lag\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\r\n * @returns Window function node for LAG\r\n */\r\nexport const lag = (col: ColumnDef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\r\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\r\n columnOperand(col),\r\n { type: 'Literal', value: offset }\r\n ];\r\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LAG', args);\r\n};\r\n\r\n/**\r\n * Creates a LEAD window function\r\n * @param col - Column to lead\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\r\n * @returns Window function node for LEAD\r\n */\r\nexport const lead = (col: ColumnDef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\r\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\r\n columnOperand(col),\r\n { type: 'Literal', value: offset }\r\n ];\r\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LEAD', args);\r\n};\r\n\r\n/**\r\n * Creates a FIRST_VALUE window function\r\n * @param col - Column to get first value from\r\n * @returns Window function node for FIRST_VALUE\r\n */\r\nexport const firstValue = (col: ColumnDef | ColumnNode): WindowFunctionNode =>\r\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\r\n\r\n/**\r\n * Creates a LAST_VALUE window function\r\n * @param col - Column to get last value from\r\n * @returns Window function node for LAST_VALUE\r\n */\r\nexport const lastValue = (col: ColumnDef | ColumnNode): WindowFunctionNode =>\r\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\r\n\r\n/**\r\n * Creates a custom window function\r\n * @param name - Window function name\r\n * @param args - Function arguments\r\n * @param partitionBy - Optional PARTITION BY columns\r\n * @param orderBy - Optional ORDER BY clauses\r\n * @returns Window function node\r\n */\r\nexport const windowFunction = (\r\n name: string,\r\n args: (ColumnDef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: (ColumnDef | ColumnNode)[],\r\n orderBy?: { column: ColumnDef | ColumnNode; direction: OrderDirection }[]\r\n): WindowFunctionNode => {\r\n const nodeArgs = args.map(arg => {\r\n if (typeof (arg as LiteralNode).value !== 'undefined') {\r\n return arg as LiteralNode;\r\n }\r\n if ('path' in arg) {\r\n return arg as JsonPathNode;\r\n }\r\n return columnOperand(arg as ColumnDef | ColumnNode);\r\n });\r\n\r\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\r\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\r\n type: 'OrderBy',\r\n column: columnOperand(o.column),\r\n direction: o.direction\r\n }));\r\n\r\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\r\n};\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, FunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\n\r\nconst buildAggregate = (name: string) => (col: ColumnDef | ColumnNode): FunctionNode => ({\r\n type: 'Function',\r\n name,\r\n args: [columnOperand(col)]\r\n});\r\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\r\n * @returns Function node with SUM\r\n */\r\nexport const sum = buildAggregate('SUM');\r\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\r\n */\r\nexport const avg = buildAggregate('AVG');\r\n","import {\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ExpressionNode,\r\n OperandNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Visitor for expression nodes\r\n */\r\nexport interface ExpressionVisitor<R> {\r\n visitBinaryExpression(node: BinaryExpressionNode): R;\r\n visitLogicalExpression(node: LogicalExpressionNode): R;\r\n visitNullExpression(node: NullExpressionNode): R;\r\n visitInExpression(node: InExpressionNode): R;\r\n visitExistsExpression(node: ExistsExpressionNode): R;\r\n visitBetweenExpression(node: BetweenExpressionNode): R;\r\n}\r\n\r\n/**\r\n * Visitor for operand nodes\r\n */\r\nexport interface OperandVisitor<R> {\r\n visitColumn(node: ColumnNode): R;\r\n visitLiteral(node: LiteralNode): R;\r\n visitFunction(node: FunctionNode): R;\r\n visitJsonPath(node: JsonPathNode): R;\r\n visitScalarSubquery(node: ScalarSubqueryNode): R;\r\n visitCaseExpression(node: CaseExpressionNode): R;\r\n visitWindowFunction(node: WindowFunctionNode): R;\r\n}\r\n\r\nconst unsupportedExpression = (node: ExpressionNode): never => {\r\n throw new Error(`Unsupported expression type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n\r\nconst unsupportedOperand = (node: OperandNode): never => {\r\n throw new Error(`Unsupported operand type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n/**\r\n * Dispatches an expression node to the visitor\r\n * @param node - Expression node to visit\r\n * @param visitor - Visitor implementation\r\n */\r\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\r\n switch (node.type) {\r\n case 'BinaryExpression':\r\n return visitor.visitBinaryExpression(node);\r\n case 'LogicalExpression':\r\n return visitor.visitLogicalExpression(node);\r\n case 'NullExpression':\r\n return visitor.visitNullExpression(node);\r\n case 'InExpression':\r\n return visitor.visitInExpression(node);\r\n case 'ExistsExpression':\r\n return visitor.visitExistsExpression(node);\r\n case 'BetweenExpression':\r\n return visitor.visitBetweenExpression(node);\r\n default:\r\n return unsupportedExpression(node);\r\n }\r\n};\r\n\r\n/**\r\n * Dispatches an operand node to the visitor\r\n * @param node - Operand node to visit\r\n * @param visitor - Visitor implementation\r\n */\r\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\r\n switch (node.type) {\r\n case 'Column':\r\n return visitor.visitColumn(node);\r\n case 'Literal':\r\n return visitor.visitLiteral(node);\r\n case 'Function':\r\n return visitor.visitFunction(node);\r\n case 'JsonPath':\r\n return visitor.visitJsonPath(node);\r\n case 'ScalarSubquery':\r\n return visitor.visitScalarSubquery(node);\r\n case 'CaseExpression':\r\n return visitor.visitCaseExpression(node);\r\n case 'WindowFunction':\r\n return visitor.visitWindowFunction(node);\r\n default:\r\n return unsupportedOperand(node);\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n joins: [...(this.ast.joins ?? []), join]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param cte - CTE node to add\r\n * @returns New SelectQueryState with CTE\r\n */\r\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n ctes: [...(this.ast.ctes ?? []), cte]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef } from '../schema/relation.js';\r\nimport { SelectQueryNode, HydrationPlan } from '../core/ast/query.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\n /**\r\n * Applies hydration plan to the AST\r\n * @param ast - Query AST to modify\r\n * @returns AST with hydration metadata\r\n */\r\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\r\n const plan = this.planner.getPlan();\r\n if (!plan) return ast;\r\n return {\r\n ...ast,\r\n meta: {\r\n ...(ast.meta || {}),\r\n hydration: plan\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.planner.getPlan();\r\n }\r\n}\r\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 */\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 */\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 */\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 */\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/ast/query.js';\r\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: {\r\n const localKey = rel.localKey || findPrimaryKey(this.table);\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.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 { ColumnDef } from '../../schema/column.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { ColumnNode } from './expression-nodes.js';\r\nimport { TableNode } from './query.js';\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: TableDef, column: ColumnDef | ColumnNode): ColumnNode => {\r\n if ((column as ColumnNode).type === 'Column') {\r\n return column as ColumnNode;\r\n }\r\n\r\n const def = column as ColumnDef;\r\n return {\r\n type: 'Column',\r\n table: def.table || table.name,\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: TableDef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: 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: TableDef): TableNode => ({\r\n type: 'Table',\r\n name: table.name\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\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 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';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\r\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\r\n ): ColumnSelectionResult {\r\n const existingAliases = new Set(\r\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\r\n );\r\n\r\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\r\n if (existingAliases.has(alias)) return acc;\r\n\r\n if (isExpressionSelectionNode(val)) {\r\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\r\n return acc;\r\n }\r\n\r\n const colDef = val as ColumnDef;\r\n acc.push({\r\n type: 'Column',\r\n table: colDef.table || this.table.name,\r\n name: colDef.name,\r\n alias\r\n } as ColumnNode);\r\n return acc;\r\n }, []);\r\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\r\n const newCols = cols.map(col => parseRawColumn(col, this.table.name, this.state.ast.ctes));\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\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 for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\r\n const cte: CommonTableExpressionNode = {\r\n type: 'CommonTableExpression',\r\n name,\r\n query,\r\n columns,\r\n recursive\r\n };\r\n\r\n return this.state.withCte(cte);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withGroupBy([node]);\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\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 Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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","import { JoinNode } from './join.js';\r\nimport { ExpressionNode } from './expression.js';\r\nimport { JoinKind } from '../sql/sql.js';\r\n\r\n/**\r\n * Creates a JoinNode ready for AST insertion.\r\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\r\n */\r\nexport const createJoinNode = (\r\n kind: JoinKind,\r\n tableName: string,\r\n condition: ExpressionNode,\r\n relationName?: string\r\n): JoinNode => ({\r\n type: 'Join',\r\n kind,\r\n table: { type: 'Table', name: tableName },\r\n condition,\r\n relationName\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): ExpressionNode => {\r\n const defaultLocalKey =\r\n relation.type === RelationKinds.HasMany\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 return eq(\r\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\r\n { type: 'Column', table: root.name, 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: root.name, 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 */\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): JoinNode[] => {\r\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: root.name, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\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 relation.target.name,\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 * @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): ExpressionNode => {\r\n const base = baseRelationCondition(root, relation);\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 * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n return baseRelationCondition(root, relation);\r\n};\r\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 = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\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 { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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 { 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.table.name, 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 => j.relationName === 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 ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const correlation = buildRelationCorrelation(this.table, relation);\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 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 );\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);\r\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\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\r\nexport type { RelationResult } from './relation-projection-helper.js';\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\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\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\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 };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.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 {\r\n const nodes = columns.map(col => buildColumnNode(this.env.table, col));\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.withDistinct(nodes);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\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(context: SelectQueryBuilderContext, relationName: string, ast: SelectQueryNode): SelectQueryNode {\r\n return this.createService(context).applyRelationCorrelation(relationName, ast);\r\n }\r\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 { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.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 * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\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: any, relationName: string): Set<any> => {\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<any>();\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 const bucket = parent[rel.name] as any[];\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, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\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] = [];\r\n }\r\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\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 any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\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 { OrmContext } from './orm-context.js';\r\nimport { RelationMap } from '../schema/types.js';\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\nexport interface EntityMeta<TTable extends TableDef> {\r\n ctx: OrmContext;\r\n table: TTable;\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n relationCache: Map<string, Promise<any>>;\r\n relationHydration: Map<string, Map<string, any>>;\r\n relationWrappers: Map<string, unknown>;\r\n}\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, any>[] | 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\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | 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;\r\n};\r\n\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\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 constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n this.hydrateFromCache();\r\n }\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[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 getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\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 attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[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 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 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[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","import { BelongsToReference } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\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 constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TParent,\r\n private readonly targetKey: string\r\n ) {\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[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[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, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[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[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","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n this.hydrateFromCache();\r\n }\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 any)._pivot) {\r\n (entity as any)._pivot = row._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 getItems(): TTarget[] {\r\n return this.items;\r\n }\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) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\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 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 async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\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, any> = {\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 any)[this.targetKey] ?? 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[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 if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { OrmContext, QueryResult } from './orm-context.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\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\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, any> = {};\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 executeQuery = async (ctx: OrmContext, qb: SelectQueryBuilder<any, TableDef<any>>): 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\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: OrmContext,\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 = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\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 qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: OrmContext,\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 = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\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 targetSelect = selectAllColumns(relation.target);\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 targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\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","import { TableDef } from '../schema/table.js';\r\nimport { Entity, RelationMap, HasManyCollection, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\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\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): Entity<TTable> => {\r\n const target: Record<string, any> = { ...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 let proxy: Entity<TTable>;\r\n const handler: ProxyHandler<any> = {\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, relationName as string, proxy);\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, prop, proxy);\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(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as Entity<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <TTable extends TableDef>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): Entity<TTable> => {\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;\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;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n const populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\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 (!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, any>>();\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 getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\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 as any, 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\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\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, any>) => 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, any>) => 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, any>) => 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 { Entity } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityFromRow } from './entity.js';\r\n\r\ntype Row = Record<string, any>;\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\nexport async function executeHydrated<TTable extends TableDef>(\r\n ctx: OrmContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const executed = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row =>\r\n createEntityFromRow(ctx, qb.getTable(), row, qb.getLazyRelations())\r\n );\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, HydrationPlan } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n LiteralNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n exists,\r\n notExists\r\n} from '../core/ast/expression.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\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 { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { Entity, RelationMap } from '../schema/types.js';\r\nimport { OrmContext } from '../orm/orm-context.js';\r\nimport { executeHydrated } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\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 = any, 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 = new ColumnSelector(this.env);\r\n this.relationManager = new RelationManager(this.env);\r\n }\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 private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\r\n return typeof (query as any).getAST === 'function'\r\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\r\n : (query as SelectQueryNode);\r\n }\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 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 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, table.name, condition);\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Selects specific columns for the query\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n * @returns New query builder instance with selected columns\r\n */\r\n select(columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.select(this.context, columns));\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(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(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(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(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 * 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(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = this.resolveQueryNode(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\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(relationName: string, predicate?: ExpressionNode): 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(\r\n relationName: string,\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(relationName: string, options?: RelationIncludeOptions): 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 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 getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n async execute(ctx: OrmContext): Promise<Entity<TTable>[]> {\r\n return executeHydrated(ctx, 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 col - Column definition or column node to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\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 * Adds an ORDER BY clause to the query\r\n * @param col - Column definition or column node to order by\r\n * @param direction - Order direction (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\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 * 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(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(exists(subAst));\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(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(notExists(subAst));\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(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\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 let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\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);\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(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\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 let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\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);\r\n return this.where(notExists(finalSubAst));\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: Dialect): CompiledQuery {\r\n return dialect.compileSelect(this.context.state.ast);\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: Dialect): 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/**\r\n * Creates a column node for use in expressions\r\n * @param table - Table name\r\n * @param name - Column name\r\n * @returns ColumnNode with the specified table and name\r\n */\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n/**\r\n * Creates a literal value node for use in expressions\r\n * @param val - Literal value (string or number)\r\n * @returns LiteralNode with the specified value\r\n */\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n","import { TableDef } from '../schema/table.js';\r\nimport { InsertQueryNode, TableNode } from '../core/ast/query.js';\r\nimport { ColumnNode, OperandNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { buildColumnNodes, createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for building INSERT queries\r\n */\r\nexport class InsertQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: InsertQueryNode;\r\n\r\n constructor(table: TableDef, ast?: InsertQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'InsertQuery',\r\n into: createTableNode(table),\r\n columns: [],\r\n values: []\r\n };\r\n }\r\n\r\n private clone(nextAst: InsertQueryNode): InsertQueryState {\r\n return new InsertQueryState(this.table, nextAst);\r\n }\r\n\r\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\r\n if (!rows.length) return this;\r\n\r\n const definedColumns = this.ast.columns.length\r\n ? this.ast.columns\r\n : buildColumnNodes(this.table, Object.keys(rows[0]));\r\n\r\n const newRows: OperandNode[][] = rows.map(row =>\r\n definedColumns.map(column => valueToOperand(row[column.name]))\r\n );\r\n\r\n return this.clone({\r\n ...this.ast,\r\n columns: definedColumns,\r\n values: [...this.ast.values, ...newRows]\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): InsertQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler } from '../core/dialect/abstract.js';\r\nimport { InsertQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 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 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 compile(compiler: InsertCompiler): CompiledQuery {\r\n return compiler.compileInsert(this.state.ast);\r\n }\r\n\r\n toSql(compiler: InsertCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { TableNode, UpdateQueryNode, UpdateAssignmentNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Immutable state for UPDATE queries\r\n */\r\nexport class UpdateQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: UpdateQueryNode;\r\n\r\n constructor(table: TableDef, ast?: UpdateQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'UpdateQuery',\r\n table: createTableNode(table),\r\n set: []\r\n };\r\n }\r\n\r\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\r\n return new UpdateQueryState(this.table, nextAst);\r\n }\r\n\r\n withSet(values: Record<string, unknown>): UpdateQueryState {\r\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, value]) => ({\r\n column: {\r\n type: 'Column',\r\n table: this.table.name,\r\n name: column\r\n },\r\n value: valueToOperand(value)\r\n }));\r\n\r\n return this.clone({\r\n ...this.ast,\r\n set: assignments\r\n });\r\n }\r\n\r\n withWhere(expr: ExpressionNode): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, UpdateCompiler } from '../core/dialect/abstract.js';\r\nimport { UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\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 compile(compiler: UpdateCompiler): CompiledQuery {\r\n return compiler.compileUpdate(this.state.ast);\r\n }\r\n\r\n toSql(compiler: UpdateCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { TableNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for DELETE queries\r\n */\r\nexport class DeleteQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: DeleteQueryNode;\r\n\r\n constructor(table: TableDef, ast?: DeleteQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'DeleteQuery',\r\n from: createTableNode(table)\r\n };\r\n }\r\n\r\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\r\n return new DeleteQueryState(this.table, nextAst);\r\n }\r\n\r\n withWhere(expr: ExpressionNode): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, DeleteCompiler } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\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 compile(compiler: DeleteCompiler): CompiledQuery {\r\n return compiler.compileDelete(this.state.ast);\r\n }\r\n\r\n toSql(compiler: DeleteCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode } 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 WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\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{\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 rawSql = this.compileSelectAst(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 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 /**\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 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 full = this.compileSelectAst(ast, ctx).trim().replace(/;$/, '');\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 return '?';\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\r\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\r\n\r\n protected constructor() {\r\n this.expressionCompilers = new Map();\r\n this.operandCompilers = new Map();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\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 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 const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\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\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) => {\r\n const args = fnNode.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n return `${fnNode.name}(${args})`;\r\n });\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => this.compileJsonPath(path));\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('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 `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`\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\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\n\n/**\n * Shared SQL compiler for dialects with standard LIMIT/OFFSET pagination.\n * Concrete dialects override only the minimal hooks (identifier quoting,\n * JSON path, placeholders, RETURNING support) instead of re-implementing\n * the entire compile pipeline.\n */\nexport abstract class SqlDialectBase extends Dialect {\n /**\n * Quotes an identifier (dialect-specific).\n */\n abstract quoteIdentifier(id: string): string;\n\n /**\n * Compiles SELECT query AST to SQL using common rules.\n */\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\n const ctes = this.compileCtes(ast, ctx);\n const columns = this.compileSelectColumns(ast, ctx);\n const from = this.compileFrom(ast.from);\n const joins = this.compileJoins(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const groupBy = this.compileGroupBy(ast);\n const having = this.compileHaving(ast, ctx);\n const orderBy = this.compileOrderBy(ast);\n const pagination = this.compilePagination(ast, orderBy);\n\n return `${ctes}SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\n }\n\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\n const table = this.compileTableName(ast.into);\n const columnList = ast.columns\n .map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`)\n .join(', ');\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\n const returning = this.compileReturning(ast.returning, ctx);\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\n }\n\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\n const table = this.compileTableName(ast.table);\n const assignments = ast.set.map(assignment => {\n const col = assignment.column;\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n }).join(', ');\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n const table = this.compileTableName(ast.from);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE FROM ${table}${whereClause}${returning}`;\n }\n\n /**\n * Default RETURNING compilation: no support.\n */\n protected compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n throw new Error('RETURNING is not supported by this dialect.');\n }\n\n /**\n * DISTINCT clause. Override for DISTINCT ON support.\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']): string {\n const base = this.compileTableName(ast);\n return ast.alias ? `${base} AS ${this.quoteIdentifier(ast.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: 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 compileJoins(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.joins || ast.joins.length === 0) return '';\n const parts = ast.joins.map(j => {\n const table = this.compileFrom(j.table);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n });\n return ` ${parts.join(' ')}`;\n }\n\n protected compileGroupBy(ast: SelectQueryNode): string {\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\n const cols = ast.groupBy\n .map(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`)\n .join(', ');\n return ` GROUP BY ${cols}`;\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 compileOrderBy(ast: SelectQueryNode): string {\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\n const parts = ast.orderBy\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\n .join(', ');\n return ` ORDER BY ${parts}`;\n }\n\n /**\n * Default LIMIT/OFFSET pagination clause.\n */\n protected compilePagination(ast: SelectQueryNode, _orderByClause: string): string {\n const parts: string[] = [];\n if (ast.limit !== undefined) parts.push(`LIMIT ${ast.limit}`);\n if (ast.offset !== undefined) parts.push(`OFFSET ${ast.offset}`);\n return parts.length ? ` ${parts.join(' ')}` : '';\n }\n\n protected compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.ctes || ast.ctes.length === 0) return '';\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\n const cteDefs = ast.ctes.map(cte => {\n const name = this.quoteIdentifier(cte.name);\n const cols = cte.columns && cte.columns.length\n ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n const query = this.stripTrailingSemicolon(this.compileSelectAst(cte.query, ctx));\n return `${name}${cols} AS (${query})`;\n }).join(', ');\n return `${prefix}${cteDefs} `;\n }\n\n protected stripTrailingSemicolon(sql: string): string {\n return sql.trim().replace(/;$/, '');\n }\n}\n","import { JsonPathNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * MySQL dialect implementation\n */\nexport class MySqlDialect extends SqlDialectBase {\n /**\n * Creates a new MySqlDialect instance\n */\n public constructor() {\n super();\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 {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // MySQL 5.7+ uses col->'$.path'\n return `${col}->'${node.path}'`;\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode } from '../../ast/query.js';\r\nimport { JsonPathNode } from '../../ast/expression.js';\r\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQL Server bracket 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 SQL Server syntax\r\n * @param node - JSON path node\r\n * @returns SQL Server 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 // SQL Server uses JSON_VALUE(col, '$.path')\r\n return `JSON_VALUE(${col}, '${node.path}')`;\r\n }\r\n\r\n /**\r\n * Formats parameter placeholders using SQL Server named parameter syntax\r\n * @param index - Parameter index\r\n * @returns Named parameter placeholder\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return `@p${index}`;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL Server SQL\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL Server SQL string\r\n */\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const columns = ast.columns.map(c => {\r\n let expr = '';\r\n if (c.type === 'Function') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'Column') {\r\n expr = `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`;\r\n } else if (c.type === 'ScalarSubquery') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'WindowFunction') {\r\n expr = this.compileOperand(c, ctx);\r\n }\r\n\r\n if (c.alias) {\r\n if (c.alias.includes('(')) return c.alias;\r\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\r\n }\r\n return expr;\r\n }).join(', ');\r\n\r\n const distinct = ast.distinct ? 'DISTINCT ' : '';\r\n const from = `${this.quoteIdentifier(ast.from.name)}`;\r\n\r\n const joins = ast.joins.map(j => {\r\n const table = this.quoteIdentifier(j.table.name);\r\n const cond = this.compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n }).join(' ');\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n\r\n const groupBy = ast.groupBy && ast.groupBy.length > 0\r\n ? ' GROUP BY ' + ast.groupBy.map(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`).join(', ')\r\n : '';\r\n\r\n const having = ast.having\r\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\r\n : '';\r\n\r\n const orderBy = ast.orderBy && ast.orderBy.length > 0\r\n ? ' ORDER BY ' + ast.orderBy.map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`).join(', ')\r\n : '';\r\n\r\n let pagination = '';\r\n if (ast.limit || ast.offset) {\r\n const off = ast.offset || 0;\r\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\r\n pagination = `${orderClause} OFFSET ${off} ROWS`;\r\n if (ast.limit) {\r\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\r\n }\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination};`;\r\n }\r\n\r\n const ctes = ast.ctes && ast.ctes.length > 0\r\n ? 'WITH ' + ast.ctes.map(cte => {\r\n // MSSQL does not use RECURSIVE keyword\r\n const name = this.quoteIdentifier(cte.name);\r\n const cols = cte.columns ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})` : '';\r\n const query = this.compileSelectAst(cte.query, ctx).trim().replace(/;$/, '');\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ') + ' '\r\n : '';\r\n\r\n return `${ctes}SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy};`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.into.name);\r\n const columnList = ast.columns.map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`).join(', ');\r\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values};`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.table.name);\r\n const assignments = ast.set.map(assignment => {\r\n const col = assignment.column;\r\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\r\n const value = this.compileOperand(assignment.value, ctx);\r\n return `${target} = ${value}`;\r\n }).join(', ');\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause};`;\r\n }\r\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.from.name);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n return `DELETE FROM ${table}${whereClause};`;\r\n }\r\n}\r\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * SQLite dialect implementation\n */\nexport class SqliteDialect extends SqlDialectBase {\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super();\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQLite 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 SQLite syntax\r\n * @param node - JSON path node\r\n * @returns SQLite JSON path expression\r\n */\r\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\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = returning\n .map(column => {\n const tablePart = column.table ? `${this.quoteIdentifier(column.table)}.` : '';\n return `${tablePart}${this.quoteIdentifier(column.name)}`;\n })\n .join(', ');\n return ` RETURNING ${columns}`;\n }\n}\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * PostgreSQL dialect implementation\n */\nexport class PostgresDialect extends SqlDialectBase {\n /**\n * Creates a new PostgresDialect instance\n */\n public constructor() {\n super();\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 {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // Postgres uses col->>'path' for text extraction\n return `${col}->>'${node.path}'`;\n }\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = returning\n .map(column => {\n const tablePart = column.table ? `${this.quoteIdentifier(column.table)}.` : '';\n return `${tablePart}${this.quoteIdentifier(column.name)}`;\n })\n .join(', ');\n return ` RETURNING ${columns}`;\n }\n}\n","import { SchemaDialect, DialectName, formatLiteral, quoteQualified } from '../schema-generator.js';\nimport { ColumnDef, ForeignKeyReference } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\ntype TableLike = { name: string; schema?: string };\n\n/**\n * Common behavior for schema dialects (DDL).\n * Concrete dialects only override the small surface area instead of reimplementing everything.\n */\nexport abstract class BaseSchemaDialect implements SchemaDialect {\n abstract name: DialectName;\n abstract quoteIdentifier(id: string): string;\n abstract renderColumnType(column: ColumnDef): string;\n abstract renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined;\n abstract renderIndex(table: TableDef, index: IndexDef): string;\n supportsPartialIndexes(): boolean {\n return false;\n }\n formatTableName(table: TableLike): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n renderDefault(value: unknown, _column: ColumnDef): string {\n return formatLiteral(value, this.name);\n }\n renderReference(ref: ForeignKeyReference, _table: TableDef): string {\n const parts = ['REFERENCES', quoteQualified(this, ref.table), `(${this.quoteIdentifier(ref.column)})`];\n if (ref.onDelete) parts.push('ON DELETE', ref.onDelete);\n if (ref.onUpdate) parts.push('ON UPDATE', ref.onUpdate);\n if (ref.deferrable && this.name === 'postgres') parts.push('DEFERRABLE INITIALLY DEFERRED');\n return parts.join(' ');\n }\n renderTableOptions(_table: TableDef): string | undefined {\n return undefined;\n }\n dropTableSql(table: DatabaseTable): string[] {\n return [`DROP TABLE IF EXISTS ${this.formatTableName(table)};`];\n }\n abstract dropColumnSql(table: DatabaseTable, column: string): string[];\n abstract dropIndexSql(table: DatabaseTable, index: string): string[];\n warnDropColumn(_table: DatabaseTable, _column: string): string | undefined {\n return undefined;\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class PostgresSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'postgres';\n\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'integer';\n case 'BIGINT':\n case 'bigint':\n return 'bigint';\n case 'UUID':\n case 'uuid':\n return 'uuid';\n case 'BOOLEAN':\n case 'boolean':\n return 'boolean';\n case 'JSON':\n case 'json':\n return 'jsonb';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `numeric(${column.args[0]}, ${column.args[1] ?? 0})` : 'numeric';\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'double precision';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'timestamptz';\n case 'TIMESTAMP':\n case 'timestamp':\n return 'timestamp';\n case 'DATE':\n case 'date':\n return 'date';\n case 'DATETIME':\n case 'datetime':\n return 'timestamp';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `varchar(${column.args[0]})` : 'varchar';\n case 'TEXT':\n case 'text':\n return 'text';\n case 'ENUM':\n case 'enum':\n return 'text';\n default:\n return String(column.type).toLowerCase();\n }\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n if (!column.autoIncrement) return undefined;\n const strategy = column.generated === 'always' ? 'GENERATED ALWAYS' : 'GENERATED BY DEFAULT';\n return `${strategy} AS IDENTITY`;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n const where = index.where ? ` WHERE ${index.where}` : '';\n return `CREATE ${unique}INDEX IF NOT EXISTS ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols})${where};`;\n }\n\n supportsPartialIndexes(): boolean {\n return true;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n const qualified = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(index)}`\n : this.quoteIdentifier(index);\n return [`DROP INDEX IF EXISTS ${qualified};`];\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral,\n escapeLiteral\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class MySqlSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'mysql';\n\n quoteIdentifier(id: string): string {\n return `\\`${id}\\``;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'INT';\n case 'BIGINT':\n case 'bigint':\n return 'BIGINT';\n case 'UUID':\n case 'uuid':\n return 'CHAR(36)';\n case 'BOOLEAN':\n case 'boolean':\n return 'TINYINT(1)';\n case 'JSON':\n case 'json':\n return 'JSON';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `DECIMAL(${column.args[0]},${column.args[1] ?? 0})` : 'DECIMAL';\n case 'FLOAT':\n case 'float':\n return column.args?.length ? `FLOAT(${column.args[0]})` : 'FLOAT';\n case 'DOUBLE':\n case 'double':\n return 'DOUBLE';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'TIMESTAMP';\n case 'TIMESTAMP':\n case 'timestamp':\n return 'TIMESTAMP';\n case 'DATETIME':\n case 'datetime':\n return 'DATETIME';\n case 'DATE':\n case 'date':\n return 'DATE';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `VARCHAR(${column.args[0]})` : 'VARCHAR(255)';\n case 'TEXT':\n case 'text':\n return 'TEXT';\n case 'ENUM':\n case 'enum':\n return column.args && Array.isArray(column.args) && column.args.length\n ? `ENUM(${column.args.map((v: string) => `'${escapeLiteral(v)}'`).join(',')})`\n : 'ENUM';\n default:\n return String(column.type).toUpperCase();\n }\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n return column.autoIncrement ? 'AUTO_INCREMENT' : undefined;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n if (index.where) {\n throw new Error('MySQL does not support partial/filtered indexes');\n }\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols});`;\n }\n\n renderTableOptions(table: TableDef): string | undefined {\n const parts: string[] = [];\n if (table.engine) parts.push(`ENGINE=${table.engine}`);\n if (table.charset) parts.push(`DEFAULT CHARSET=${table.charset}`);\n if (table.collation) parts.push(`COLLATE=${table.collation}`);\n return parts.length ? parts.join(' ') : undefined;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX ${this.quoteIdentifier(index)} ON ${this.formatTableName(table)};`];\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral,\n resolvePrimaryKey\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class SQLiteSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'sqlite';\n\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n case 'BIGINT':\n case 'bigint':\n return 'INTEGER';\n case 'BOOLEAN':\n case 'boolean':\n return 'INTEGER';\n case 'DECIMAL':\n case 'decimal':\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'REAL';\n case 'DATE':\n case 'date':\n case 'DATETIME':\n case 'datetime':\n case 'TIMESTAMP':\n case 'timestamp':\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'TEXT';\n case 'VARCHAR':\n case 'varchar':\n case 'TEXT':\n case 'text':\n case 'JSON':\n case 'json':\n case 'UUID':\n case 'uuid':\n return 'TEXT';\n case 'ENUM':\n case 'enum':\n return 'TEXT';\n default:\n return 'TEXT';\n }\n }\n\n renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined {\n const pk = resolvePrimaryKey(table);\n if (column.autoIncrement && pk.length === 1 && pk[0] === column.name) {\n return 'PRIMARY KEY AUTOINCREMENT';\n }\n return undefined;\n }\n\n preferInlinePkAutoincrement(column: ColumnDef, table: TableDef, pk: string[]): boolean {\n return !!(column.autoIncrement && pk.length === 1 && pk[0] === column.name);\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n if (index.where) {\n throw new Error('SQLite does not support partial/filtered indexes');\n }\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n return `CREATE ${unique}INDEX IF NOT EXISTS ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols});`;\n }\n\n dropColumnSql(_table: DatabaseTable, _column: string): string[] {\n return [];\n }\n\n dropIndexSql(_table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX IF EXISTS ${this.quoteIdentifier(index)};`];\n }\n\n warnDropColumn(table: DatabaseTable, column: string): string | undefined {\n const key = table.schema ? `${table.schema}.${table.name}` : table.name;\n return `Dropping columns on SQLite requires table rebuild (column ${column} on ${key}).`;\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class MSSqlSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'mssql';\n\n quoteIdentifier(id: string): string {\n return `[${id.replace(/]/g, ']]')}]`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'INT';\n case 'BIGINT':\n case 'bigint':\n return 'BIGINT';\n case 'UUID':\n case 'uuid':\n return 'UNIQUEIDENTIFIER';\n case 'BOOLEAN':\n case 'boolean':\n return 'BIT';\n case 'JSON':\n case 'json':\n return 'NVARCHAR(MAX)';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `DECIMAL(${column.args[0]},${column.args[1] ?? 0})` : 'DECIMAL(18,0)';\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'FLOAT';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n case 'TIMESTAMP':\n case 'timestamp':\n case 'DATETIME':\n case 'datetime':\n return 'DATETIME2';\n case 'DATE':\n case 'date':\n return 'DATE';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `NVARCHAR(${column.args[0]})` : 'NVARCHAR(255)';\n case 'TEXT':\n case 'text':\n return 'NVARCHAR(MAX)';\n case 'ENUM':\n case 'enum':\n return 'NVARCHAR(255)';\n default:\n return String(column.type).toUpperCase();\n }\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n return column.autoIncrement ? 'IDENTITY(1,1)' : undefined;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n const where = index.where ? ` WHERE ${index.where}` : '';\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols})${where};`;\n }\n\n supportsPartialIndexes(): boolean {\n return true;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX ${this.quoteIdentifier(index)} ON ${this.formatTableName(table)};`];\n }\n}\n","import { ColumnDef, ForeignKeyReference, RawDefaultValue } from '../../schema/column.js';\nimport { IndexDef, IndexColumn, TableDef } from '../../schema/table.js';\nimport { DatabaseTable } from './schema-types.js';\nexport { BaseSchemaDialect } from './dialects/base-schema-dialect.js';\nexport {\n PostgresSchemaDialect,\n MySqlSchemaDialect,\n SQLiteSchemaDialect,\n MSSqlSchemaDialect\n} from './dialects/index.js';\n\nexport type DialectName = 'postgres' | 'mysql' | 'sqlite' | 'mssql';\n\nexport interface SchemaDialect {\n name: DialectName;\n quoteIdentifier(id: string): string;\n formatTableName(table: TableDef | DatabaseTable): string;\n renderColumnType(column: ColumnDef): string;\n renderDefault(value: unknown, column: ColumnDef): string;\n renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined;\n renderReference(ref: ForeignKeyReference, table: TableDef): string;\n renderIndex(table: TableDef, index: IndexDef): string;\n renderTableOptions(table: TableDef): string | undefined;\n supportsPartialIndexes(): boolean;\n preferInlinePkAutoincrement?(column: ColumnDef, table: TableDef, pk: string[]): boolean;\n dropColumnSql(table: DatabaseTable, column: string): string[];\n dropIndexSql(table: DatabaseTable, index: string): string[];\n dropTableSql(table: DatabaseTable): string[];\n warnDropColumn?(table: DatabaseTable, column: string): string | undefined;\n}\n\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\nexport const escapeLiteral = (value: string): string => value.replace(/'/g, \"''\");\n\nconst isRawDefault = (value: unknown): value is RawDefaultValue => {\n return !!value && typeof value === 'object' && 'raw' in (value as any) && typeof (value as any).raw === 'string';\n};\n\nexport const formatLiteral = (value: unknown, dialect: DialectName): string => {\n if (isRawDefault(value)) return value.raw;\n if (value === null) return 'NULL';\n if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL';\n if (typeof value === 'boolean') {\n if (dialect === 'mysql' || dialect === 'sqlite' || dialect === 'mssql') {\n return value ? '1' : '0';\n }\n return value ? 'TRUE' : 'FALSE';\n }\n if (value instanceof Date) return `'${escapeLiteral(value.toISOString())}'`;\n if (typeof value === 'string') return `'${escapeLiteral(value)}'`;\n return `'${escapeLiteral(JSON.stringify(value))}'`;\n};\n\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\n if (table.primaryKey && table.primaryKey.length > 0) {\n return table.primaryKey;\n }\n const cols = Object.values(table.columns);\n return cols.filter(c => c.primary).map(c => c.name);\n};\n\nexport const quoteQualified = (dialect: SchemaDialect, identifier: string): string => {\n if (identifier.includes('.')) {\n return identifier\n .split('.')\n .map(part => dialect.quoteIdentifier(part))\n .join('.');\n }\n return dialect.quoteIdentifier(identifier);\n};\n\nexport const renderIndexColumns = (dialect: SchemaDialect, columns: (string | IndexColumn)[]) => {\n return columns\n .map(col => {\n if (typeof col === 'string') return dialect.quoteIdentifier(col);\n const parts = [dialect.quoteIdentifier(col.column)];\n if (col.order) parts.push(col.order);\n if (col.nulls) parts.push(`NULLS ${col.nulls}`);\n return parts.join(' ');\n })\n .join(', ');\n};\n\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\n const base = (index.columns || [])\n .map(col => (typeof col === 'string' ? col : col.column))\n .join('_');\n const suffix = index.unique ? 'uniq' : 'idx';\n return `${table.name}_${base}_${suffix}`;\n};\n\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\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\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\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","import { TableDef } from '../../schema/table.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\nimport {\n SchemaDialect,\n deriveIndexName,\n generateCreateTableSql,\n renderColumnDefinition\n} from './schema-generator.js';\nimport { DatabaseSchema, DatabaseTable } from './schema-types.js';\n\nexport type SchemaChangeKind =\n | 'createTable'\n | 'dropTable'\n | 'addColumn'\n | 'dropColumn'\n | 'alterColumn'\n | 'addIndex'\n | 'dropIndex';\n\nexport interface SchemaChange {\n kind: SchemaChangeKind;\n table: string;\n description: string;\n statements: string[];\n safe: boolean;\n}\n\nexport interface SchemaPlan {\n changes: SchemaChange[];\n warnings: string[];\n}\n\nexport interface SchemaDiffOptions {\n /** Allow destructive operations (drops) */\n allowDestructive?: boolean;\n}\n\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\n\nconst mapTables = (schema: DatabaseSchema) => {\n const map = new Map<string, DatabaseTable>();\n for (const table of schema.tables) {\n map.set(tableKey(table.name, table.schema), table);\n }\n return map;\n};\n\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\n const column = table.columns[colName];\n const rendered = renderColumnDefinition(table, column, dialect);\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\n};\n\nexport const diffSchema = (\n expectedTables: TableDef[],\n actualSchema: DatabaseSchema,\n dialect: SchemaDialect,\n options: SchemaDiffOptions = {}\n): SchemaPlan => {\n const allowDestructive = options.allowDestructive ?? false;\n const plan: SchemaPlan = { changes: [], warnings: [] };\n\n const actualMap = mapTables(actualSchema);\n\n // Create missing tables and indexes\n for (const table of expectedTables) {\n const key = tableKey(table.name, table.schema);\n const actual = actualMap.get(key);\n if (!actual) {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n plan.changes.push({\n kind: 'createTable',\n table: key,\n description: `Create table ${key}`,\n statements: [tableSql, ...indexSql],\n safe: true\n });\n continue;\n }\n\n // Columns\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\n for (const colName of Object.keys(table.columns)) {\n if (!actualCols.has(colName)) {\n plan.changes.push({\n kind: 'addColumn',\n table: key,\n description: `Add column ${colName} to ${key}`,\n statements: [buildAddColumnSql(table, colName, dialect)],\n safe: true\n });\n }\n }\n for (const colName of actualCols.keys()) {\n if (!table.columns[colName]) {\n plan.changes.push({\n kind: 'dropColumn',\n table: key,\n description: `Drop column ${colName} from ${key}`,\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\n safe: false\n });\n const warning = dialect.warnDropColumn?.(actual, colName);\n if (warning) plan.warnings.push(warning);\n }\n }\n\n // Indexes (naive: based on name or derived name)\n const expectedIndexes = table.indexes ?? [];\n const actualIndexes = actual.indexes ?? [];\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\n\n for (const idx of expectedIndexes) {\n const name = idx.name || deriveIndexName(table, idx);\n if (!actualIndexMap.has(name)) {\n plan.changes.push({\n kind: 'addIndex',\n table: key,\n description: `Create index ${name} on ${key}`,\n statements: [dialect.renderIndex(table, { ...idx, name })],\n safe: true\n });\n }\n }\n\n for (const idx of actualIndexes) {\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\n plan.changes.push({\n kind: 'dropIndex',\n table: key,\n description: `Drop index ${idx.name} on ${key}`,\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\n safe: false\n });\n }\n }\n }\n\n // Extra tables\n for (const actual of actualSchema.tables) {\n const key = tableKey(actual.name, actual.schema);\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\n plan.changes.push({\n kind: 'dropTable',\n table: key,\n description: `Drop table ${key}`,\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\n safe: false\n });\n }\n }\n\n return plan;\n};\n\nexport interface SynchronizeOptions extends SchemaDiffOptions {\n dryRun?: boolean;\n}\n\nexport const synchronizeSchema = async (\n expectedTables: TableDef[],\n actualSchema: DatabaseSchema,\n dialect: SchemaDialect,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<SchemaPlan> => {\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\n if (options.dryRun) return plan;\n\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 return plan;\n};\n","import { DbExecutor, QueryResult } from '../../orm/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\nexport const toRows = (result: QueryResult | undefined): Record<string, any>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, any>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, any>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\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 { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const postgresIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema || 'public';\n const tables: DatabaseTable[] = [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default\n FROM information_schema.columns\n WHERE table_schema = $1\n ORDER BY table_name, ordinal_position\n `,\n [schema]\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT\n ns.nspname AS table_schema,\n tbl.relname AS table_name,\n array_agg(att.attname ORDER BY arr.idx) AS pk_columns\n FROM pg_index i\n JOIN pg_class tbl ON tbl.oid = i.indrelid\n JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\n JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS arr(attnum, idx) ON TRUE\n LEFT JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\n WHERE i.indisprimary AND ns.nspname = $1\n GROUP BY ns.nspname, tbl.relname\n `,\n [schema]\n );\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n pkMap.set(`${r.table_schema}.${r.table_name}`, r.pk_columns || []);\n });\n\n const fkRows = await queryRows(\n executor,\n `\n SELECT\n tc.table_schema,\n tc.table_name,\n kcu.column_name,\n ccu.table_schema AS foreign_table_schema,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name,\n rc.update_rule AS on_update,\n rc.delete_rule AS on_delete\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema\n JOIN information_schema.referential_constraints rc\n ON rc.constraint_name = tc.constraint_name AND rc.constraint_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = $1\n `,\n [schema]\n );\n\n const fkMap = new Map<string, any[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n fkMap.set(key, [{\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\n column: r.foreign_column_name,\n onDelete: r.on_delete?.toUpperCase(),\n onUpdate: r.on_update?.toUpperCase()\n }]);\n });\n\n const indexRows = await queryRows(\n executor,\n `\n SELECT\n ns.nspname AS table_schema,\n tbl.relname AS table_name,\n idx.relname AS index_name,\n i.indisunique AS is_unique,\n pg_get_expr(i.indpred, i.indrelid) AS predicate,\n array_agg(att.attname ORDER BY arr.idx) AS column_names\n FROM pg_index i\n JOIN pg_class tbl ON tbl.oid = i.indrelid\n JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\n JOIN pg_class idx ON idx.oid = i.indexrelid\n JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS arr(attnum, idx) ON TRUE\n LEFT JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\n WHERE ns.nspname = $1 AND NOT i.indisprimary\n GROUP BY ns.nspname, tbl.relname, idx.relname, i.indisunique, i.indpred\n `,\n [schema]\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)) {\n return;\n }\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 });\n }\n const cols = tablesByKey.get(key)!;\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n references: fk\n ? {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate\n }\n : undefined\n };\n cols.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 idx: DatabaseIndex = {\n name: r.index_name,\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\n unique: !!r.is_unique,\n where: r.predicate || undefined\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n tables.push(...tablesByKey.values());\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const mysqlIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const filterClause = schema ? 'table_schema = ?' : 'table_schema = database()';\n const params = schema ? [schema] : [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default, extra\n FROM information_schema.columns\n WHERE ${filterClause}\n ORDER BY table_name, ordinal_position\n `,\n params\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name\n FROM information_schema.key_column_usage\n WHERE constraint_name = 'PRIMARY' AND ${filterClause}\n ORDER BY ordinal_position\n `,\n params\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 indexRows = await queryRows(\n executor,\n `\n SELECT\n table_schema,\n table_name,\n index_name,\n non_unique,\n GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols\n FROM information_schema.statistics\n WHERE ${filterClause} AND index_name <> 'PRIMARY'\n GROUP BY table_schema, table_name, index_name, non_unique\n `,\n params\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 });\n }\n const cols = tablesByKey.get(key)!;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment')\n };\n cols.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: string) => ({ 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 { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nconst escapeSingleQuotes = (name: string) => name.replace(/'/g, \"''\");\n\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const tables: DatabaseTable[] = [];\n const tableRows = await queryRows(\n executor,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';`\n );\n\n for (const row of tableRows) {\n const name = row.name as string;\n if (!shouldIncludeTable(name, options)) continue;\n const table: DatabaseTable = { name, columns: [], primaryKey: [], indexes: [] };\n\n const cols = await queryRows(executor, `PRAGMA table_info('${escapeSingleQuotes(name)}');`);\n cols.forEach(c => {\n table.columns.push({\n name: c.name,\n type: c.type,\n notNull: c.notnull === 1,\n default: c.dflt_value ?? undefined,\n autoIncrement: false\n });\n if (c.pk && c.pk > 0) {\n table.primaryKey = table.primaryKey || [];\n table.primaryKey.push(c.name);\n }\n });\n\n const fkRows = await queryRows(executor, `PRAGMA foreign_key_list('${escapeSingleQuotes(name)}');`);\n fkRows.forEach(fk => {\n const col = table.columns.find(c => c.name === fk.from);\n if (col) {\n col.references = {\n table: fk.table,\n column: fk.to,\n onDelete: fk.on_delete?.toUpperCase(),\n onUpdate: fk.on_update?.toUpperCase()\n };\n }\n });\n\n const idxList = await queryRows(executor, `PRAGMA index_list('${escapeSingleQuotes(name)}');`);\n for (const idx of idxList) {\n const idxName = idx.name as string;\n const columnsInfo = await queryRows(executor, `PRAGMA index_info('${escapeSingleQuotes(idxName)}');`);\n const idxEntry: DatabaseIndex = {\n name: idxName,\n columns: columnsInfo.map(ci => ({ column: ci.name as string })),\n unique: idx.unique === 1\n };\n table.indexes!.push(idxEntry);\n }\n\n tables.push(table);\n }\n\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const mssqlIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const filterSchema = schema ? 'sch.name = @p1' : '1=1';\n const params = schema ? [schema] : [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n c.name AS column_name,\n ty.name AS data_type,\n c.is_nullable,\n c.is_identity,\n object_definition(c.default_object_id) AS column_default\n FROM sys.columns c\n JOIN sys.tables t ON t.object_id = c.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n WHERE t.is_ms_shipped = 0 AND ${filterSchema}\n `,\n params\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.indexes i\n JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 1 AND ${filterSchema}\n ORDER BY ic.key_ordinal\n `,\n params\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 indexRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n i.name AS index_name,\n i.is_unique,\n i.has_filter,\n i.filter_definition\n FROM sys.indexes i\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 0 AND i.is_hypothetical = 0 AND ${filterSchema}\n `,\n params\n );\n\n const indexColsRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n i.name AS index_name,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.index_columns ic\n JOIN sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 0 AND ${filterSchema}\n ORDER BY ic.key_ordinal\n `,\n params\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 });\n }\n const t = 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 t.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\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import { DialectName } from './schema-generator.js';\nimport { DatabaseSchema } from './schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\nimport type { IntrospectOptions, SchemaIntrospector } from './introspect/types.js';\nimport { postgresIntrospector } from './introspect/postgres.js';\nimport { mysqlIntrospector } from './introspect/mysql.js';\nimport { sqliteIntrospector } from './introspect/sqlite.js';\nimport { mssqlIntrospector } from './introspect/mssql.js';\n\nconst INTROSPECTORS: Record<DialectName, SchemaIntrospector> = {\n postgres: postgresIntrospector,\n mysql: mysqlIntrospector,\n sqlite: sqliteIntrospector,\n mssql: mssqlIntrospector\n};\n\n/**\n * Introspects an existing database schema using the dialect-specific strategy.\n */\nexport const introspectSchema = async (\n executor: DbExecutor,\n dialect: DialectName,\n options: IntrospectOptions = {}\n): Promise<DatabaseSchema> => {\n const handler = INTROSPECTORS[dialect];\n if (!handler) {\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\n }\n return handler.introspect(executor, options);\n};\n\nexport type { IntrospectOptions, SchemaIntrospector };\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\r\n * @typeParam T - Type of the stored data\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback with the specified store value\r\n * @param store - Value to store during callback execution\r\n * @param callback - Function to execute with the store value\r\n * @returns Result of the callback function\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 * Gets the currently stored value\r\n * @returns Current store value or undefined if none exists\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 { 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 ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\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\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\nconst capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\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\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\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?.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 => !(hydration && isRelationAlias((col as any).alias)))\r\n .map(col => {\r\n const key = (col as any).alias || (col as any).name;\r\n const operand = col as OperandNode;\r\n return `${key}: ${this.printOperand(operand)}`;\r\n });\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(${capitalize(ast.from.name)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${capitalize(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n if (join.relationName && hydratedRelations.has(join.relationName)) {\r\n return;\r\n }\r\n\r\n if (join.relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${join.relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${join.relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = capitalize(join.table.name);\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(c => `${capitalize(c.table)}.${c.name}`).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 lines.push(`.orderBy(${capitalize(o.column.table)}.${o.column.name}, '${o.direction}')`);\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 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 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 /**\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 /**\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 values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n const fn = this.mapOp(inExpr.operator);\r\n return `${fn}(${left}, [${values}])`;\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 `${capitalize(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(${capitalize(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 => `${capitalize(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.map(o => `${capitalize(o.column.table)}.${o.column.name} ${o.direction}`).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 /**\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 { HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\nexport type DomainEventHandler<Context> = (event: any, ctx: Context) => Promise<void> | void;\r\n\r\nexport class DomainEventBus<Context> {\r\n private readonly handlers = new Map<string, DomainEventHandler<Context>[]>();\r\n\r\n constructor(initialHandlers?: Record<string, DomainEventHandler<Context>[]>) {\r\n const handlers = initialHandlers ?? {};\r\n Object.entries(handlers).forEach(([name, list]) => {\r\n this.handlers.set(name, [...list]);\r\n });\r\n }\r\n\r\n register(name: string, handler: DomainEventHandler<Context>): void {\r\n const existing = this.handlers.get(name) ?? [];\r\n existing.push(handler);\r\n this.handlers.set(name, existing);\r\n }\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;\r\n if (!entity.domainEvents || !entity.domainEvents.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const eventName = this.getEventName(event);\r\n const handlers = this.handlers.get(eventName);\r\n if (!handlers) 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 private getEventName(event: any): string {\r\n if (!event) return 'Unknown';\r\n if (typeof event === 'string') return event;\r\n return event.constructor?.name ?? 'Unknown';\r\n }\r\n}\r\n\r\nexport const addDomainEvent = (entity: HasDomainEvents, event: any): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\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 getEntity(table: TableDef, pk: string | number): any | 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 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 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 private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\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 } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from './db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\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 registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\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.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 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, 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, relation);\r\n }\r\n }\r\n\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\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, 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 private assignHasManyForeignKey(child: any, 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 private detachHasManyChild(child: any, 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 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 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 private resolvePrimaryKeyValue(entity: any, 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;\r\n }\r\n}\r\n","import type { DbExecutor } from './db-executor.js';\r\n\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.beginTransaction) {\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 { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\nexport enum EntityStatus {\r\n New = 'new',\r\n Managed = 'managed',\r\n Dirty = 'dirty',\r\n Removed = 'removed',\r\n Detached = 'detached'\r\n}\r\n\r\nexport interface TrackedEntity {\r\n table: TableDef;\r\n entity: any;\r\n pk: string | number | null;\r\n status: EntityStatus;\r\n original: Record<string, any> | null;\r\n}\r\n\r\nexport type RelationKey = string;\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\nexport interface RelationChangeEntry {\r\n root: any;\r\n relationKey: RelationKey;\r\n rootTable: TableDef;\r\n relationName: string;\r\n relation: RelationDef;\r\n change: RelationChange<any>;\r\n}\r\n\r\nexport interface HasDomainEvents {\r\n domainEvents?: any[];\r\n}\r\n","import { 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 } from './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\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<any, TrackedEntity>();\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 get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n findTracked(entity: any): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): 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)\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 trackNew(table: TableDef, entity: any, 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 trackManaged(table: TableDef, pk: string | number, entity: any): 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)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n markDirty(entity: any): 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 markRemoved(entity: any): 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 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 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);\r\n const builder = new InsertQueryBuilder(tracked.table).values(payload);\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\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 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 const builder = new UpdateQueryBuilder(tracked.table)\r\n .set(changes)\r\n .where(eq(pkColumn, tracked.pk));\r\n\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\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 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() as any, tracked.entity);\r\n }\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 private extractColumns(table: TableDef, entity: any): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n private async executeCompiled(compiled: CompiledQuery): Promise<void> {\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\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 private createSnapshot(table: TableDef, entity: any): Record<string, any> {\r\n const snapshot: Record<string, any> = {};\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 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 { Dialect } from '../core/dialect/abstract.js';\r\nimport type { RelationDef } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from './db-executor.js';\r\nimport { DomainEventBus, DomainEventHandler as DomainEventHandlerFn, addDomainEvent } from './domain-event-bus.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { RelationChangeProcessor } from './relation-change-processor.js';\r\nimport { runInTransaction } from './transaction-runner.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\nimport {\r\n EntityStatus,\r\n HasDomainEvents,\r\n RelationChange,\r\n RelationChangeEntry,\r\n RelationKey,\r\n TrackedEntity\r\n} from './runtime-types.js';\r\n\r\nexport interface OrmInterceptor {\r\n beforeFlush?(ctx: OrmContext): Promise<void> | void;\r\n afterFlush?(ctx: OrmContext): Promise<void> | void;\r\n}\r\n\r\nexport type DomainEventHandler = DomainEventHandlerFn<OrmContext>;\r\n\r\nexport interface OrmContextOptions {\r\n dialect: Dialect;\r\n executor: DbExecutor;\r\n interceptors?: OrmInterceptor[];\r\n domainEventHandlers?: Record<string, DomainEventHandler[]>;\r\n}\r\n\r\nexport class OrmContext {\r\n private readonly identityMap = new IdentityMap();\r\n private readonly unitOfWork: UnitOfWork;\r\n private readonly relationChanges: RelationChangeProcessor;\r\n private readonly interceptors: OrmInterceptor[];\r\n private readonly domainEvents: DomainEventBus<OrmContext>;\r\n\r\n constructor(private readonly options: OrmContextOptions) {\r\n this.interceptors = [...(options.interceptors ?? [])];\r\n this.unitOfWork = new UnitOfWork(\r\n options.dialect,\r\n options.executor,\r\n this.identityMap,\r\n () => this\r\n );\r\n this.relationChanges = new RelationChangeProcessor(\r\n this.unitOfWork,\r\n options.dialect,\r\n options.executor\r\n );\r\n this.domainEvents = new DomainEventBus<OrmContext>(options.domainEventHandlers);\r\n }\r\n\r\n get dialect(): Dialect {\r\n return this.options.dialect;\r\n }\r\n\r\n get executor(): DbExecutor {\r\n return this.options.executor;\r\n }\r\n\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.unitOfWork.identityBuckets;\r\n }\r\n\r\n get tracked(): TrackedEntity[] {\r\n return this.unitOfWork.getTracked();\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.unitOfWork.getEntity(table, pk);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): void {\r\n this.unitOfWork.setEntity(table, pk, entity);\r\n }\r\n\r\n trackNew(table: TableDef, entity: any, pk?: string | number): void {\r\n this.unitOfWork.trackNew(table, entity, pk);\r\n }\r\n\r\n trackManaged(table: TableDef, pk: string | number, entity: any): void {\r\n this.unitOfWork.trackManaged(table, pk, entity);\r\n }\r\n\r\n markDirty(entity: any): void {\r\n this.unitOfWork.markDirty(entity);\r\n }\r\n\r\n markRemoved(entity: any): void {\r\n this.unitOfWork.markRemoved(entity);\r\n }\r\n\r\n registerRelationChange(\r\n root: any,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<any>\r\n ): void {\r\n const entry: RelationChangeEntry = {\r\n root,\r\n relationKey,\r\n rootTable,\r\n relationName,\r\n relation,\r\n change\r\n };\r\n this.relationChanges.registerChange(entry);\r\n }\r\n\r\n registerInterceptor(interceptor: OrmInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n registerDomainEventHandler(name: string, handler: DomainEventHandler): void {\r\n this.domainEvents.register(name, handler);\r\n }\r\n\r\n async saveChanges(): Promise<void> {\r\n await runInTransaction(this.executor, async () => {\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 await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.unitOfWork.getEntitiesForTable(table);\r\n }\r\n}\r\n\r\nexport { addDomainEvent };\r\nexport { EntityStatus };\r\nexport type {\r\n QueryResult,\r\n DbExecutor,\r\n RelationKey,\r\n RelationChange,\r\n HasDomainEvents\r\n};\r\n"],"mappings":"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","names":["col","col","col","col","col","col","col","state","hydration","relationSelectionResult","col","col","toKey","toKey","toKey","toKey","toKey","hasMany","belongsTo","col","col","col","col","col","col","col","col","col","col","assertNever","col","EntityStatus"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schema/table.ts","../src/schema/column.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/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/query-builder/select-query-state.ts","../src/core/ast/join-node.ts","../src/core/sql/sql.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/core/ast/builders.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/query-builder/relation-service.ts","../src/query-builder/select-query-builder-deps.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.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/select.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/dialect/abstract.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/postgres/index.ts","../src/core/ddl/dialects/base-schema-dialect.ts","../src/core/ddl/dialects/postgres-schema-dialect.ts","../src/core/ddl/dialects/mysql-schema-dialect.ts","../src/core/ddl/dialects/sqlite-schema-dialect.ts","../src/core/ddl/dialects/mssql-schema-dialect.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/schema-introspect.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/typescript.ts","../src/orm/domain-event-bus.ts","../src/orm/identity-map.ts","../src/orm/relation-change-processor.ts","../src/orm/transaction-runner.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/query-logger.ts","../src/orm/orm-context.ts"],"sourcesContent":["\r\nexport * from './schema/table.js';\r\nexport * from './schema/column.js';\r\nexport * from './schema/relation.js';\r\nexport * from './schema/types.js';\r\nexport * from './query-builder/select.js';\nexport * from './query-builder/insert.js';\nexport * from './query-builder/update.js';\nexport * from './query-builder/delete.js';\nexport * from './core/ast/expression.js';\nexport * from './core/dialect/mysql/index.js';\nexport * from './core/dialect/mssql/index.js';\nexport * from './core/dialect/sqlite/index.js';\nexport * from './core/dialect/postgres/index.js';\nexport * from './core/ddl/schema-generator.js';\nexport * from './core/ddl/schema-types.js';\nexport * from './core/ddl/schema-diff.js';\nexport * from './core/ddl/schema-introspect.js';\nexport * from './orm/als.js';\nexport * from './orm/hydration.js';\nexport * from './codegen/typescript.js';\nexport * from './orm/orm-context.js';\nexport * from './orm/entity.js';\nexport * from './orm/lazy-batch.js';\r\nexport * from './orm/relations/has-many.js';\r\nexport * from './orm/relations/belongs-to.js';\r\nexport * from './orm/relations/many-to-many.js';\r\nexport * from './orm/execute.js';\r\n","import { ColumnDef } from './column.js';\nimport { RelationDef } from './relation.js';\n\nexport interface IndexColumn {\n column: string;\n order?: 'ASC' | 'DESC';\n nulls?: 'FIRST' | 'LAST';\n}\n\nexport interface IndexDef {\n name?: string;\n columns: (string | IndexColumn)[];\n unique?: boolean;\n where?: string;\n}\n\nexport interface CheckConstraint {\n name?: string;\n expression: string;\n}\n\nexport interface TableOptions {\n schema?: string;\n primaryKey?: string[];\n indexes?: IndexDef[];\n checks?: CheckConstraint[];\n comment?: string;\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\nexport interface TableHooks {\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: any): 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>> {\n /** Name of the table */\n name: string;\n /** Optional schema/catalog name */\n schema?: string;\n /** Record of column definitions keyed by column name */\n columns: T;\n /** Record of relationship definitions keyed by relation name */\n relations: Record<string, RelationDef>;\n /** Optional lifecycle hooks */\n hooks?: TableHooks;\n /** Composite primary key definition (falls back to column.primary flags) */\n primaryKey?: string[];\n /** Secondary indexes */\n indexes?: IndexDef[];\n /** Table-level check constraints */\n checks?: CheckConstraint[];\n /** Table comment/description */\n comment?: string;\n /** Dialect-specific options */\n engine?: string;\n charset?: string;\n collation?: string;\n}\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>>(\n name: string,\n columns: T,\n relations: Record<string, RelationDef> = {},\n hooks?: TableHooks,\n options: TableOptions = {}\n): TableDef<T> => {\n // Runtime mutability to assign names to column definitions for convenience\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\n (acc as any)[key] = { ...def, name: key, table: name };\n return acc;\n }, {} as T);\n\n return {\n name,\n schema: options.schema,\n columns: colsWithNames,\n relations,\n hooks,\n primaryKey: options.primaryKey,\n indexes: options.indexes,\n checks: options.checks,\n comment: options.comment,\n engine: options.engine,\n charset: options.charset,\n collation: options.collation\n };\n};\n","/**\r\n * Supported column data types for database schema definitions\r\n */\r\nexport type ColumnType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'VARCHAR'\n | 'TEXT'\n | 'JSON'\n | 'ENUM'\n | 'DECIMAL'\n | 'FLOAT'\n | 'DOUBLE'\n | 'UUID'\n | 'DATE'\n | 'DATETIME'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'BOOLEAN'\n | 'int'\n | 'integer'\n | 'bigint'\n | 'varchar'\n | 'text'\n | 'json'\n | 'enum'\n | 'decimal'\n | 'float'\n | 'double'\n | 'uuid'\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'timestamptz'\n | 'boolean';\n\nexport type ReferentialAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\nexport interface RawDefaultValue {\n raw: string;\n}\n\nexport type DefaultValue = unknown | RawDefaultValue;\n\nexport interface ForeignKeyReference {\n /** Target table name */\n table: string;\n /** Target column name */\n column: string;\n /** Optional constraint name */\n name?: string;\n /** ON DELETE action */\n onDelete?: ReferentialAction;\n /** ON UPDATE action */\n onUpdate?: ReferentialAction;\n /** Whether the constraint is deferrable (Postgres) */\n deferrable?: boolean;\n}\n\n/**\n * Definition of a database column\n */\nexport interface ColumnDef<T extends ColumnType = ColumnType> {\n /** Column name (filled at runtime by defineTable) */\n name: string;\n /** Data type of the column */\n type: T;\n /** Whether this column is a primary key */\n primary?: boolean;\n /** Whether this column cannot be null */\n notNull?: boolean;\n /** Whether this column must be unique (or name of the unique constraint) */\n unique?: boolean | string;\n /** Default value for the column */\n default?: DefaultValue;\n /** Whether the column auto-increments / identity */\n autoIncrement?: boolean;\n /** Identity strategy where supported */\n generated?: 'always' | 'byDefault';\n /** Inline check constraint expression */\n check?: string;\n /** Foreign key reference */\n references?: ForeignKeyReference;\n /** Column comment/description */\n comment?: string;\n /** Additional arguments for the column type (e.g., VARCHAR length) */\n args?: any[];\n /** Table name this column belongs to (filled at runtime by defineTable) */\n table?: string;\n}\n\n/**\r\n * Factory for creating column definitions with common data types\r\n */\r\nexport const col = {\n /**\n * Creates an integer column definition\n * @returns ColumnDef with INT type\n */\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\n\n /**\n * Creates a big integer column definition\n */\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\n\n /**\n * Creates a variable character column definition\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 fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\n type: 'DECIMAL',\n args: [precision, scale]\n }),\n\n /**\n * Creates a floating point column definition\n */\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\n name: '',\n type: 'FLOAT',\n args: precision !== undefined ? [precision] : undefined\n }),\n\n /**\n * Creates a UUID column definition\n */\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\n\n /**\n * Creates a timestamp column definition\n */\n timestamp: (): ColumnDef<'TIMESTAMP'> => ({ name: '', type: 'TIMESTAMP' }),\n\n /**\n * Creates a timestamptz column definition\n */\n timestamptz: (): ColumnDef<'TIMESTAMPTZ'> => ({ name: '', type: 'TIMESTAMPTZ' }),\n\n /**\n * Creates a date column definition\n */\n date: (): ColumnDef<'DATE'> => ({ name: '', type: 'DATE' }),\n\n /**\n * Creates a datetime column definition\n */\n datetime: (): ColumnDef<'DATETIME'> => ({ name: '', type: 'DATETIME' }),\n\n /**\n * Creates a JSON column definition\n * @returns ColumnDef with JSON type\n */\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\n\r\n /**\n * Creates a boolean column definition\n * @returns ColumnDef with BOOLEAN type\n */\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\n\n /**\n * Creates an enum column definition\n * @param values - Enum values\n */\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\n\n /**\n * Marks a column definition as a primary key\n * @param def - Column definition to modify\n * @returns Modified ColumnDef with primary: true\n */\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, primary: true }),\n\n /**\n * Marks a column as NOT NULL\n */\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, notNull: true }),\n\n /**\n * Marks a column as UNIQUE\n */\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\n ({\n ...def,\n unique: name ?? true\n }),\n\n /**\n * Sets a default value for the column\n */\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\n ({\n ...def,\n default: value\n }),\n\n /**\n * Sets a raw SQL default value for the column\n */\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n default: { raw: expression }\n }),\n\n /**\n * Marks a column as auto-increment / identity\n */\n autoIncrement: <T extends ColumnType>(\n def: ColumnDef<T>,\n strategy: ColumnDef['generated'] = 'byDefault'\n ): ColumnDef<T> =>\n ({\n ...def,\n autoIncrement: true,\n generated: strategy\n }),\n\n /**\n * Adds a foreign key reference\n */\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\n ({\n ...def,\n references: ref\n }),\n\n /**\n * Adds a check constraint to the column\n */\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n check: expression\n })\n};\n","import { 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-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 * 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 | 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 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 { ColumnDef } from '../../schema/column.js';\r\nimport type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.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 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}\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 /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional alias for the function result */\r\n alias?: string;\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\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 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 * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(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 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: OperandNode[];\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","import { ColumnDef } from '../../schema/column.js';\r\nimport { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\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: unknown): OperandNode => {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean'\r\n ) {\r\n return { type: 'Literal', value: value === undefined ? null : value } as LiteralNode;\r\n }\r\n return value as OperandNode;\r\n};\r\n\r\nconst toNode = (col: ColumnDef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnDef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst toOperand = (val: OperandNode | ColumnDef | string | number | boolean | null): OperandNode => {\r\n if (val === null) return { type: 'Literal', value: null };\r\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\r\n return { type: 'Literal', value: val };\r\n }\r\n return toNode(val as OperandNode | ColumnDef);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnDef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(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 | ColumnDef, right: OperandNode | ColumnDef | string | number): 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 | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number\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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, right: OperandNode | ColumnDef | 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 | ColumnDef, 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 | ColumnDef, 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 | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(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 | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnDef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\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 | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\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 | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(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 | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | 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 | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\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: ColumnDef | 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 | ColumnDef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnDef | 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 * 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","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\nimport { OrderDirection } from '../sql/sql.js';\r\nimport { OrderByNode } from './query.js';\r\n\r\nconst buildWindowFunction = (\r\n name: string,\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: ColumnNode[],\r\n orderBy?: OrderByNode[]\r\n): WindowFunctionNode => {\r\n const node: WindowFunctionNode = {\r\n type: 'WindowFunction',\r\n name,\r\n args\r\n };\r\n\r\n if (partitionBy && partitionBy.length) {\r\n node.partitionBy = partitionBy;\r\n }\r\n\r\n if (orderBy && orderBy.length) {\r\n node.orderBy = orderBy;\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates a ROW_NUMBER window function\r\n * @returns Window function node for ROW_NUMBER\r\n */\r\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\r\n\r\n/**\r\n * Creates a RANK window function\r\n * @returns Window function node for RANK\r\n */\r\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\r\n\r\n/**\r\n * Creates a DENSE_RANK window function\r\n * @returns Window function node for DENSE_RANK\r\n */\r\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\r\n\r\n/**\r\n * Creates an NTILE window function\r\n * @param n - Number of buckets\r\n * @returns Window function node for NTILE\r\n */\r\nexport const ntile = (n: number): WindowFunctionNode =>\r\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\r\n\r\n/**\r\n * Creates a LAG window function\r\n * @param col - Column to lag\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\r\n * @returns Window function node for LAG\r\n */\r\nexport const lag = (col: ColumnDef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\r\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\r\n columnOperand(col),\r\n { type: 'Literal', value: offset }\r\n ];\r\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LAG', args);\r\n};\r\n\r\n/**\r\n * Creates a LEAD window function\r\n * @param col - Column to lead\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\r\n * @returns Window function node for LEAD\r\n */\r\nexport const lead = (col: ColumnDef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\r\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\r\n columnOperand(col),\r\n { type: 'Literal', value: offset }\r\n ];\r\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LEAD', args);\r\n};\r\n\r\n/**\r\n * Creates a FIRST_VALUE window function\r\n * @param col - Column to get first value from\r\n * @returns Window function node for FIRST_VALUE\r\n */\r\nexport const firstValue = (col: ColumnDef | ColumnNode): WindowFunctionNode =>\r\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\r\n\r\n/**\r\n * Creates a LAST_VALUE window function\r\n * @param col - Column to get last value from\r\n * @returns Window function node for LAST_VALUE\r\n */\r\nexport const lastValue = (col: ColumnDef | ColumnNode): WindowFunctionNode =>\r\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\r\n\r\n/**\r\n * Creates a custom window function\r\n * @param name - Window function name\r\n * @param args - Function arguments\r\n * @param partitionBy - Optional PARTITION BY columns\r\n * @param orderBy - Optional ORDER BY clauses\r\n * @returns Window function node\r\n */\r\nexport const windowFunction = (\r\n name: string,\r\n args: (ColumnDef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: (ColumnDef | ColumnNode)[],\r\n orderBy?: { column: ColumnDef | ColumnNode; direction: OrderDirection }[]\r\n): WindowFunctionNode => {\r\n const nodeArgs = args.map(arg => {\r\n if (typeof (arg as LiteralNode).value !== 'undefined') {\r\n return arg as LiteralNode;\r\n }\r\n if ('path' in arg) {\r\n return arg as JsonPathNode;\r\n }\r\n return columnOperand(arg as ColumnDef | ColumnNode);\r\n });\r\n\r\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\r\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\r\n type: 'OrderBy',\r\n column: columnOperand(o.column),\r\n direction: o.direction\r\n }));\r\n\r\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\r\n};\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, FunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\n\r\nconst buildAggregate = (name: string) => (col: ColumnDef | ColumnNode): FunctionNode => ({\r\n type: 'Function',\r\n name,\r\n args: [columnOperand(col)]\r\n});\r\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\r\n * @returns Function node with SUM\r\n */\r\nexport const sum = buildAggregate('SUM');\r\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\r\n */\r\nexport const avg = buildAggregate('AVG');\r\n","import {\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ExpressionNode,\r\n OperandNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Visitor for expression nodes\r\n */\r\nexport interface ExpressionVisitor<R> {\r\n visitBinaryExpression(node: BinaryExpressionNode): R;\r\n visitLogicalExpression(node: LogicalExpressionNode): R;\r\n visitNullExpression(node: NullExpressionNode): R;\r\n visitInExpression(node: InExpressionNode): R;\r\n visitExistsExpression(node: ExistsExpressionNode): R;\r\n visitBetweenExpression(node: BetweenExpressionNode): R;\r\n}\r\n\r\n/**\r\n * Visitor for operand nodes\r\n */\r\nexport interface OperandVisitor<R> {\r\n visitColumn(node: ColumnNode): R;\r\n visitLiteral(node: LiteralNode): R;\r\n visitFunction(node: FunctionNode): R;\r\n visitJsonPath(node: JsonPathNode): R;\r\n visitScalarSubquery(node: ScalarSubqueryNode): R;\r\n visitCaseExpression(node: CaseExpressionNode): R;\r\n visitWindowFunction(node: WindowFunctionNode): R;\r\n}\r\n\r\nconst unsupportedExpression = (node: ExpressionNode): never => {\r\n throw new Error(`Unsupported expression type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n\r\nconst unsupportedOperand = (node: OperandNode): never => {\r\n throw new Error(`Unsupported operand type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n/**\r\n * Dispatches an expression node to the visitor\r\n * @param node - Expression node to visit\r\n * @param visitor - Visitor implementation\r\n */\r\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\r\n switch (node.type) {\r\n case 'BinaryExpression':\r\n return visitor.visitBinaryExpression(node);\r\n case 'LogicalExpression':\r\n return visitor.visitLogicalExpression(node);\r\n case 'NullExpression':\r\n return visitor.visitNullExpression(node);\r\n case 'InExpression':\r\n return visitor.visitInExpression(node);\r\n case 'ExistsExpression':\r\n return visitor.visitExistsExpression(node);\r\n case 'BetweenExpression':\r\n return visitor.visitBetweenExpression(node);\r\n default:\r\n return unsupportedExpression(node);\r\n }\r\n};\r\n\r\n/**\r\n * Dispatches an operand node to the visitor\r\n * @param node - Operand node to visit\r\n * @param visitor - Visitor implementation\r\n */\r\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\r\n switch (node.type) {\r\n case 'Column':\r\n return visitor.visitColumn(node);\r\n case 'Literal':\r\n return visitor.visitLiteral(node);\r\n case 'Function':\r\n return visitor.visitFunction(node);\r\n case 'JsonPath':\r\n return visitor.visitJsonPath(node);\r\n case 'ScalarSubquery':\r\n return visitor.visitScalarSubquery(node);\r\n case 'CaseExpression':\r\n return visitor.visitCaseExpression(node);\r\n case 'WindowFunction':\r\n return visitor.visitWindowFunction(node);\r\n default:\r\n return unsupportedOperand(node);\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n joins: [...(this.ast.joins ?? []), join]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\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';\r\nimport { ExpressionNode } from './expression.js';\r\nimport { JoinKind } from '../sql/sql.js';\r\n\r\n/**\r\n * Creates a JoinNode ready for AST insertion.\r\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\r\n */\r\nexport const createJoinNode = (\r\n kind: JoinKind,\r\n tableName: string,\r\n condition: ExpressionNode,\r\n relationName?: string\r\n): JoinNode => ({\r\n type: 'Join',\r\n kind,\r\n table: { type: 'Table', name: tableName },\r\n condition,\r\n relationName\r\n});\r\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 = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\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 { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, HydrationPlan, OrderByNode, SelectQueryNode } from '../core/ast/query.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\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\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\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\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 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 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 private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const alias = (col as any).alias ?? (col as any).name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\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 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 // Only rewrite when ordering by root columns; child columns would reintroduce the pagination bug.\n if (ob.column.table !== plan.rootTable) {\n return null;\n }\n\n const alias = projectionAliases.get(`${ob.column.table}.${ob.column.name}`) ?? ob.column.name;\n if (!availableColumns.has(alias)) {\n return null;\n }\n\n mapped.push({\n type: 'OrderBy',\n column: { type: 'Column', table: baseAlias, name: alias },\n direction: ob.direction\n });\n }\n\n return mapped;\n }\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 if (!columns.some(col => col.name === ob.column.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: ob.column.name,\n alias: ob.column.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 */\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 */\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 */\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 */\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/ast/query.js';\r\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: {\r\n const localKey = rel.localKey || findPrimaryKey(this.table);\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.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 { ColumnDef } from '../../schema/column.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { ColumnNode } from './expression-nodes.js';\r\nimport { TableNode } from './query.js';\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: TableDef, column: ColumnDef | ColumnNode): ColumnNode => {\r\n if ((column as ColumnNode).type === 'Column') {\r\n return column as ColumnNode;\r\n }\r\n\r\n const def = column as ColumnDef;\r\n return {\r\n type: 'Column',\r\n table: def.table || table.name,\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: TableDef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: 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: TableDef): TableNode => ({\r\n type: 'Table',\r\n name: table.name\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\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 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';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, SetOperationKind, SetOperationNode } from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\r\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\r\n ): ColumnSelectionResult {\r\n const existingAliases = new Set(\r\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\r\n );\r\n\r\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\r\n if (existingAliases.has(alias)) return acc;\r\n\r\n if (isExpressionSelectionNode(val)) {\r\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\r\n return acc;\r\n }\r\n\r\n const colDef = val as ColumnDef;\r\n acc.push({\r\n type: 'Column',\r\n table: colDef.table || this.table.name,\r\n name: colDef.name,\r\n alias\r\n } as ColumnNode);\r\n return acc;\r\n }, []);\r\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\r\n const newCols = cols.map(col => parseRawColumn(col, this.table.name, this.state.ast.ctes));\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\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 for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\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\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withGroupBy([node]);\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\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 Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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","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): ExpressionNode => {\r\n const defaultLocalKey =\r\n relation.type === RelationKinds.HasMany\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 return eq(\r\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\r\n { type: 'Column', table: root.name, 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: root.name, 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 */\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): JoinNode[] => {\r\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: root.name, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\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 relation.target.name,\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 * @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): ExpressionNode => {\r\n const base = baseRelationCondition(root, relation);\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 * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n return baseRelationCondition(root, relation);\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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 { 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.table.name, 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 => j.relationName === 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 ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const correlation = buildRelationCorrelation(this.table, relation);\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 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 );\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);\r\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\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\r\nexport type { RelationResult } from './relation-projection-helper.js';\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\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\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\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 };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.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 {\r\n const nodes = columns.map(col => buildColumnNode(this.env.table, col));\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.withDistinct(nodes);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\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(context: SelectQueryBuilderContext, relationName: string, ast: SelectQueryNode): SelectQueryNode {\r\n return this.createService(context).applyRelationCorrelation(relationName, ast);\r\n }\r\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 { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.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 * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\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: any, relationName: string): Set<any> => {\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<any>();\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 const bucket = parent[rel.name] as any[];\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, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\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] = [];\r\n }\r\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\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 any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\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 { OrmContext } from './orm-context.js';\r\nimport { RelationMap } from '../schema/types.js';\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\nexport interface EntityMeta<TTable extends TableDef> {\r\n ctx: OrmContext;\r\n table: TTable;\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n relationCache: Map<string, Promise<any>>;\r\n relationHydration: Map<string, Map<string, any>>;\r\n relationWrappers: Map<string, unknown>;\r\n}\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, any>[] | 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\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | 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;\r\n};\r\n\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>[];\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\n private loaded = false;\n private items: TChild[] = [];\n private readonly added = new Set<TChild>();\n private readonly removed = new Set<TChild>();\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TChild,\r\n private readonly localKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\n this.hydrateFromCache();\n }\n\n async load(): Promise<TChild[]> {\n if (this.loaded) return this.items;\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 => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\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 attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[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 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 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 {\n const keyValue = this.root[this.localKey];\n if (keyValue === undefined || keyValue === null) return;\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\n if (!rows?.length) return;\n this.items = rows.map(row => this.createEntity(row));\n this.loaded = true;\n }\n\n toJSON(): TChild[] {\n return this.items;\n }\n}\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>;\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\n private loaded = false;\n private current: TParent | null = null;\n\n constructor(\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TParent,\n private readonly targetKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\n this.populateFromHydrationCache();\n }\n\n async load(): Promise<TParent | null> {\n if (this.loaded) return this.current;\n const map = await this.loader();\r\n const fkValue = this.root[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[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, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[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 {\n const fkValue = this.root[this.relation.foreignKey];\n if (fkValue === undefined || fkValue === null) return;\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\n if (!row) return;\n this.current = this.createEntity(row);\n this.loaded = true;\n }\n\n toJSON(): TParent | null {\n return this.current;\n }\n}\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.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, any>[];\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\n private loaded = false;\n private items: TTarget[] = [];\n\n constructor(\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\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, any>) => TTarget,\n private readonly localKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\n this.hydrateFromCache();\n }\n\n async load(): Promise<TTarget[]> {\n if (this.loaded) return this.items;\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 any)._pivot) {\r\n (entity as any)._pivot = row._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 getItems(): TTarget[] {\r\n return this.items;\r\n }\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) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\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 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 async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\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, any> = {\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 any)[this.targetKey] ?? 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 {\n const keyValue = this.root[this.localKey];\n if (keyValue === undefined || keyValue === null) return;\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\n if (!rows?.length) return;\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\n });\n this.loaded = true;\n }\n\n toJSON(): TTarget[] {\n return this.items;\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { OrmContext, QueryResult } from './orm-context.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\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\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, any> = {};\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 executeQuery = async (ctx: OrmContext, qb: SelectQueryBuilder<any, TableDef<any>>): 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\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: OrmContext,\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 = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\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 qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: OrmContext,\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 = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\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 targetSelect = selectAllColumns(relation.target);\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 targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\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","import { TableDef } from '../schema/table.js';\r\nimport { Entity, RelationMap, HasManyCollection, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\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\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): Entity<TTable> => {\r\n const target: Record<string, any> = { ...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 let proxy: Entity<TTable>;\r\n const handler: ProxyHandler<any> = {\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, relationName as string, proxy);\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, prop, proxy);\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(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as Entity<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <TTable extends TableDef>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): Entity<TTable> => {\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;\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;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n const populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\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 (!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, any>>();\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 getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\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 as any, 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\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\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, any>) => 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, any>) => 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, any>) => 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 { Entity } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\nimport { OrmContext } from './orm-context.js';\nimport { SelectQueryBuilder } from '../query-builder/select.js';\nimport { createEntityFromRow, createEntityProxy } from './entity.js';\n\r\ntype Row = Record<string, any>;\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\nexport async function executeHydrated<TTable extends TableDef>(\n ctx: OrmContext,\n qb: SelectQueryBuilder<any, TTable>\n): Promise<Entity<TTable>[]> {\n const ast = qb.getAST();\n const compiled = ctx.dialect.compileSelect(ast);\n const executed = await ctx.executor.executeSql(compiled.sql, compiled.params);\n const rows = flattenResults(executed);\n\n // Set-operation queries cannot be reliably hydrated and should not collapse duplicates.\n if (ast.setOps && ast.setOps.length > 0) {\n return rows.map(row =>\n createEntityProxy(ctx, qb.getTable(), row, qb.getLazyRelations())\n );\n }\n\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\n return hydrated.map(row =>\n createEntityFromRow(ctx, qb.getTable(), row, qb.getLazyRelations())\n );\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, HydrationPlan, SetOperationKind } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n LiteralNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n exists,\r\n notExists\r\n} from '../core/ast/expression.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\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 { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { Entity, RelationMap } from '../schema/types.js';\r\nimport { OrmContext } from '../orm/orm-context.js';\r\nimport { executeHydrated } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\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 = any, 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 = new ColumnSelector(this.env);\r\n this.relationManager = new RelationManager(this.env);\r\n }\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 private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\r\n return typeof (query as any).getAST === 'function'\r\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\r\n : (query as SelectQueryNode);\r\n }\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 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 private applyJoin(\n context: SelectQueryBuilderContext,\n table: TableDef,\n condition: BinaryExpressionNode,\n kind: JoinKind\n ): SelectQueryBuilderContext {\n const joinNode = createJoinNode(kind, table.name, condition);\n return this.applyAst(context, service => service.withJoin(joinNode));\n }\n\n private applySetOperation(\n operator: SetOperationKind,\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\n ): SelectQueryBuilderContext {\n const subAst = this.resolveQueryNode(query);\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\n }\n\r\n /**\r\n * Selects specific columns for the query\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n * @returns New query builder instance with selected columns\r\n */\r\n select(columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.select(this.context, columns));\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(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(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(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(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 * 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(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = this.resolveQueryNode(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\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(relationName: string, predicate?: ExpressionNode): 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(\r\n relationName: string,\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(relationName: string, options?: RelationIncludeOptions): 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 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 getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n async execute(ctx: OrmContext): Promise<Entity<TTable>[]> {\r\n return executeHydrated(ctx, 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 col - Column definition or column node to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\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 * Adds an ORDER BY clause to the query\r\n * @param col - Column definition or column node to order by\r\n * @param direction - Order direction (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\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> {\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\n return this.clone(nextContext);\n }\n\n /**\n * Combines this query with another using UNION\n * @param query - Query to union with\n * @returns New query builder instance with the set operation\n */\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('UNION', query));\n }\n\n /**\n * Combines this query with another using UNION ALL\n * @param query - Query to union with\n * @returns New query builder instance with the set operation\n */\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('UNION ALL', query));\n }\n\n /**\n * Combines this query with another using INTERSECT\n * @param query - Query to intersect with\n * @returns New query builder instance with the set operation\n */\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('INTERSECT', query));\n }\n\n /**\n * Combines this query with another using EXCEPT\n * @param query - Query to subtract\n * @returns New query builder instance with the set operation\n */\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('EXCEPT', query));\n }\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(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(exists(subAst));\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(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(notExists(subAst));\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(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\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 let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\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);\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(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\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 let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\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);\r\n return this.where(notExists(finalSubAst));\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: Dialect): CompiledQuery {\r\n return dialect.compileSelect(this.context.state.ast);\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: Dialect): 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/**\r\n * Creates a column node for use in expressions\r\n * @param table - Table name\r\n * @param name - Column name\r\n * @returns ColumnNode with the specified table and name\r\n */\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n/**\r\n * Creates a literal value node for use in expressions\r\n * @param val - Literal value (string or number)\r\n * @returns LiteralNode with the specified value\r\n */\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n","import { TableDef } from '../schema/table.js';\r\nimport { InsertQueryNode, TableNode } from '../core/ast/query.js';\r\nimport { ColumnNode, OperandNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { buildColumnNodes, createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for building INSERT queries\r\n */\r\nexport class InsertQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: InsertQueryNode;\r\n\r\n constructor(table: TableDef, ast?: InsertQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'InsertQuery',\r\n into: createTableNode(table),\r\n columns: [],\r\n values: []\r\n };\r\n }\r\n\r\n private clone(nextAst: InsertQueryNode): InsertQueryState {\r\n return new InsertQueryState(this.table, nextAst);\r\n }\r\n\r\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\r\n if (!rows.length) return this;\r\n\r\n const definedColumns = this.ast.columns.length\r\n ? this.ast.columns\r\n : buildColumnNodes(this.table, Object.keys(rows[0]));\r\n\r\n const newRows: OperandNode[][] = rows.map(row =>\r\n definedColumns.map(column => valueToOperand(row[column.name]))\r\n );\r\n\r\n return this.clone({\r\n ...this.ast,\r\n columns: definedColumns,\r\n values: [...this.ast.values, ...newRows]\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): InsertQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler } from '../core/dialect/abstract.js';\r\nimport { InsertQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 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 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 compile(compiler: InsertCompiler): CompiledQuery {\r\n return compiler.compileInsert(this.state.ast);\r\n }\r\n\r\n toSql(compiler: InsertCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { TableNode, UpdateQueryNode, UpdateAssignmentNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Immutable state for UPDATE queries\r\n */\r\nexport class UpdateQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: UpdateQueryNode;\r\n\r\n constructor(table: TableDef, ast?: UpdateQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'UpdateQuery',\r\n table: createTableNode(table),\r\n set: []\r\n };\r\n }\r\n\r\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\r\n return new UpdateQueryState(this.table, nextAst);\r\n }\r\n\r\n withSet(values: Record<string, unknown>): UpdateQueryState {\r\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, value]) => ({\r\n column: {\r\n type: 'Column',\r\n table: this.table.name,\r\n name: column\r\n },\r\n value: valueToOperand(value)\r\n }));\r\n\r\n return this.clone({\r\n ...this.ast,\r\n set: assignments\r\n });\r\n }\r\n\r\n withWhere(expr: ExpressionNode): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, UpdateCompiler } from '../core/dialect/abstract.js';\r\nimport { UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\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 compile(compiler: UpdateCompiler): CompiledQuery {\r\n return compiler.compileUpdate(this.state.ast);\r\n }\r\n\r\n toSql(compiler: UpdateCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { TableNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for DELETE queries\r\n */\r\nexport class DeleteQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: DeleteQueryNode;\r\n\r\n constructor(table: TableDef, ast?: DeleteQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'DeleteQuery',\r\n from: createTableNode(table)\r\n };\r\n }\r\n\r\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\r\n return new DeleteQueryState(this.table, nextAst);\r\n }\r\n\r\n withWhere(expr: ExpressionNode): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, DeleteCompiler } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\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 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 where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\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 compile(compiler: DeleteCompiler): CompiledQuery {\r\n return compiler.compileDelete(this.state.ast);\r\n }\r\n\r\n toSql(compiler: DeleteCompiler): string {\r\n return this.compile(compiler).sql;\r\n }\r\n\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import {\n SelectQueryNode,\n InsertQueryNode,\n UpdateQueryNode,\n DeleteQueryNode,\n SetOperationKind,\n CommonTableExpressionNode\n} from '../ast/query.js';\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 WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\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\n implements SelectCompiler, InsertCompiler, UpdateCompiler, DeleteCompiler\n{\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 {\n const ctx = this.createCompilerContext();\n const normalized = this.normalizeSelectAst(ast);\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\n return {\n sql,\n params: [...ctx.params]\n };\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 {\n const ctx = this.createCompilerContext();\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\n }\n\n supportsReturning(): boolean {\n return false;\n }\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;\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 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\n */\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\n const normalized = this.normalizeSelectAst(ast);\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\n\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\n if (normalized.setOps && normalized.setOps.length > 0) {\n return `SELECT 1 FROM (${full}) AS _exists`;\n }\n\n const upper = full.toUpperCase();\n const fromIndex = upper.indexOf(' FROM ');\n if (fromIndex === -1) {\n return full;\n }\n\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 {\n return '?';\n }\n\n /**\n * Whether the current dialect supports a given set operation.\n * Override in concrete dialects to restrict support.\n */\n protected supportsSetOperation(kind: SetOperationKind): boolean {\n return true;\n }\n\n /**\n * Validates set-operation semantics:\n * - Ensures the dialect supports requested operators.\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\n * @param ast - Query to validate\n * @param isOutermost - Whether this node is the outermost compound query\n */\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\n }\n\n if (hasSetOps) {\n for (const op of ast.setOps!) {\n if (!this.supportsSetOperation(op.operator)) {\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\n }\n this.validateSetOperations(op.query, false);\n }\n }\n }\n\n /**\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\n * @param ast - Query AST\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\n */\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\n let hoisted: CommonTableExpressionNode[] = [];\n\n const normalizedSetOps = ast.setOps?.map(op => {\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\n const childCtes = child.ctes ?? [];\n if (childCtes.length) {\n hoisted = hoisted.concat(childCtes);\n }\n hoisted = hoisted.concat(childHoisted);\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\n return { ...op, query: queryWithoutCtes };\n });\n\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\n return { normalized, hoistedCtes: hoisted };\n }\n\n /**\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\n * @param ast - Query AST\n * @returns Normalized query AST\n */\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\n this.validateSetOperations(ast, true);\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\n }\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\n protected constructor() {\n this.expressionCompilers = new Map();\n this.operandCompilers = new Map();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\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 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 const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\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\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) => {\r\n const args = fnNode.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n return `${fnNode.name}(${args})`;\r\n });\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => this.compileJsonPath(path));\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('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 `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`\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\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\n\n/**\n * Shared SQL compiler for dialects with standard LIMIT/OFFSET pagination.\n * Concrete dialects override only the minimal hooks (identifier quoting,\n * JSON path, placeholders, RETURNING support) instead of re-implementing\n * the entire compile pipeline.\n */\nexport abstract class SqlDialectBase extends Dialect {\n /**\n * Quotes an identifier (dialect-specific).\n */\n abstract quoteIdentifier(id: string): string;\n\n /**\n * Compiles SELECT query AST to SQL using common rules.\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 // When set operations exist, omit ORDER BY/OFFSET/LIMIT from the operands and apply at the end.\n const baseAst: SelectQueryNode = hasSetOps\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\n : ast;\n\n const baseSelect = this.compileSelectCore(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);\n const pagination = this.compilePagination(ast, orderBy);\n\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\n return `${ctes}${combined}${orderBy}${pagination}`;\n }\n\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\n const table = this.compileTableName(ast.into);\n const columnList = ast.columns\n .map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`)\n .join(', ');\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\n const returning = this.compileReturning(ast.returning, ctx);\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\n }\n\n /**\n * Compiles a single SELECT (no set operations, no CTE prefix).\n */\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = this.compileSelectColumns(ast, ctx);\n const from = this.compileFrom(ast.from);\n const joins = this.compileJoins(ast, ctx);\n const whereClause = this.compileWhere(ast.where, ctx);\n const groupBy = this.compileGroupBy(ast);\n const having = this.compileHaving(ast, ctx);\n const orderBy = this.compileOrderBy(ast);\n const pagination = this.compilePagination(ast, orderBy);\n\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 table = this.compileTableName(ast.table);\n const assignments = ast.set.map(assignment => {\n const col = assignment.column;\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n }).join(', ');\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\n }\n\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n const table = this.compileTableName(ast.from);\n const whereClause = this.compileWhere(ast.where, ctx);\n const returning = this.compileReturning(ast.returning, ctx);\n return `DELETE FROM ${table}${whereClause}${returning}`;\n }\n\n /**\n * Default RETURNING compilation: no support.\n */\n protected compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n throw new Error('RETURNING is not supported by this dialect.');\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const tablePart = column.table ? `${this.quoteIdentifier(column.table)}.` : '';\n const aliasPart = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${tablePart}${this.quoteIdentifier(column.name)}${aliasPart}`;\n })\n .join(', ');\n }\n\n /**\n * DISTINCT clause. Override for DISTINCT ON support.\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']): string {\n const base = this.compileTableName(ast);\n return ast.alias ? `${base} AS ${this.quoteIdentifier(ast.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: 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 compileJoins(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.joins || ast.joins.length === 0) return '';\n const parts = ast.joins.map(j => {\n const table = this.compileFrom(j.table);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n });\n return ` ${parts.join(' ')}`;\n }\n\n protected compileGroupBy(ast: SelectQueryNode): string {\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\n const cols = ast.groupBy\n .map(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`)\n .join(', ');\n return ` GROUP BY ${cols}`;\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 compileOrderBy(ast: SelectQueryNode): string {\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\n const parts = ast.orderBy\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\n .join(', ');\n return ` ORDER BY ${parts}`;\n }\n\n /**\n * Default LIMIT/OFFSET pagination clause.\n */\n protected compilePagination(ast: SelectQueryNode, _orderByClause: string): string {\n const parts: string[] = [];\n if (ast.limit !== undefined) parts.push(`LIMIT ${ast.limit}`);\n if (ast.offset !== undefined) parts.push(`OFFSET ${ast.offset}`);\n return parts.length ? ` ${parts.join(' ')}` : '';\n }\n\n protected compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\n if (!ast.ctes || ast.ctes.length === 0) return '';\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\n const cteDefs = ast.ctes.map(cte => {\n const name = this.quoteIdentifier(cte.name);\n const cols = cte.columns && cte.columns.length\n ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n const query = this.stripTrailingSemicolon(this.compileSelectAst(this.normalizeSelectAst(cte.query), ctx));\n return `${name}${cols} AS (${query})`;\n }).join(', ');\n return `${prefix}${cteDefs} `;\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","import { JsonPathNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * MySQL dialect implementation\n */\nexport class MySqlDialect extends SqlDialectBase {\n /**\n * Creates a new MySqlDialect instance\n */\n public constructor() {\n super();\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 {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // MySQL 5.7+ uses col->'$.path'\n return `${col}->'${node.path}'`;\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode } from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQL Server bracket 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 SQL Server syntax\r\n * @param node - JSON path node\r\n * @returns SQL Server 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 // SQL Server uses JSON_VALUE(col, '$.path')\r\n return `JSON_VALUE(${col}, '${node.path}')`;\r\n }\r\n\r\n /**\r\n * Formats parameter placeholders using SQL Server named parameter syntax\r\n * @param index - Parameter index\r\n * @returns Named parameter placeholder\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return `@p${index}`;\r\n }\r\n\r\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.compileSelectCore(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);\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\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.into.name);\r\n const columnList = ast.columns.map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`).join(', ');\r\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values};`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.table.name);\r\n const assignments = ast.set.map(assignment => {\r\n const col = assignment.column;\r\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\r\n const value = this.compileOperand(assignment.value, ctx);\r\n return `${target} = ${value}`;\r\n }).join(', ');\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause};`;\r\n }\r\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n const table = this.quoteIdentifier(ast.from.name);\n const whereClause = this.compileWhere(ast.where, ctx);\n return `DELETE FROM ${table}${whereClause};`;\n }\n\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = ast.columns.map(c => {\n let expr = '';\n if (c.type === 'Function') {\n expr = this.compileOperand(c, ctx);\n } else if (c.type === 'Column') {\n expr = `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`;\n } else if (c.type === 'ScalarSubquery') {\n expr = this.compileOperand(c, ctx);\n } else if (c.type === 'WindowFunction') {\n expr = this.compileOperand(c, ctx);\n }\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.quoteIdentifier(ast.from.name)}`;\n\n const joins = ast.joins.map(j => {\n const table = this.quoteIdentifier(j.table.name);\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(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`).join(', ')\n : '';\n\n const having = ast.having\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\n : '';\n\n const orderBy = this.compileOrderBy(ast);\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): string {\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\n return ' ORDER BY ' + ast.orderBy\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\n .join(', ');\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 private wrapSetOperand(sql: string): string {\n const trimmed = sql.trim().replace(/;$/, '');\n return `(${trimmed})`;\n }\n}\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * SQLite dialect implementation\n */\nexport class SqliteDialect extends SqlDialectBase {\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super();\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQLite 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 SQLite syntax\r\n * @param node - JSON path node\r\n * @returns SQLite JSON path expression\r\n */\r\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\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n supportsReturning(): boolean {\n return true;\n }\n}\n","import { CompilerContext } from '../abstract.js';\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\nimport { SqlDialectBase } from '../base/sql-dialect.js';\n\n/**\n * PostgreSQL dialect implementation\n */\nexport class PostgresDialect extends SqlDialectBase {\n /**\n * Creates a new PostgresDialect instance\n */\n public constructor() {\n super();\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 {\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\n // Postgres uses col->>'path' for text extraction\n return `${col}->>'${node.path}'`;\n }\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n supportsReturning(): boolean {\n return true;\n }\n}\n","import { SchemaDialect, DialectName, formatLiteral, quoteQualified } from '../schema-generator.js';\nimport { ColumnDef, ForeignKeyReference } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\ntype TableLike = { name: string; schema?: string };\n\n/**\n * Common behavior for schema dialects (DDL).\n * Concrete dialects only override the small surface area instead of reimplementing everything.\n */\nexport abstract class BaseSchemaDialect implements SchemaDialect {\n abstract name: DialectName;\n abstract quoteIdentifier(id: string): string;\n abstract renderColumnType(column: ColumnDef): string;\n abstract renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined;\n abstract renderIndex(table: TableDef, index: IndexDef): string;\n supportsPartialIndexes(): boolean {\n return false;\n }\n formatTableName(table: TableLike): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n renderDefault(value: unknown, _column: ColumnDef): string {\n return formatLiteral(value, this.name);\n }\n renderReference(ref: ForeignKeyReference, _table: TableDef): string {\n const parts = ['REFERENCES', quoteQualified(this, ref.table), `(${this.quoteIdentifier(ref.column)})`];\n if (ref.onDelete) parts.push('ON DELETE', ref.onDelete);\n if (ref.onUpdate) parts.push('ON UPDATE', ref.onUpdate);\n if (ref.deferrable && this.name === 'postgres') parts.push('DEFERRABLE INITIALLY DEFERRED');\n return parts.join(' ');\n }\n renderTableOptions(_table: TableDef): string | undefined {\n return undefined;\n }\n dropTableSql(table: DatabaseTable): string[] {\n return [`DROP TABLE IF EXISTS ${this.formatTableName(table)};`];\n }\n abstract dropColumnSql(table: DatabaseTable, column: string): string[];\n abstract dropIndexSql(table: DatabaseTable, index: string): string[];\n warnDropColumn(_table: DatabaseTable, _column: string): string | undefined {\n return undefined;\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class PostgresSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'postgres';\n\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'integer';\n case 'BIGINT':\n case 'bigint':\n return 'bigint';\n case 'UUID':\n case 'uuid':\n return 'uuid';\n case 'BOOLEAN':\n case 'boolean':\n return 'boolean';\n case 'JSON':\n case 'json':\n return 'jsonb';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `numeric(${column.args[0]}, ${column.args[1] ?? 0})` : 'numeric';\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'double precision';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'timestamptz';\n case 'TIMESTAMP':\n case 'timestamp':\n return 'timestamp';\n case 'DATE':\n case 'date':\n return 'date';\n case 'DATETIME':\n case 'datetime':\n return 'timestamp';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `varchar(${column.args[0]})` : 'varchar';\n case 'TEXT':\n case 'text':\n return 'text';\n case 'ENUM':\n case 'enum':\n return 'text';\n default:\n return String(column.type).toLowerCase();\n }\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n if (!column.autoIncrement) return undefined;\n const strategy = column.generated === 'always' ? 'GENERATED ALWAYS' : 'GENERATED BY DEFAULT';\n return `${strategy} AS IDENTITY`;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n const where = index.where ? ` WHERE ${index.where}` : '';\n return `CREATE ${unique}INDEX IF NOT EXISTS ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols})${where};`;\n }\n\n supportsPartialIndexes(): boolean {\n return true;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n const qualified = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(index)}`\n : this.quoteIdentifier(index);\n return [`DROP INDEX IF EXISTS ${qualified};`];\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral,\n escapeLiteral\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class MySqlSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'mysql';\n\n quoteIdentifier(id: string): string {\n return `\\`${id}\\``;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'INT';\n case 'BIGINT':\n case 'bigint':\n return 'BIGINT';\n case 'UUID':\n case 'uuid':\n return 'CHAR(36)';\n case 'BOOLEAN':\n case 'boolean':\n return 'TINYINT(1)';\n case 'JSON':\n case 'json':\n return 'JSON';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `DECIMAL(${column.args[0]},${column.args[1] ?? 0})` : 'DECIMAL';\n case 'FLOAT':\n case 'float':\n return column.args?.length ? `FLOAT(${column.args[0]})` : 'FLOAT';\n case 'DOUBLE':\n case 'double':\n return 'DOUBLE';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'TIMESTAMP';\n case 'TIMESTAMP':\n case 'timestamp':\n return 'TIMESTAMP';\n case 'DATETIME':\n case 'datetime':\n return 'DATETIME';\n case 'DATE':\n case 'date':\n return 'DATE';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `VARCHAR(${column.args[0]})` : 'VARCHAR(255)';\n case 'TEXT':\n case 'text':\n return 'TEXT';\n case 'ENUM':\n case 'enum':\n return column.args && Array.isArray(column.args) && column.args.length\n ? `ENUM(${column.args.map((v: string) => `'${escapeLiteral(v)}'`).join(',')})`\n : 'ENUM';\n default:\n return String(column.type).toUpperCase();\n }\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n return column.autoIncrement ? 'AUTO_INCREMENT' : undefined;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n if (index.where) {\n throw new Error('MySQL does not support partial/filtered indexes');\n }\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols});`;\n }\n\n renderTableOptions(table: TableDef): string | undefined {\n const parts: string[] = [];\n if (table.engine) parts.push(`ENGINE=${table.engine}`);\n if (table.charset) parts.push(`DEFAULT CHARSET=${table.charset}`);\n if (table.collation) parts.push(`COLLATE=${table.collation}`);\n return parts.length ? parts.join(' ') : undefined;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX ${this.quoteIdentifier(index)} ON ${this.formatTableName(table)};`];\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral,\n resolvePrimaryKey\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class SQLiteSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'sqlite';\n\n quoteIdentifier(id: string): string {\n return `\"${id}\"`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n case 'BIGINT':\n case 'bigint':\n return 'INTEGER';\n case 'BOOLEAN':\n case 'boolean':\n return 'INTEGER';\n case 'DECIMAL':\n case 'decimal':\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'REAL';\n case 'DATE':\n case 'date':\n case 'DATETIME':\n case 'datetime':\n case 'TIMESTAMP':\n case 'timestamp':\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n return 'TEXT';\n case 'VARCHAR':\n case 'varchar':\n case 'TEXT':\n case 'text':\n case 'JSON':\n case 'json':\n case 'UUID':\n case 'uuid':\n return 'TEXT';\n case 'ENUM':\n case 'enum':\n return 'TEXT';\n default:\n return 'TEXT';\n }\n }\n\n renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined {\n const pk = resolvePrimaryKey(table);\n if (column.autoIncrement && pk.length === 1 && pk[0] === column.name) {\n return 'PRIMARY KEY AUTOINCREMENT';\n }\n return undefined;\n }\n\n preferInlinePkAutoincrement(column: ColumnDef, table: TableDef, pk: string[]): boolean {\n return !!(column.autoIncrement && pk.length === 1 && pk[0] === column.name);\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n if (index.where) {\n throw new Error('SQLite does not support partial/filtered indexes');\n }\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n return `CREATE ${unique}INDEX IF NOT EXISTS ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols});`;\n }\n\n dropColumnSql(_table: DatabaseTable, _column: string): string[] {\n return [];\n }\n\n dropIndexSql(_table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX IF EXISTS ${this.quoteIdentifier(index)};`];\n }\n\n warnDropColumn(table: DatabaseTable, column: string): string | undefined {\n const key = table.schema ? `${table.schema}.${table.name}` : table.name;\n return `Dropping columns on SQLite requires table rebuild (column ${column} on ${key}).`;\n }\n}\n","import { BaseSchemaDialect } from './base-schema-dialect.js';\nimport {\n deriveIndexName,\n renderIndexColumns,\n DialectName,\n formatLiteral\n} from '../schema-generator.js';\nimport { ColumnDef } from '../../../schema/column.js';\nimport { IndexDef, TableDef } from '../../../schema/table.js';\nimport { DatabaseTable } from '../schema-types.js';\n\nexport class MSSqlSchemaDialect extends BaseSchemaDialect {\n name: DialectName = 'mssql';\n\n quoteIdentifier(id: string): string {\n return `[${id.replace(/]/g, ']]')}]`;\n }\n\n renderColumnType(column: ColumnDef): string {\n switch (column.type) {\n case 'INT':\n case 'INTEGER':\n case 'int':\n case 'integer':\n return 'INT';\n case 'BIGINT':\n case 'bigint':\n return 'BIGINT';\n case 'UUID':\n case 'uuid':\n return 'UNIQUEIDENTIFIER';\n case 'BOOLEAN':\n case 'boolean':\n return 'BIT';\n case 'JSON':\n case 'json':\n return 'NVARCHAR(MAX)';\n case 'DECIMAL':\n case 'decimal':\n return column.args?.length ? `DECIMAL(${column.args[0]},${column.args[1] ?? 0})` : 'DECIMAL(18,0)';\n case 'FLOAT':\n case 'float':\n case 'DOUBLE':\n case 'double':\n return 'FLOAT';\n case 'TIMESTAMPTZ':\n case 'timestamptz':\n case 'TIMESTAMP':\n case 'timestamp':\n case 'DATETIME':\n case 'datetime':\n return 'DATETIME2';\n case 'DATE':\n case 'date':\n return 'DATE';\n case 'VARCHAR':\n case 'varchar':\n return column.args?.length ? `NVARCHAR(${column.args[0]})` : 'NVARCHAR(255)';\n case 'TEXT':\n case 'text':\n return 'NVARCHAR(MAX)';\n case 'ENUM':\n case 'enum':\n return 'NVARCHAR(255)';\n default:\n return String(column.type).toUpperCase();\n }\n }\n\n renderDefault(value: unknown): string {\n return formatLiteral(value, this.name);\n }\n\n renderAutoIncrement(column: ColumnDef): string | undefined {\n return column.autoIncrement ? 'IDENTITY(1,1)' : undefined;\n }\n\n renderIndex(table: TableDef, index: IndexDef): string {\n const name = index.name || deriveIndexName(table, index);\n const cols = renderIndexColumns(this, index.columns);\n const unique = index.unique ? 'UNIQUE ' : '';\n const where = index.where ? ` WHERE ${index.where}` : '';\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(name)} ON ${this.formatTableName(table)} (${cols})${where};`;\n }\n\n supportsPartialIndexes(): boolean {\n return true;\n }\n\n dropColumnSql(table: DatabaseTable, column: string): string[] {\n return [`ALTER TABLE ${this.formatTableName(table)} DROP COLUMN ${this.quoteIdentifier(column)};`];\n }\n\n dropIndexSql(table: DatabaseTable, index: string): string[] {\n return [`DROP INDEX ${this.quoteIdentifier(index)} ON ${this.formatTableName(table)};`];\n }\n}\n","import { ColumnDef, ForeignKeyReference, RawDefaultValue } from '../../schema/column.js';\nimport { IndexDef, IndexColumn, TableDef } from '../../schema/table.js';\nimport { DatabaseTable } from './schema-types.js';\nexport { BaseSchemaDialect } from './dialects/base-schema-dialect.js';\nexport {\n PostgresSchemaDialect,\n MySqlSchemaDialect,\n SQLiteSchemaDialect,\n MSSqlSchemaDialect\n} from './dialects/index.js';\n\nexport type DialectName = 'postgres' | 'mysql' | 'sqlite' | 'mssql';\n\nexport interface SchemaDialect {\n name: DialectName;\n quoteIdentifier(id: string): string;\n formatTableName(table: TableDef | DatabaseTable): string;\n renderColumnType(column: ColumnDef): string;\n renderDefault(value: unknown, column: ColumnDef): string;\n renderAutoIncrement(column: ColumnDef, table: TableDef): string | undefined;\n renderReference(ref: ForeignKeyReference, table: TableDef): string;\n renderIndex(table: TableDef, index: IndexDef): string;\n renderTableOptions(table: TableDef): string | undefined;\n supportsPartialIndexes(): boolean;\n preferInlinePkAutoincrement?(column: ColumnDef, table: TableDef, pk: string[]): boolean;\n dropColumnSql(table: DatabaseTable, column: string): string[];\n dropIndexSql(table: DatabaseTable, index: string): string[];\n dropTableSql(table: DatabaseTable): string[];\n warnDropColumn?(table: DatabaseTable, column: string): string | undefined;\n}\n\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\nexport const escapeLiteral = (value: string): string => value.replace(/'/g, \"''\");\n\nconst isRawDefault = (value: unknown): value is RawDefaultValue => {\n return !!value && typeof value === 'object' && 'raw' in (value as any) && typeof (value as any).raw === 'string';\n};\n\nexport const formatLiteral = (value: unknown, dialect: DialectName): string => {\n if (isRawDefault(value)) return value.raw;\n if (value === null) return 'NULL';\n if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL';\n if (typeof value === 'boolean') {\n if (dialect === 'mysql' || dialect === 'sqlite' || dialect === 'mssql') {\n return value ? '1' : '0';\n }\n return value ? 'TRUE' : 'FALSE';\n }\n if (value instanceof Date) return `'${escapeLiteral(value.toISOString())}'`;\n if (typeof value === 'string') return `'${escapeLiteral(value)}'`;\n return `'${escapeLiteral(JSON.stringify(value))}'`;\n};\n\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\n if (table.primaryKey && table.primaryKey.length > 0) {\n return table.primaryKey;\n }\n const cols = Object.values(table.columns);\n return cols.filter(c => c.primary).map(c => c.name);\n};\n\nexport const quoteQualified = (dialect: SchemaDialect, identifier: string): string => {\n if (identifier.includes('.')) {\n return identifier\n .split('.')\n .map(part => dialect.quoteIdentifier(part))\n .join('.');\n }\n return dialect.quoteIdentifier(identifier);\n};\n\nexport const renderIndexColumns = (dialect: SchemaDialect, columns: (string | IndexColumn)[]) => {\n return columns\n .map(col => {\n if (typeof col === 'string') return dialect.quoteIdentifier(col);\n const parts = [dialect.quoteIdentifier(col.column)];\n if (col.order) parts.push(col.order);\n if (col.nulls) parts.push(`NULLS ${col.nulls}`);\n return parts.join(' ');\n })\n .join(', ');\n};\n\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\n const base = (index.columns || [])\n .map(col => (typeof col === 'string' ? col : col.column))\n .join('_');\n const suffix = index.unique ? 'uniq' : 'idx';\n return `${table.name}_${base}_${suffix}`;\n};\n\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\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\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\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","import { TableDef } from '../../schema/table.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\nimport {\n SchemaDialect,\n deriveIndexName,\n generateCreateTableSql,\n renderColumnDefinition\n} from './schema-generator.js';\nimport { DatabaseSchema, DatabaseTable } from './schema-types.js';\n\nexport type SchemaChangeKind =\n | 'createTable'\n | 'dropTable'\n | 'addColumn'\n | 'dropColumn'\n | 'alterColumn'\n | 'addIndex'\n | 'dropIndex';\n\nexport interface SchemaChange {\n kind: SchemaChangeKind;\n table: string;\n description: string;\n statements: string[];\n safe: boolean;\n}\n\nexport interface SchemaPlan {\n changes: SchemaChange[];\n warnings: string[];\n}\n\nexport interface SchemaDiffOptions {\n /** Allow destructive operations (drops) */\n allowDestructive?: boolean;\n}\n\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\n\nconst mapTables = (schema: DatabaseSchema) => {\n const map = new Map<string, DatabaseTable>();\n for (const table of schema.tables) {\n map.set(tableKey(table.name, table.schema), table);\n }\n return map;\n};\n\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\n const column = table.columns[colName];\n const rendered = renderColumnDefinition(table, column, dialect);\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\n};\n\nexport const diffSchema = (\n expectedTables: TableDef[],\n actualSchema: DatabaseSchema,\n dialect: SchemaDialect,\n options: SchemaDiffOptions = {}\n): SchemaPlan => {\n const allowDestructive = options.allowDestructive ?? false;\n const plan: SchemaPlan = { changes: [], warnings: [] };\n\n const actualMap = mapTables(actualSchema);\n\n // Create missing tables and indexes\n for (const table of expectedTables) {\n const key = tableKey(table.name, table.schema);\n const actual = actualMap.get(key);\n if (!actual) {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n plan.changes.push({\n kind: 'createTable',\n table: key,\n description: `Create table ${key}`,\n statements: [tableSql, ...indexSql],\n safe: true\n });\n continue;\n }\n\n // Columns\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\n for (const colName of Object.keys(table.columns)) {\n if (!actualCols.has(colName)) {\n plan.changes.push({\n kind: 'addColumn',\n table: key,\n description: `Add column ${colName} to ${key}`,\n statements: [buildAddColumnSql(table, colName, dialect)],\n safe: true\n });\n }\n }\n for (const colName of actualCols.keys()) {\n if (!table.columns[colName]) {\n plan.changes.push({\n kind: 'dropColumn',\n table: key,\n description: `Drop column ${colName} from ${key}`,\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\n safe: false\n });\n const warning = dialect.warnDropColumn?.(actual, colName);\n if (warning) plan.warnings.push(warning);\n }\n }\n\n // Indexes (naive: based on name or derived name)\n const expectedIndexes = table.indexes ?? [];\n const actualIndexes = actual.indexes ?? [];\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\n\n for (const idx of expectedIndexes) {\n const name = idx.name || deriveIndexName(table, idx);\n if (!actualIndexMap.has(name)) {\n plan.changes.push({\n kind: 'addIndex',\n table: key,\n description: `Create index ${name} on ${key}`,\n statements: [dialect.renderIndex(table, { ...idx, name })],\n safe: true\n });\n }\n }\n\n for (const idx of actualIndexes) {\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\n plan.changes.push({\n kind: 'dropIndex',\n table: key,\n description: `Drop index ${idx.name} on ${key}`,\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\n safe: false\n });\n }\n }\n }\n\n // Extra tables\n for (const actual of actualSchema.tables) {\n const key = tableKey(actual.name, actual.schema);\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\n plan.changes.push({\n kind: 'dropTable',\n table: key,\n description: `Drop table ${key}`,\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\n safe: false\n });\n }\n }\n\n return plan;\n};\n\nexport interface SynchronizeOptions extends SchemaDiffOptions {\n dryRun?: boolean;\n}\n\nexport const synchronizeSchema = async (\n expectedTables: TableDef[],\n actualSchema: DatabaseSchema,\n dialect: SchemaDialect,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<SchemaPlan> => {\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\n if (options.dryRun) return plan;\n\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 return plan;\n};\n","import { DbExecutor, QueryResult } from '../../orm/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\nexport const toRows = (result: QueryResult | undefined): Record<string, any>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, any>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, any>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\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 { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const postgresIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema || 'public';\n const tables: DatabaseTable[] = [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default\n FROM information_schema.columns\n WHERE table_schema = $1\n ORDER BY table_name, ordinal_position\n `,\n [schema]\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT\n ns.nspname AS table_schema,\n tbl.relname AS table_name,\n array_agg(att.attname ORDER BY arr.idx) AS pk_columns\n FROM pg_index i\n JOIN pg_class tbl ON tbl.oid = i.indrelid\n JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\n JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS arr(attnum, idx) ON TRUE\n LEFT JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\n WHERE i.indisprimary AND ns.nspname = $1\n GROUP BY ns.nspname, tbl.relname\n `,\n [schema]\n );\n\n const pkMap = new Map<string, string[]>();\n pkRows.forEach(r => {\n pkMap.set(`${r.table_schema}.${r.table_name}`, r.pk_columns || []);\n });\n\n const fkRows = await queryRows(\n executor,\n `\n SELECT\n tc.table_schema,\n tc.table_name,\n kcu.column_name,\n ccu.table_schema AS foreign_table_schema,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name,\n rc.update_rule AS on_update,\n rc.delete_rule AS on_delete\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema\n JOIN information_schema.referential_constraints rc\n ON rc.constraint_name = tc.constraint_name AND rc.constraint_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = $1\n `,\n [schema]\n );\n\n const fkMap = new Map<string, any[]>();\n fkRows.forEach(r => {\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\n fkMap.set(key, [{\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\n column: r.foreign_column_name,\n onDelete: r.on_delete?.toUpperCase(),\n onUpdate: r.on_update?.toUpperCase()\n }]);\n });\n\n const indexRows = await queryRows(\n executor,\n `\n SELECT\n ns.nspname AS table_schema,\n tbl.relname AS table_name,\n idx.relname AS index_name,\n i.indisunique AS is_unique,\n pg_get_expr(i.indpred, i.indrelid) AS predicate,\n array_agg(att.attname ORDER BY arr.idx) AS column_names\n FROM pg_index i\n JOIN pg_class tbl ON tbl.oid = i.indrelid\n JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\n JOIN pg_class idx ON idx.oid = i.indexrelid\n JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS arr(attnum, idx) ON TRUE\n LEFT JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\n WHERE ns.nspname = $1 AND NOT i.indisprimary\n GROUP BY ns.nspname, tbl.relname, idx.relname, i.indisunique, i.indpred\n `,\n [schema]\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)) {\n return;\n }\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 });\n }\n const cols = tablesByKey.get(key)!;\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n references: fk\n ? {\n table: fk.table,\n column: fk.column,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate\n }\n : undefined\n };\n cols.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 idx: DatabaseIndex = {\n name: r.index_name,\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\n unique: !!r.is_unique,\n where: r.predicate || undefined\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n tables.push(...tablesByKey.values());\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const mysqlIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const filterClause = schema ? 'table_schema = ?' : 'table_schema = database()';\n const params = schema ? [schema] : [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default, extra\n FROM information_schema.columns\n WHERE ${filterClause}\n ORDER BY table_name, ordinal_position\n `,\n params\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT table_schema, table_name, column_name\n FROM information_schema.key_column_usage\n WHERE constraint_name = 'PRIMARY' AND ${filterClause}\n ORDER BY ordinal_position\n `,\n params\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 indexRows = await queryRows(\n executor,\n `\n SELECT\n table_schema,\n table_name,\n index_name,\n non_unique,\n GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols\n FROM information_schema.statistics\n WHERE ${filterClause} AND index_name <> 'PRIMARY'\n GROUP BY table_schema, table_name, index_name, non_unique\n `,\n params\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 });\n }\n const cols = tablesByKey.get(key)!;\n const column: DatabaseColumn = {\n name: r.column_name,\n type: r.data_type,\n notNull: r.is_nullable === 'NO',\n default: r.column_default ?? undefined,\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment')\n };\n cols.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: string) => ({ 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 { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nconst escapeSingleQuotes = (name: string) => name.replace(/'/g, \"''\");\n\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const tables: DatabaseTable[] = [];\n const tableRows = await queryRows(\n executor,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';`\n );\n\n for (const row of tableRows) {\n const name = row.name as string;\n if (!shouldIncludeTable(name, options)) continue;\n const table: DatabaseTable = { name, columns: [], primaryKey: [], indexes: [] };\n\n const cols = await queryRows(executor, `PRAGMA table_info('${escapeSingleQuotes(name)}');`);\n cols.forEach(c => {\n table.columns.push({\n name: c.name,\n type: c.type,\n notNull: c.notnull === 1,\n default: c.dflt_value ?? undefined,\n autoIncrement: false\n });\n if (c.pk && c.pk > 0) {\n table.primaryKey = table.primaryKey || [];\n table.primaryKey.push(c.name);\n }\n });\n\n const fkRows = await queryRows(executor, `PRAGMA foreign_key_list('${escapeSingleQuotes(name)}');`);\n fkRows.forEach(fk => {\n const col = table.columns.find(c => c.name === fk.from);\n if (col) {\n col.references = {\n table: fk.table,\n column: fk.to,\n onDelete: fk.on_delete?.toUpperCase(),\n onUpdate: fk.on_update?.toUpperCase()\n };\n }\n });\n\n const idxList = await queryRows(executor, `PRAGMA index_list('${escapeSingleQuotes(name)}');`);\n for (const idx of idxList) {\n const idxName = idx.name as string;\n const columnsInfo = await queryRows(executor, `PRAGMA index_info('${escapeSingleQuotes(idxName)}');`);\n const idxEntry: DatabaseIndex = {\n name: idxName,\n columns: columnsInfo.map(ci => ({ column: ci.name as string })),\n unique: idx.unique === 1\n };\n table.indexes!.push(idxEntry);\n }\n\n tables.push(table);\n }\n\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\n\nexport const mssqlIntrospector: SchemaIntrospector = {\n async introspect(executor: DbExecutor, options: IntrospectOptions): Promise<DatabaseSchema> {\n const schema = options.schema;\n const filterSchema = schema ? 'sch.name = @p1' : '1=1';\n const params = schema ? [schema] : [];\n\n const columnRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n c.name AS column_name,\n ty.name AS data_type,\n c.is_nullable,\n c.is_identity,\n object_definition(c.default_object_id) AS column_default\n FROM sys.columns c\n JOIN sys.tables t ON t.object_id = c.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n WHERE t.is_ms_shipped = 0 AND ${filterSchema}\n `,\n params\n );\n\n const pkRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.indexes i\n JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 1 AND ${filterSchema}\n ORDER BY ic.key_ordinal\n `,\n params\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 indexRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n i.name AS index_name,\n i.is_unique,\n i.has_filter,\n i.filter_definition\n FROM sys.indexes i\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 0 AND i.is_hypothetical = 0 AND ${filterSchema}\n `,\n params\n );\n\n const indexColsRows = await queryRows(\n executor,\n `\n SELECT\n sch.name AS table_schema,\n t.name AS table_name,\n i.name AS index_name,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.index_columns ic\n JOIN sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\n JOIN sys.tables t ON t.object_id = i.object_id\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\n WHERE i.is_primary_key = 0 AND ${filterSchema}\n ORDER BY ic.key_ordinal\n `,\n params\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 });\n }\n const t = 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 t.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\n };\n table.indexes = table.indexes || [];\n table.indexes.push(idx);\n });\n\n return { tables: Array.from(tablesByKey.values()) };\n }\n};\n","import { DialectName } from './schema-generator.js';\nimport { DatabaseSchema } from './schema-types.js';\nimport { DbExecutor } from '../../orm/db-executor.js';\nimport type { IntrospectOptions, SchemaIntrospector } from './introspect/types.js';\nimport { postgresIntrospector } from './introspect/postgres.js';\nimport { mysqlIntrospector } from './introspect/mysql.js';\nimport { sqliteIntrospector } from './introspect/sqlite.js';\nimport { mssqlIntrospector } from './introspect/mssql.js';\n\nconst INTROSPECTORS: Record<DialectName, SchemaIntrospector> = {\n postgres: postgresIntrospector,\n mysql: mysqlIntrospector,\n sqlite: sqliteIntrospector,\n mssql: mssqlIntrospector\n};\n\n/**\n * Introspects an existing database schema using the dialect-specific strategy.\n */\nexport const introspectSchema = async (\n executor: DbExecutor,\n dialect: DialectName,\n options: IntrospectOptions = {}\n): Promise<DatabaseSchema> => {\n const handler = INTROSPECTORS[dialect];\n if (!handler) {\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\n }\n return handler.introspect(executor, options);\n};\n\nexport type { IntrospectOptions, SchemaIntrospector };\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\r\n * @typeParam T - Type of the stored data\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback with the specified store value\r\n * @param store - Value to store during callback execution\r\n * @param callback - Function to execute with the store value\r\n * @returns Result of the callback function\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 * Gets the currently stored value\r\n * @returns Current store value or undefined if none exists\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 { 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 ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\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\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\nconst capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\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\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\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?.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 => !(hydration && isRelationAlias((col as any).alias)))\r\n .map(col => {\r\n const key = (col as any).alias || (col as any).name;\r\n const operand = col as OperandNode;\r\n return `${key}: ${this.printOperand(operand)}`;\r\n });\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(${capitalize(ast.from.name)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${capitalize(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n if (join.relationName && hydratedRelations.has(join.relationName)) {\r\n return;\r\n }\r\n\r\n if (join.relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${join.relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${join.relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = capitalize(join.table.name);\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(c => `${capitalize(c.table)}.${c.name}`).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 lines.push(`.orderBy(${capitalize(o.column.table)}.${o.column.name}, '${o.direction}')`);\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 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 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 /**\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 /**\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 values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n const fn = this.mapOp(inExpr.operator);\r\n return `${fn}(${left}, [${values}])`;\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 `${capitalize(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(${capitalize(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 => `${capitalize(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.map(o => `${capitalize(o.column.table)}.${o.column.name} ${o.direction}`).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 /**\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 { HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\nexport type DomainEventHandler<Context> = (event: any, ctx: Context) => Promise<void> | void;\r\n\r\nexport class DomainEventBus<Context> {\r\n private readonly handlers = new Map<string, DomainEventHandler<Context>[]>();\r\n\r\n constructor(initialHandlers?: Record<string, DomainEventHandler<Context>[]>) {\r\n const handlers = initialHandlers ?? {};\r\n Object.entries(handlers).forEach(([name, list]) => {\r\n this.handlers.set(name, [...list]);\r\n });\r\n }\r\n\r\n register(name: string, handler: DomainEventHandler<Context>): void {\r\n const existing = this.handlers.get(name) ?? [];\r\n existing.push(handler);\r\n this.handlers.set(name, existing);\r\n }\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;\r\n if (!entity.domainEvents || !entity.domainEvents.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const eventName = this.getEventName(event);\r\n const handlers = this.handlers.get(eventName);\r\n if (!handlers) 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 private getEventName(event: any): string {\r\n if (!event) return 'Unknown';\r\n if (typeof event === 'string') return event;\r\n return event.constructor?.name ?? 'Unknown';\r\n }\r\n}\r\n\r\nexport const addDomainEvent = (entity: HasDomainEvents, event: any): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\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 getEntity(table: TableDef, pk: string | number): any | 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 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 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 private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\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 } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from './db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\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 registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\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.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 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, 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, relation);\r\n }\r\n }\r\n\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\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, 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 private assignHasManyForeignKey(child: any, 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 private detachHasManyChild(child: any, 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 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 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 private resolvePrimaryKeyValue(entity: any, 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;\r\n }\r\n}\r\n","import type { DbExecutor } from './db-executor.js';\r\n\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.beginTransaction) {\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 { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\nexport enum EntityStatus {\r\n New = 'new',\r\n Managed = 'managed',\r\n Dirty = 'dirty',\r\n Removed = 'removed',\r\n Detached = 'detached'\r\n}\r\n\r\nexport interface TrackedEntity {\r\n table: TableDef;\r\n entity: any;\r\n pk: string | number | null;\r\n status: EntityStatus;\r\n original: Record<string, any> | null;\r\n}\r\n\r\nexport type RelationKey = string;\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\nexport interface RelationChangeEntry {\r\n root: any;\r\n relationKey: RelationKey;\r\n rootTable: TableDef;\r\n relationName: string;\r\n relation: RelationDef;\r\n change: RelationChange<any>;\r\n}\r\n\r\nexport interface HasDomainEvents {\r\n domainEvents?: any[];\r\n}\r\n","import { ColumnNode, eq } from '../core/ast/expression.js';\nimport type { Dialect, CompiledQuery } from '../core/dialect/abstract.js';\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 './db-executor.js';\nimport { IdentityMap } from './identity-map.js';\r\nimport { EntityStatus } from './runtime-types.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<any, TrackedEntity>();\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 get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n findTracked(entity: any): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): 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)\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 trackNew(table: TableDef, entity: any, 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 trackManaged(table: TableDef, pk: string | number, entity: any): 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)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n markDirty(entity: any): 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 markRemoved(entity: any): 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 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 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);\n let builder = new InsertQueryBuilder(tracked.table).values(payload);\n if (this.dialect.supportsReturning()) {\n builder = builder.returning(...this.getReturningColumns(tracked.table));\n }\n const compiled = builder.compile(this.dialect);\n const results = await this.executeCompiled(compiled);\n this.applyReturningResults(tracked, results);\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\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 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)\n .set(changes)\n .where(eq(pkColumn, tracked.pk));\n\n if (this.dialect.supportsReturning()) {\n builder = builder.returning(...this.getReturningColumns(tracked.table));\n }\n\n const compiled = builder.compile(this.dialect);\n const results = await this.executeCompiled(compiled);\n this.applyReturningResults(tracked, results);\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\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 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() as any, tracked.entity);\r\n }\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 private extractColumns(table: TableDef, entity: any): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n private async executeCompiled(compiled: CompiledQuery): Promise<QueryResult[]> {\n return this.executor.executeSql(compiled.sql, compiled.params);\n }\n\n private getReturningColumns(table: TableDef): ColumnNode[] {\n return Object.values(table.columns).map(column => ({\n type: 'Column',\n table: table.name,\n name: column.name,\n alias: column.name\n }));\n }\n\n private applyReturningResults(tracked: TrackedEntity, results: QueryResult[]): void {\n if (!this.dialect.supportsReturning()) return;\n const first = results[0];\n if (!first || first.values.length === 0) return;\n\n const row = first.values[0];\n for (let i = 0; i < first.columns.length; i++) {\n const columnName = this.normalizeColumnName(first.columns[i]);\n if (!(columnName in tracked.table.columns)) continue;\n tracked.entity[columnName] = row[i];\n }\n }\n\n private normalizeColumnName(column: string): string {\n const parts = column.split('.');\n const candidate = parts[parts.length - 1];\n return candidate.replace(/^[\"`[\\]]+|[\"`[\\]]+$/g, '');\n }\n\n private registerIdentity(tracked: TrackedEntity): void {\n if (tracked.pk == null) return;\n this.identityMap.register(tracked);\n }\n\n private createSnapshot(table: TableDef, entity: any): Record<string, any> {\n const snapshot: Record<string, any> = {};\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 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 { DbExecutor } from './db-executor.js';\n\nexport interface QueryLogEntry {\n sql: string;\n params?: unknown[];\n}\n\nexport type QueryLogger = (entry: QueryLogEntry) => void;\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 async executeSql(sql, params) {\n logger({ sql, params });\n return executor.executeSql(sql, params);\n }\n };\n\n if (executor.beginTransaction) {\n wrapped.beginTransaction = executor.beginTransaction.bind(executor);\n }\n\n if (executor.commitTransaction) {\n wrapped.commitTransaction = executor.commitTransaction.bind(executor);\n }\n\n if (executor.rollbackTransaction) {\n wrapped.rollbackTransaction = executor.rollbackTransaction.bind(executor);\n }\n\n return wrapped;\n};\n","import type { Dialect } from '../core/dialect/abstract.js';\r\nimport type { RelationDef } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from './db-executor.js';\nimport { DomainEventBus, DomainEventHandler as DomainEventHandlerFn, addDomainEvent } from './domain-event-bus.js';\nimport { IdentityMap } from './identity-map.js';\nimport { RelationChangeProcessor } from './relation-change-processor.js';\nimport { runInTransaction } from './transaction-runner.js';\nimport { UnitOfWork } from './unit-of-work.js';\nimport {\n EntityStatus,\n HasDomainEvents,\n RelationChange,\n RelationChangeEntry,\n RelationKey,\n TrackedEntity\n} from './runtime-types.js';\nimport { createQueryLoggingExecutor, QueryLogger } from './query-logger.js';\n\r\nexport interface OrmInterceptor {\r\n beforeFlush?(ctx: OrmContext): Promise<void> | void;\r\n afterFlush?(ctx: OrmContext): Promise<void> | void;\r\n}\r\n\r\nexport type DomainEventHandler = DomainEventHandlerFn<OrmContext>;\r\n\r\nexport interface OrmContextOptions {\n dialect: Dialect;\n executor: DbExecutor;\n interceptors?: OrmInterceptor[];\n domainEventHandlers?: Record<string, DomainEventHandler[]>;\n queryLogger?: QueryLogger;\n}\n\nexport class OrmContext {\n private readonly identityMap = new IdentityMap();\n private readonly executorWithLogging: DbExecutor;\n private readonly unitOfWork: UnitOfWork;\n private readonly relationChanges: RelationChangeProcessor;\n private readonly interceptors: OrmInterceptor[];\n private readonly domainEvents: DomainEventBus<OrmContext>;\n\n constructor(private readonly options: OrmContextOptions) {\n this.interceptors = [...(options.interceptors ?? [])];\n this.executorWithLogging = createQueryLoggingExecutor(options.executor, options.queryLogger);\n this.unitOfWork = new UnitOfWork(\n options.dialect,\n this.executorWithLogging,\n this.identityMap,\n () => this\n );\n this.relationChanges = new RelationChangeProcessor(\n this.unitOfWork,\n options.dialect,\n this.executorWithLogging\n );\n this.domainEvents = new DomainEventBus<OrmContext>(options.domainEventHandlers);\n }\n\r\n get dialect(): Dialect {\r\n return this.options.dialect;\r\n }\r\n\r\n get executor(): DbExecutor {\n return this.executorWithLogging;\n }\n\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.unitOfWork.identityBuckets;\r\n }\r\n\r\n get tracked(): TrackedEntity[] {\r\n return this.unitOfWork.getTracked();\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.unitOfWork.getEntity(table, pk);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): void {\r\n this.unitOfWork.setEntity(table, pk, entity);\r\n }\r\n\r\n trackNew(table: TableDef, entity: any, pk?: string | number): void {\r\n this.unitOfWork.trackNew(table, entity, pk);\r\n }\r\n\r\n trackManaged(table: TableDef, pk: string | number, entity: any): void {\r\n this.unitOfWork.trackManaged(table, pk, entity);\r\n }\r\n\r\n markDirty(entity: any): void {\r\n this.unitOfWork.markDirty(entity);\r\n }\r\n\r\n markRemoved(entity: any): void {\r\n this.unitOfWork.markRemoved(entity);\r\n }\r\n\r\n registerRelationChange(\r\n root: any,\r\n relationKey: RelationKey,\r\n rootTable: TableDef,\r\n relationName: string,\r\n relation: RelationDef,\r\n change: RelationChange<any>\r\n ): void {\r\n const entry: RelationChangeEntry = {\r\n root,\r\n relationKey,\r\n rootTable,\r\n relationName,\r\n relation,\r\n change\r\n };\r\n this.relationChanges.registerChange(entry);\r\n }\r\n\r\n registerInterceptor(interceptor: OrmInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n registerDomainEventHandler(name: string, handler: DomainEventHandler): void {\r\n this.domainEvents.register(name, handler);\r\n }\r\n\r\n async saveChanges(): Promise<void> {\r\n await runInTransaction(this.executor, async () => {\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 await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.unitOfWork.getEntitiesForTable(table);\r\n }\r\n}\r\n\r\nexport { addDomainEvent };\nexport { EntityStatus };\nexport type {\n QueryResult,\n DbExecutor,\n RelationKey,\n RelationChange,\n HasDomainEvents\n};\nexport type { QueryLogEntry, QueryLogger } from './query-logger.js';\n"],"mappings":"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","names":["col","col","col","col","col","col","col","col","state","hydration","relationSelectionResult","col","col","toKey","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasMany","belongsTo","col","col","col","col","col","col","col","col","col","col","assertNever","col","EntityStatus"]}