metal-orm 1.0.29 → 1.0.32

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/schema/table.ts","../../src/orm/entity-metadata.ts","../../src/decorators/decorator-metadata.ts","../../src/decorators/entity.ts","../../src/decorators/column.ts","../../src/schema/relation.ts","../../src/decorators/relations.ts","../../src/core/ast/expression-nodes.ts","../../src/core/ast/expression-builders.ts","../../src/core/sql/sql.ts","../../src/core/ast/aggregate-functions.ts","../../src/core/ast/builders.ts","../../src/core/functions/standard-strategy.ts","../../src/core/dialect/abstract.ts","../../src/core/dialect/base/function-table-formatter.ts","../../src/core/dialect/base/pagination-strategy.ts","../../src/core/dialect/base/cte-compiler.ts","../../src/core/dialect/base/returning-strategy.ts","../../src/core/dialect/base/join-compiler.ts","../../src/core/dialect/base/groupby-compiler.ts","../../src/core/dialect/base/orderby-compiler.ts","../../src/core/dialect/base/sql-dialect.ts","../../src/core/dialect/postgres/functions.ts","../../src/core/dialect/postgres/index.ts","../../src/core/dialect/mysql/functions.ts","../../src/core/dialect/mysql/index.ts","../../src/core/dialect/sqlite/functions.ts","../../src/core/dialect/sqlite/index.ts","../../src/core/dialect/mssql/functions.ts","../../src/core/dialect/mssql/index.ts","../../src/core/dialect/dialect-factory.ts","../../src/query-builder/select-query-state.ts","../../src/core/ast/join-node.ts","../../src/query-builder/hydration-manager.ts","../../src/query-builder/relation-alias.ts","../../src/query-builder/relation-utils.ts","../../src/query-builder/hydration-planner.ts","../../src/query-builder/raw-column-parser.ts","../../src/query-builder/query-ast-service.ts","../../src/query-builder/relation-projection-helper.ts","../../src/query-builder/relation-conditions.ts","../../src/core/ast/join-metadata.ts","../../src/query-builder/relation-service.ts","../../src/query-builder/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/has-one.ts","../../src/orm/relations/belongs-to.ts","../../src/orm/relations/many-to-many.ts","../../src/orm/lazy-batch.ts","../../src/orm/entity.ts","../../src/orm/execute.ts","../../src/query-builder/select.ts","../../src/decorators/bootstrap.ts"],"sourcesContent":["import type { ColumnDef } from './column.js';\nimport type { 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;\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\n}\n\n/**\n * Definition of a database table with its columns and relationships\n * @typeParam T - Type of the columns record\n */\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\n/**\n * Creates a table definition with columns and relationships\n * @typeParam T - Type of the columns record\n * @param name - Name of the table\n * @param columns - Record of column definitions\n * @param relations - Record of relationship definitions (optional)\n * @returns Complete table definition with runtime-filled column metadata\n *\n * @example\n * ```typescript\n * const usersTable = defineTable('users', {\n * id: col.primaryKey(col.int()),\n * name: col.varchar(255),\n * email: col.varchar(255)\n * });\n * ```\n */\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","import { ColumnType, ColumnDef } from '../schema/column.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\nexport type EntityConstructor = new (...args: any[]) => any;\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\nexport type ColumnDefLike = Omit<ColumnDef, 'name' | 'table'>;\n\ninterface BaseRelationMetadata {\n propertyKey: string;\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n}\n\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasMany;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasOne;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsTo;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsToMany;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n}\n\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\nexport interface EntityMetadata {\n target: EntityConstructor;\n tableName: string;\n columns: Record<string, ColumnDefLike>;\n relations: Record<string, RelationMetadata>;\n hooks?: TableHooks;\n table?: TableDef;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.columns[propertyKey] = { ...column };\n};\n\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\nexport const buildTableDef = (meta: EntityMetadata): TableDef => {\n if (meta.table) {\n return meta.table;\n }\n\n const columns = Object.entries(meta.columns).reduce<Record<string, ColumnDef>>((acc, [key, def]) => {\n acc[key] = {\n ...def,\n name: key,\n table: meta.tableName\n };\n return acc;\n }, {});\n\n const table = defineTable(meta.tableName, columns, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n addInitializer?(initializer: (this: unknown) => void): void;\n static?: boolean;\n private?: boolean;\n}\n\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\nexport interface DualModeClassDecorator {\n <TFunction extends Function>(value: TFunction): void | TFunction;\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as any);\n};\n\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\nexport const registerInitializer = (\n context: StandardDecoratorContext,\n initializer: (this: unknown) => void\n): void => {\n context.addInitializer?.(initializer);\n};\n","import { TableHooks } from '../schema/table.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: Function): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (!meta.columns[entry.propertyName]) {\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n }\n for (const entry of bag.relations) {\n if (!meta.relations[entry.propertyName]) {\n addRelationMetadata(ctor, entry.propertyName, entry.relation);\n }\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n notNull?: boolean;\n primary?: boolean;\n}\n\nexport type ColumnInput = ColumnOptions | ColumnDef;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as any).constructor === 'function') {\n return (target as any).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n registerInitializer(context, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerColumn(ctor, propertyName, column);\n });\n};\n\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as any).constructor === 'function') {\n return (instanceOrCtor as any).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n\n registerInitializer(ctx, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerRelation(ctor, propertyName, relationMetadata);\n });\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","import type { SelectQueryNode, OrderByNode } from './query.js';\nimport { SqlOperator } from '../sql/sql.js';\nimport { ColumnRef } from './types.js';\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 {\n type: 'Column';\n /** Table name the column belongs to */\n table: string;\n /** Column name */\n name: string;\n /** Optional alias for the column */\n alias?: string;\n /** Optional scope marker (e.g., 'outer' for correlated references) */\n scope?: 'outer' | 'default';\n}\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\n type: 'Function';\n /** Function name (e.g., COUNT, SUM) */\n name: string;\n /** Optional canonical function key for dialect-aware rendering */\n fn?: string;\n /** Function arguments */\n args: OperandNode[];\n /** Optional alias for the function result */\n alias?: string;\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\n orderBy?: OrderByNode[];\n /** Optional separator argument used by GROUP_CONCAT-like functions */\n separator?: OperandNode;\n /** Optional DISTINCT modifier */\n distinct?: boolean;\n}\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 = (\n node: ColumnRef | FunctionNode | CaseExpressionNode | WindowFunctionNode\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\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 { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.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\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n return {\r\n type: 'Literal',\r\n value\r\n } as LiteralNode;\r\n};\r\n\r\nconst toNode = (col: ColumnRef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnRef;\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 isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n if (isLiteralValue(val)) {\r\n return valueToOperand(val);\r\n }\r\n\r\n return toNode(val);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\n/**\n * Marks a column reference as an outer-scope reference for correlated subqueries.\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\n */\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\n ...columnOperand(col),\n scope: 'outer'\n});\n\n/**\n * Creates an outer-scoped column reference using a specific table or alias name.\n */\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: 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 | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: 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 | ColumnRef): 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 | ColumnRef,\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 | ColumnRef, 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 | ColumnRef, 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 | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: 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 | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","/**\r\n * 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 { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\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\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n column: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n","import { ColumnNode } from './expression-nodes.js';\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Builds or normalizes a column AST node from a column definition or existing node\n * @param table - Table definition providing a default table name\n * @param column - Column definition or existing column node\n */\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\n if ((column as ColumnNode).type === 'Column') {\n return column as ColumnNode;\n }\n\n const def = column as ColumnRef;\n const baseTable = def.table\n ? table.alias && def.table === table.name\n ? table.alias\n : def.table\n : table.alias || table.name;\n\n return {\n type: 'Column',\n table: baseTable,\n name: def.name\n };\n};\n\n/**\n * Builds column AST nodes for a list of column names\n * @param table - Table definition providing the table name\n * @param names - Column names\n */\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\n names.map(name => ({\n type: 'Column',\n table: table.alias || table.name,\n name\n }));\n\n/**\n * Builds a table AST node for the provided table definition\n * @param table - Table definition\n */\nexport const createTableNode = (table: TableRef): TableNode => ({\n type: 'Table',\n name: table.name\n});\n\n/**\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\n */\nexport const fnTable = (name: string, args: any[] = [], alias?: string, opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n): DerivedTableNode => ({\n type: 'DerivedTable',\n query,\n alias,\n columnAliases\n});\n","import { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport { LiteralNode, OperandNode } from '../ast/expression.js';\n\r\nexport class StandardFunctionStrategy implements FunctionStrategy {\r\n protected renderers: Map<string, FunctionRenderer> = new Map();\r\n\r\n constructor() {\r\n this.registerStandard();\r\n }\r\n\r\n protected registerStandard() {\n // Register ANSI standard implementations\n this.add('COUNT', ({ compiledArgs }) => `COUNT(${compiledArgs.join(', ')})`);\n this.add('SUM', ({ compiledArgs }) => `SUM(${compiledArgs[0]})`);\n this.add('AVG', ({ compiledArgs }) => `AVG(${compiledArgs[0]})`);\n this.add('MIN', ({ compiledArgs }) => `MIN(${compiledArgs[0]})`);\n this.add('MAX', ({ compiledArgs }) => `MAX(${compiledArgs[0]})`);\n this.add('ABS', ({ compiledArgs }) => `ABS(${compiledArgs[0]})`);\n this.add('UPPER', ({ compiledArgs }) => `UPPER(${compiledArgs[0]})`);\n this.add('LOWER', ({ compiledArgs }) => `LOWER(${compiledArgs[0]})`);\n this.add('LENGTH', ({ compiledArgs }) => `LENGTH(${compiledArgs[0]})`);\r\n this.add('TRIM', ({ compiledArgs }) => `TRIM(${compiledArgs[0]})`);\r\n this.add('LTRIM', ({ compiledArgs }) => `LTRIM(${compiledArgs[0]})`);\r\n this.add('RTRIM', ({ compiledArgs }) => `RTRIM(${compiledArgs[0]})`);\r\n this.add('SUBSTRING', ({ compiledArgs }) => `SUBSTRING(${compiledArgs.join(', ')})`);\r\n this.add('CONCAT', ({ compiledArgs }) => `CONCAT(${compiledArgs.join(', ')})`);\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURRENT_DATE`);\r\n this.add('CURRENT_TIME', () => `CURRENT_TIME`);\r\n this.add('EXTRACT', ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`);\r\n this.add('YEAR', ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})`);\r\n this.add('MONTH', ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})`);\r\n this.add('DAY', ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})`);\r\n this.add('DATE_ADD', ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_SUB', ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_DIFF', ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('UNIX_TIMESTAMP', () => `UNIX_TIMESTAMP()`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})`);\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})`);\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})`);\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})`);\n this.add('DATE_TRUNC', ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})`);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\r\n\r\n protected add(name: string, renderer: FunctionRenderer) {\r\n this.renderers.set(name, renderer);\r\n }\r\n\r\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = this.formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n }\n\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => `${ctx.compileOperand(order.column)} ${order.direction}`);\n return `ORDER BY ${parts.join(', ')}`;\n }\n\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n }\n\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? StandardFunctionStrategy.DEFAULT_GROUP_CONCAT_SEPARATOR;\n }\n\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n };\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\r\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.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 /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n ctx: CompilerContext\r\n ): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(kind: SetOperationKind): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\r\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\r\n protected readonly functionStrategy: FunctionStrategy;\r\n\r\n protected constructor(functionStrategy?: FunctionStrategy) {\r\n this.expressionCompilers = new Map();\r\n this.operandCompilers = new Map();\r\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy): Dialect {\r\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy);\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 this.compileFunctionOperand(fnNode, ctx)\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 /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\n if (renderer) {\n return renderer({\n node: fnNode,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx)\n });\n }\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\n }\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { SqlDialectBase } from './sql-dialect.js';\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args, dialect);\r\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: any) => {\r\n if (ctx && dialect) {\r\n return (dialect as any).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string, dialect?: SqlDialectBase): string {\r\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.name) : fn.name;\r\n return `${schemaPart}${quoted}(${args})${ordinality}`;\r\n }\r\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n /**\r\n * Compiles all JOIN clauses from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing join definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param compileFrom - Function to compile table sources (tables or subqueries).\r\n * @param compileExpression - Function to compile join condition expressions.\r\n * @returns SQL JOIN clauses (e.g., \" LEFT JOIN table ON condition\") or empty string if no joins.\r\n */\r\n static compileJoins(ast: SelectQueryNode, ctx: CompilerContext, compileFrom: (from: any, ctx: CompilerContext) => string, compileExpression: (expr: any, ctx: CompilerContext) => string): string {\r\n if (!ast.joins || ast.joins.length === 0) return '';\r\n const parts = ast.joins.map(j => {\r\n const table = compileFrom(j.table as any, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy\r\n .map(c => `${quoteIdentifier(c.table)}.${quoteIdentifier(c.name)}`)\r\n .join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy\r\n .map(o => `${quoteIdentifier(o.column.table)}.${quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode, FunctionTableNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\r\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\r\nimport { CteCompiler } from './cte-compiler.js';\r\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\r\nimport { JoinCompiler } from './join-compiler.js';\r\nimport { GroupByCompiler } from './groupby-compiler.js';\r\nimport { OrderByCompiler } from './orderby-compiler.js';\r\n\r\n\r\nexport abstract class SqlDialectBase extends Dialect {\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\r\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\r\n\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = CteCompiler.compileCtes(\r\n ast,\r\n ctx,\r\n this.quoteIdentifier.bind(this),\r\n this.compileSelectAst.bind(this),\r\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\r\n this.stripTrailingSemicolon.bind(this)\r\n );\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\r\n }\r\n\r\n private compileSelectWithSetOps(\r\n ast: SelectQueryNode,\r\n baseSelect: string,\r\n ctes: string,\r\n ctx: CompilerContext\r\n ): string {\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n return `${ctes}${combined}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.into);\r\n const columnList = this.compileInsertColumnList(ast.columns);\r\n const values = this.compileInsertValues(ast.values, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n return this.returningStrategy.compileReturning(returning, ctx);\r\n }\r\n\r\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\r\n private compileInsertValues(values: any[][], ctx: CompilerContext): string {\r\n return values\r\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\r\n .join(', ');\r\n }\r\n\r\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const columns = this.compileSelectColumns(ast, ctx);\r\n const from = this.compileFrom(ast.from, ctx);\r\n const joins = JoinCompiler.compileJoins(ast, ctx, this.compileFrom.bind(this), this.compileExpression.bind(this));\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const groupBy = GroupByCompiler.compileGroupBy(ast, this.quoteIdentifier.bind(this));\r\n const having = this.compileHaving(ast, ctx);\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.table);\r\n const assignments = this.compileUpdateAssignments(ast.set, ctx);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\r\n }\r\n\r\n private compileUpdateAssignments(\r\n assignments: { column: ColumnNode; value: any }[],\r\n ctx: CompilerContext\r\n ): string {\r\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.quoteIdentifier(col.name);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.from);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `DELETE FROM ${table}${whereClause}${returning}`;\r\n }\r\n\r\n protected formatReturningColumns(returning: ColumnNode[]): string {\r\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\r\n }\r\n\r\n protected compileDistinct(ast: SelectQueryNode): string {\r\n return ast.distinct ? 'DISTINCT ' : '';\r\n }\r\n\r\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n return ast.columns.map(c => {\r\n const expr = this.compileOperand(c, ctx);\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\r\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast as any;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\r\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.having) return '';\r\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\r\n }\r\n\r\n protected stripTrailingSemicolon(sql: string): string {\r\n return sql.trim().replace(/;$/, '');\r\n }\r\n\r\n protected wrapSetOperand(sql: string): string {\r\n const trimmed = this.stripTrailingSemicolon(sql);\r\n return `(${trimmed})`;\r\n }\r\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\n });\n\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\n });\n\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n return `DATE_TRUNC('${partClean}', ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { PostgresFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n }\r\n}\r\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\nimport { FunctionRenderContext } from '../../functions/types.js';\nimport { LiteralNode } from '../../ast/expression.js';\n\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `GROUP_CONCAT(${arg}, ${separator})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { SqliteFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * SQLite dialect implementation\r\n */\r\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n }\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 {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQLite uses json_extract(col, '$.path')\r\n return `json_extract(${col}, '${node.path}')`;\r\n }\r\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 protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `DATEPART(wk, ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n // SQL Server 2022+ has DATETRUNC\n return `DATETRUNC(${partClean}, ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n const orderClause = this.buildOrderByExpression(ctx);\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\n });\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode } from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { FunctionTableFormatter } from '../base/function-table-formatter.js';\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n protected readonly dialect = 'mssql';\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super(new MssqlFunctionStrategy());\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 hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = this.compileCtes(ast, ctx);\r\n\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n const tail = pagination || orderBy;\r\n return `${ctes}${combined}${tail}`;\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 {\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\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 => {\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\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileTableSource(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileTableSource(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\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 = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n\r\n if (pagination) {\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\r\n }\r\n\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\r\n }\r\n\r\n private compileOrderBy(ast: SelectQueryNode): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n return ' ORDER BY ' + ast.orderBy\r\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n }\r\n\r\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\r\n const off = ast.offset ?? 0;\r\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\r\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\r\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileTableSource(table: TableSourceNode, ctx: CompilerContext): string {\n if (table.type === 'FunctionTable') {\n return FunctionTableFormatter.format(table, ctx, this as any);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table, ctx);\n }\n const base = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`\n : this.quoteIdentifier(table.name);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileDerivedTable(table: DerivedTableNode, ctx: CompilerContext): string {\n const sub = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx).trim().replace(/;$/, '');\n const cols = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${sub}) AS ${this.quoteIdentifier(table.alias)}${cols}`;\n }\n\r\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\r\n const defs = ast.ctes.map(cte => {\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(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `WITH ${defs} `;\r\n }\r\n\r\n private wrapSetOperand(sql: string): string {\r\n const trimmed = sql.trim().replace(/;$/, '');\r\n return `(${trimmed})`;\r\n }\r\n}\r\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode, TableSourceNode } 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 {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\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';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode, FunctionTableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? ({ type: 'Table', name: tableName } as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\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/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\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, TableSourceNode } 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(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\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 {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\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\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\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 {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withGroupBy([node]);\n }\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 {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\n }\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, rootAlias?: string): ExpressionNode => {\n const rootTable = rootAlias || root.name;\n const defaultLocalKey =\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\n ? findPrimaryKey(root)\n : findPrimaryKey(relation.target);\n const localKey = relation.localKey || defaultLocalKey;\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne:\n return eq(\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\n { type: 'Column', table: rootTable, name: localKey }\n );\n case RelationKinds.BelongsTo:\n return eq(\n { type: 'Column', table: relation.target.name, name: localKey },\n { type: 'Column', table: rootTable, name: relation.foreignKey }\n );\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\n root: TableDef,\n relationName: string,\n relation: BelongsToManyRelation,\n joinKind: JoinKind,\n extra?: ExpressionNode,\n rootAlias?: string\n): JoinNode[] => {\n const rootKey = relation.localKey || findPrimaryKey(root);\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\n const rootTable = rootAlias || root.name;\n\n const pivotCondition = eq(\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\n { type: 'Column', table: rootTable, name: rootKey }\n );\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 = (\n root: TableDef,\n relation: RelationDef,\n extra?: ExpressionNode,\n rootAlias?: string\n): ExpressionNode => {\n const base = baseRelationCondition(root, relation, rootAlias);\n return extra ? and(base, extra) : base;\n};\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n return baseRelationCondition(root, relation, rootAlias);\n};\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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';\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\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(\n relationName: string,\n predicate?: ExpressionNode\n ): RelationResult {\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\n const pk = findPrimaryKey(this.table);\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\n return { state: nextState, hydration: joined.hydration };\n }\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\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(\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n const relation = this.getRelation(relationName);\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\n if (additionalCorrelation) {\n correlation = and(correlation, additionalCorrelation);\n }\n const whereInSubquery = ast.where\n ? and(correlation, ast.where)\n : correlation;\n\n return {\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\n state: SelectQueryState,\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode\n ): SelectQueryState {\n const relation = this.getRelation(relationName);\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\n if (relation.type === RelationKinds.BelongsToMany) {\n const joins = buildBelongsToManyJoins(\n this.table,\n relationName,\n relation as BelongsToManyRelation,\n joinKind,\n extraCondition,\n rootAlias\n );\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\n }\n\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition, rootAlias);\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\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 {\n return this.createQueryAstService(this.table, state);\n }\n\n private rootTableName(): string {\n const from = this.state.ast.from;\n if (from.type === 'Table' && from.alias) return from.alias;\n return this.table.name;\n }\n}\n\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 {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\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) {\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\n const childPk = row[childPkKey];\n if (childPk === null || childPk === undefined) continue;\n\n const seen = getRelationSeenSet(rootId, rel.name);\n if (seen.has(childPk)) continue;\n seen.add(childPk);\n\n if (rel.type === RelationKinds.HasOne) {\n if (!parent[rel.name]) {\n parent[rel.name] = buildChild(row, rel);\n }\n continue;\n }\n\n const bucket = parent[rel.name] as any[];\n bucket.push(buildChild(row, rel));\n }\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) {\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\n }\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 { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<any>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, any>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, 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\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, 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\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: 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\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: 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 { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\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 toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasOneReference<TChild> implements HasOneReference<TChild> {\r\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = this.root[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 toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\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 toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column.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: EntityContext, 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: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = 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 loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasOneRelation\r\n): Promise<Map<string, Record<string, any>>> => {\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 qb = 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 qb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, qb);\r\n const lookup = new Map<string, Record<string, any>>();\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 if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n\r\n return lookup;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, 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: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = 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, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\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: EntityContext,\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: EntityContext,\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\nconst 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 (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, any>>();\r\n cache.set(toKey(rootValue), data as Record<string, any>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, 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> | HasOneReference<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 | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, 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 { OrmSession } from './orm-session.ts';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityProxy, createEntityFromRow } from './entity.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport { HydrationContext } from './hydration-context.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\nconst executeWithEntityContext = async <TTable extends TableDef>(\r\n entityCtx: EntityContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> => {\r\n const ast = qb.getAST();\r\n const compiled = entityCtx.dialect.compileSelect(ast);\r\n const executed = await entityCtx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n\r\n if (ast.setOps && ast.setOps.length > 0) {\r\n return rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n }\r\n\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n session: OrmSession,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n return executeWithEntityContext(session, qb);\r\n}\r\n\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\r\n _execCtx: ExecutionContext,\r\n hydCtx: HydrationContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n const entityCtx = hydCtx.entityContext;\r\n if (!entityCtx) {\r\n throw new Error('Hydration context is missing an EntityContext');\r\n }\r\n return executeWithEntityContext(entityCtx, qb);\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\n\r\nimport { ColumnDef } from '../schema/column.js';\r\n\r\nimport { SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\r\n\r\nimport { HydrationPlan } from '../core/hydration/types.js';\r\n\r\nimport {\n\n ColumnNode,\n\n ExpressionNode,\n\n FunctionNode,\n\n LiteralNode,\n\n BinaryExpressionNode,\n\n CaseExpressionNode,\n\n WindowFunctionNode,\n\n and,\n\n exists,\n\n notExists\n\n} from '../core/ast/expression.js';\nimport { derivedTable } from '../core/ast/builders.js';\n\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\n\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\n\r\n\r\n\r\ntype SelectDialectInput = Dialect | DialectKey;\r\n\r\nimport { SelectQueryState } from './select-query-state.js';\r\n\r\nimport { HydrationManager } from './hydration-manager.js';\r\n\r\nimport {\r\n\r\n resolveSelectQueryBuilderDependencies,\r\n\r\n SelectQueryBuilderContext,\r\n\r\n SelectQueryBuilderDependencies,\r\n\r\n SelectQueryBuilderEnvironment\r\n\r\n} from './select-query-builder-deps.js';\r\n\r\nimport { QueryAstService } from './query-ast-service.js';\r\n\r\nimport { ColumnSelector } from './column-selector.js';\n\nimport { RelationManager } from './relation-manager.js';\n\nimport { RelationIncludeOptions } from './relation-types.js';\n\nimport type { RelationDef } from '../schema/relation.js';\n\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\n\r\nimport { Entity, RelationMap, RelationTargetTable } from '../schema/types.js';\n\r\nimport { OrmSession } from '../orm/orm-session.ts';\r\n\r\nimport { ExecutionContext } from '../orm/execution-context.js';\r\n\r\nimport { HydrationContext } from '../orm/hydration-context.js';\r\n\r\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\r\n\r\nimport { createJoinNode } from '../core/ast/join-node.js';\n\n\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\n\ntype DeepSelectConfig<TTable extends TableDef> = {\n root?: (keyof TTable['columns'] & string)[];\n} & {\n [K in keyof TTable['relations'] & string]?: (\n keyof RelationTargetTable<TTable['relations'][K]>['columns'] & string\n )[];\n};\n\ntype WhereHasOptions = {\n correlate?: ExpressionNode;\n};\n\ntype RelationCallback = <TChildTable extends TableDef>(\n qb: SelectQueryBuilder<any, TChildTable>\n) => SelectQueryBuilder<any, TChildTable>;\n\n\n/**\n\r\n * Main query builder class for constructing SQL SELECT queries\r\n\r\n * @typeParam T - Result type for projections (unused)\r\n\r\n * @typeParam TTable - Table definition being queried\r\n\r\n */\r\n\r\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\r\n\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n\r\n private readonly context: SelectQueryBuilderContext;\r\n\r\n private readonly columnSelector: ColumnSelector;\r\n\r\n private readonly relationManager: RelationManager;\r\n\r\n private readonly lazyRelations: Set<string>;\r\n\r\n\r\n\r\n /**\r\n\r\n * Creates a new SelectQueryBuilder instance\r\n\r\n * @param table - Table definition to query\r\n\r\n * @param state - Optional initial query state\r\n\r\n * @param hydration - Optional hydration manager\r\n\r\n * @param dependencies - Optional query builder dependencies\r\n\r\n */\r\n\r\n constructor(\r\n\r\n table: TTable,\r\n\r\n state?: SelectQueryState,\r\n\r\n hydration?: HydrationManager,\r\n\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n\r\n lazyRelations?: Set<string>\r\n\r\n ) {\r\n\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n\r\n this.env = { table, deps };\r\n\r\n const initialState = state ?? deps.createState(table);\r\n\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n\r\n this.context = {\r\n\r\n state: initialState,\r\n\r\n hydration: initialHydration\r\n\r\n };\r\n\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n\r\n this.columnSelector = new ColumnSelector(this.env);\r\n\r\n this.relationManager = new RelationManager(this.env);\r\n\r\n }\r\n\r\n\r\n\r\n private clone(\n\n context: SelectQueryBuilderContext = this.context,\n\n lazyRelations = new Set(this.lazyRelations)\n\n ): SelectQueryBuilder<T, TTable> {\n\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\n\n }\n\n /**\n * Applies an alias to the root FROM table.\n * @param alias - Alias to apply\n */\n as(alias: string): SelectQueryBuilder<T, TTable> {\n const from = this.context.state.ast.from;\n if (from.type !== 'Table') {\n throw new Error('Cannot alias non-table FROM sources');\n }\n const nextFrom = { ...from, alias };\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\n return this.clone(nextContext);\n }\n\r\n\r\n\r\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\n\n return typeof (query as any).getAST === 'function'\n\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\n\n : (query as SelectQueryNode);\n\n }\n\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\n if (!correlation) return ast;\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\n return {\n ...ast,\n where: combinedWhere\n };\n }\n\r\n\r\n\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n\r\n }\r\n\r\n\r\n\r\n private applyAst(\r\n\r\n context: SelectQueryBuilderContext,\r\n\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n\r\n const nextState = mutator(astService);\r\n\r\n return { state: nextState, hydration: context.hydration };\r\n\r\n }\r\n\r\n\r\n\r\n private applyJoin(\r\n\r\n context: SelectQueryBuilderContext,\r\n\r\n table: TableDef,\r\n\r\n condition: BinaryExpressionNode,\r\n\r\n kind: JoinKind\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const joinNode = createJoinNode(kind, table.name, condition);\r\n\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n\r\n }\r\n\r\n\r\n\r\n private applySetOperation(\r\n\r\n operator: SetOperationKind,\r\n\r\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const subAst = this.resolveQueryNode(query);\r\n\r\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Selects specific columns for the query\r\n\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n\r\n * @returns New query builder instance with selected columns\r\n\r\n */\r\n\r\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.select(this.context, columns));\n\n }\n\n\n /**\n * Selects columns from the root table by name (typed).\n * @param cols - Column names on the root table\n */\n selectColumns<K extends keyof TTable['columns'] & string>(...cols: K[]): SelectQueryBuilder<T, TTable> {\n const selection: Record<string, ColumnDef> = {};\n\n for (const key of cols) {\n const col = this.env.table.columns[key];\n if (!col) {\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\n }\n selection[key] = col;\n }\n\n return this.select(selection);\n }\n\n\r\n\r\n /**\r\n\r\n * Selects raw column expressions\r\n\r\n * @param cols - Column expressions as strings\r\n\r\n * @returns New query builder instance with raw column selections\r\n\r\n */\r\n\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a Common Table Expression (CTE) to the query\r\n\r\n * @param name - Name of the CTE\r\n\r\n * @param query - Query builder or query node for the CTE\r\n\r\n * @param columns - Optional column names for the CTE\r\n\r\n * @returns New query builder instance with the CTE\r\n\r\n */\r\n\r\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n\r\n const subAst = this.resolveQueryNode(query);\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n\r\n * @param name - Name of the CTE\r\n\r\n * @param query - Query builder or query node for the CTE\r\n\r\n * @param columns - Optional column names for the CTE\r\n\r\n * @returns New query builder instance with the recursive CTE\r\n\r\n */\r\n\r\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\n\n return this.clone(nextContext);\n\n }\n\n\n /**\n * Replaces the FROM clause with a derived table (subquery with alias)\n * @param subquery - Subquery to use as the FROM source\n * @param alias - Alias for the derived table\n * @param columnAliases - Optional column alias list\n * @returns New query builder instance with updated FROM\n */\n fromSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const fromNode = derivedTable(subAst, alias, columnAliases);\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\n return this.clone(nextContext);\n }\n\r\n\r\n\r\n /**\r\n\r\n * Selects a subquery as a column\r\n\r\n * @param alias - Alias for the subquery column\r\n\r\n * @param sub - Query builder or query node for the subquery\r\n\r\n * @returns New query builder instance with the subquery selection\r\n\r\n */\r\n\r\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n const query = this.resolveQueryNode(sub);\n\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\n\n }\n\n\n /**\n * Adds a JOIN against a derived table (subquery with alias)\n * @param subquery - Subquery to join\n * @param alias - Alias for the derived table\n * @param condition - Join condition expression\n * @param joinKind - Join kind (defaults to INNER)\n * @param columnAliases - Optional column alias list for the derived table\n * @returns New query builder instance with the derived-table join\n */\n joinSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n condition: BinaryExpressionNode,\n joinKind: JoinKind = JOIN_KINDS.INNER,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\n return this.clone(nextContext);\n }\n\n\r\n\r\n /**\r\n\r\n * Adds an INNER JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the INNER JOIN\r\n\r\n */\r\n\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a LEFT JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the LEFT JOIN\r\n\r\n */\r\n\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a RIGHT JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the RIGHT JOIN\r\n\r\n */\r\n\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Matches records based on a relationship\r\n\r\n * @param relationName - Name of the relationship to match\r\n\r\n * @param predicate - Optional predicate expression\r\n\r\n * @returns New query builder instance with the relationship match\r\n\r\n */\r\n\r\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Joins a related table\r\n\r\n * @param relationName - Name of the relationship to join\r\n\r\n * @param joinKind - Type of join (defaults to INNER)\r\n\r\n * @param extraCondition - Optional additional join condition\r\n\r\n * @returns New query builder instance with the relationship join\r\n\r\n */\r\n\r\n joinRelation(\r\n\r\n relationName: string,\r\n\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n\r\n extraCondition?: ExpressionNode\r\n\r\n ): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Includes related data in the query results\r\n\r\n * @param relationName - Name of the relationship to include\r\n\r\n * @param options - Optional include options\r\n\r\n * @returns New query builder instance with the relationship inclusion\r\n\r\n */\r\n\r\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\n\n const nextLazy = new Set(this.lazyRelations);\n\n nextLazy.add(relationName as string);\n\n return this.clone(this.context, nextLazy);\n\n }\n\n /**\n * Selects columns for a related table in a single hop.\n */\n selectRelationColumns<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, ...cols: C[]): SelectQueryBuilder<T, TTable> {\n const relation = this.env.table.relations[relationName] as RelationDef | undefined;\n if (!relation) {\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n }\n const target = relation.target;\n\n for (const col of cols) {\n if (!target.columns[col]) {\n throw new Error(\n `Column '${col}' not found on related table '${target.name}' for relation '${relationName}'`\n );\n }\n }\n\n return this.include(relationName as string, { columns: cols as string[] });\n }\n\n\n /**\n * Convenience alias for selecting specific columns from a relation.\n */\n includePick<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\n return this.selectRelationColumns(relationName, ...cols);\n }\n\n\n /**\n * Selects columns for the root table and relations from a single config object.\n */\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\n let qb: SelectQueryBuilder<T, TTable> = this;\n\n if (config.root?.length) {\n qb = qb.selectColumns(...config.root);\n }\n\n for (const key of Object.keys(config) as (keyof typeof config)[]) {\n if (key === 'root') continue;\n const relName = key as keyof TTable['relations'] & string;\n const cols = config[relName as keyof DeepSelectConfig<TTable>] as string[] | undefined;\n if (!cols || !cols.length) continue;\n qb = qb.selectRelationColumns(relName, ...(cols as string[]));\n }\n\n return qb;\n }\n\n\r\n\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n\r\n }\r\n\r\n\r\n\r\n getTable(): TTable {\r\n\r\n return this.env.table as TTable;\r\n\r\n }\r\n\r\n\r\n\r\n async execute(ctx: OrmSession): Promise<Entity<TTable>[]> {\r\n\r\n return executeHydrated(ctx, this);\r\n\r\n }\r\n\r\n\r\n\r\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<Entity<TTable>[]> {\r\n\r\n return executeHydratedWithContexts(execCtx, hydCtx, this);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE condition to the query\r\n\r\n * @param expr - Expression for the WHERE clause\r\n\r\n * @returns New query builder instance with the WHERE condition\r\n\r\n */\r\n\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a GROUP BY clause to the query\r\n\r\n * @param col - Column definition or column node to group by\r\n\r\n * @returns New query builder instance with the GROUP BY clause\r\n\r\n */\r\n\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a HAVING condition to the query\r\n\r\n * @param expr - Expression for the HAVING clause\r\n\r\n * @returns New query builder instance with the HAVING condition\r\n\r\n */\r\n\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds an ORDER BY clause to the query\r\n\r\n * @param col - Column definition or column node to order by\r\n\r\n * @param direction - Order direction (defaults to ASC)\r\n\r\n * @returns New query builder instance with the ORDER BY clause\r\n\r\n */\r\n\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a DISTINCT clause to the query\r\n\r\n * @param cols - Columns to make distinct\r\n\r\n * @returns New query builder instance with the DISTINCT clause\r\n\r\n */\r\n\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a LIMIT clause to the query\r\n\r\n * @param n - Maximum number of rows to return\r\n\r\n * @returns New query builder instance with the LIMIT clause\r\n\r\n */\r\n\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds an OFFSET clause to the query\r\n\r\n * @param n - Number of rows to skip\r\n\r\n * @returns New query builder instance with the OFFSET clause\r\n\r\n */\r\n\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using UNION\r\n\r\n * @param query - Query to union with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('UNION', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using UNION ALL\r\n\r\n * @param query - Query to union with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('UNION ALL', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using INTERSECT\r\n\r\n * @param query - Query to intersect with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('INTERSECT', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using EXCEPT\r\n\r\n * @param query - Query to subtract\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('EXCEPT', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE EXISTS condition to the query\r\n\r\n * @param subquery - Subquery to check for existence\r\n\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n\r\n */\r\n\r\n whereExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(exists(correlated));\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n\r\n * @param subquery - Subquery to check for non-existence\r\n\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n\r\n */\r\n\r\n whereNotExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(notExists(correlated));\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n\r\n * @param relationName - Name of the relationship to check\r\n\r\n * @param callback - Optional callback to modify the relationship query\r\n\r\n * @returns New query builder instance with the relationship existence check\r\n\r\n */\r\n\r\n whereHas(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n\r\n }\r\n\r\n\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\r\n\r\n\r\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(exists(finalSubAst));\n\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n\r\n * @param relationName - Name of the relationship to check\r\n\r\n * @param callback - Optional callback to modify the relationship query\r\n\r\n * @returns New query builder instance with the relationship non-existence check\r\n\r\n */\r\n\r\n whereHasNot(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n\r\n }\r\n\r\n\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(notExists(finalSubAst));\n\n }\n\r\n\r\n\r\n /**\r\n\r\n * Compiles the query to SQL for a specific dialect\r\n\r\n * @param dialect - Database dialect to compile for\r\n\r\n * @returns Compiled query with SQL and parameters\r\n\r\n */\r\n\r\n compile(dialect: SelectDialectInput): CompiledQuery {\r\n\r\n const resolved = resolveDialectInput(dialect);\r\n\r\n return resolved.compileSelect(this.context.state.ast);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Converts the query to SQL string for a specific dialect\r\n\r\n * @param dialect - Database dialect to generate SQL for\r\n\r\n * @returns SQL string representation of the query\r\n\r\n */\r\n\r\n toSql(dialect: SelectDialectInput): string {\r\n\r\n return this.compile(dialect).sql;\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Gets the hydration plan for the query\r\n\r\n * @returns Hydration plan or undefined if none exists\r\n\r\n */\r\n\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n\r\n return this.context.hydration.getPlan();\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n\r\n * @returns Query AST with hydration applied\r\n\r\n */\r\n\r\n getAST(): SelectQueryNode {\r\n\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n\r\n * Creates a column node for use in expressions\r\n\r\n * @param table - Table name\r\n\r\n * @param name - Column name\r\n\r\n * @returns ColumnNode with the specified table and name\r\n\r\n */\r\n\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n\r\n\r\n/**\r\n\r\n * Creates a literal value node for use in expressions\r\n\r\n * @param val - Literal value (string or number)\r\n\r\n * @returns LiteralNode with the specified value\r\n\r\n */\r\n\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nconst isTableDef = (value: unknown): value is TableDef => {\n return typeof value === 'object' && value !== null && 'columns' in (value as TableDef);\n};\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\nexport const getTableDefFromEntity = (ctor: EntityConstructor): TableDef | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n return meta.table;\n};\n\nexport const selectFromEntity = <TTable extends TableDef>(\n ctor: EntityConstructor\n): SelectQueryBuilder<any, TTable> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error('Entity metadata has not been bootstrapped');\n }\n return new SelectQueryBuilder(table as TTable);\n};\n"],"mappings":"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","names":["normalizePropertyName","resolveConstructor","propertyName","ctor","state","hydration","relationSelectionResult","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasOne","hasMany","belongsTo"]}
1
+ {"version":3,"sources":["../../src/schema/table.ts","../../src/orm/entity-metadata.ts","../../src/decorators/decorator-metadata.ts","../../src/decorators/entity.ts","../../src/decorators/column.ts","../../src/schema/relation.ts","../../src/decorators/relations.ts","../../src/core/ast/expression-nodes.ts","../../src/core/ast/expression-builders.ts","../../src/core/sql/sql.ts","../../src/core/ast/aggregate-functions.ts","../../src/core/ast/builders.ts","../../src/core/functions/standard-strategy.ts","../../src/core/dialect/abstract.ts","../../src/core/dialect/base/function-table-formatter.ts","../../src/core/dialect/base/pagination-strategy.ts","../../src/core/dialect/base/cte-compiler.ts","../../src/core/dialect/base/returning-strategy.ts","../../src/core/dialect/base/join-compiler.ts","../../src/core/dialect/base/groupby-compiler.ts","../../src/core/dialect/base/orderby-compiler.ts","../../src/core/dialect/base/sql-dialect.ts","../../src/core/dialect/postgres/functions.ts","../../src/core/dialect/postgres/index.ts","../../src/core/dialect/mysql/functions.ts","../../src/core/dialect/mysql/index.ts","../../src/core/dialect/sqlite/functions.ts","../../src/core/dialect/sqlite/index.ts","../../src/core/dialect/mssql/functions.ts","../../src/core/dialect/mssql/index.ts","../../src/core/dialect/dialect-factory.ts","../../src/query-builder/select-query-state.ts","../../src/core/ast/join-node.ts","../../src/query-builder/hydration-manager.ts","../../src/query-builder/relation-alias.ts","../../src/query-builder/relation-utils.ts","../../src/query-builder/hydration-planner.ts","../../src/query-builder/raw-column-parser.ts","../../src/query-builder/query-ast-service.ts","../../src/query-builder/relation-projection-helper.ts","../../src/query-builder/relation-conditions.ts","../../src/core/ast/join-metadata.ts","../../src/query-builder/relation-service.ts","../../src/query-builder/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/has-one.ts","../../src/orm/relations/belongs-to.ts","../../src/orm/relations/many-to-many.ts","../../src/orm/lazy-batch.ts","../../src/orm/entity.ts","../../src/orm/execute.ts","../../src/query-builder/select.ts","../../src/decorators/bootstrap.ts"],"sourcesContent":["import type { ColumnDef } from './column.js';\nimport type { 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;\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\n}\n\n/**\n * Definition of a database table with its columns and relationships\n * @typeParam T - Type of the columns record\n */\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\n/**\n * Creates a table definition with columns and relationships\n * @typeParam T - Type of the columns record\n * @param name - Name of the table\n * @param columns - Record of column definitions\n * @param relations - Record of relationship definitions (optional)\n * @returns Complete table definition with runtime-filled column metadata\n *\n * @example\n * ```typescript\n * const usersTable = defineTable('users', {\n * id: col.primaryKey(col.int()),\n * name: col.varchar(255),\n * email: col.varchar(255)\n * });\n * ```\n */\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","import { ColumnType, ColumnDef } from '../schema/column.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\nexport type EntityConstructor = new (...args: any[]) => any;\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\nexport type ColumnDefLike = Omit<ColumnDef, 'name' | 'table'>;\n\ninterface BaseRelationMetadata {\n propertyKey: string;\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n}\n\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasMany;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasOne;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsTo;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsToMany;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n}\n\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\nexport interface EntityMetadata {\n target: EntityConstructor;\n tableName: string;\n columns: Record<string, ColumnDefLike>;\n relations: Record<string, RelationMetadata>;\n hooks?: TableHooks;\n table?: TableDef;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.columns[propertyKey] = { ...column };\n};\n\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\nexport const buildTableDef = (meta: EntityMetadata): TableDef => {\n if (meta.table) {\n return meta.table;\n }\n\n const columns = Object.entries(meta.columns).reduce<Record<string, ColumnDef>>((acc, [key, def]) => {\n acc[key] = {\n ...def,\n name: key,\n table: meta.tableName\n };\n return acc;\n }, {});\n\n const table = defineTable(meta.tableName, columns, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n addInitializer?(initializer: (this: unknown) => void): void;\n static?: boolean;\n private?: boolean;\n}\n\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\nexport interface DualModeClassDecorator {\n <TFunction extends Function>(value: TFunction): void | TFunction;\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as any);\n};\n\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\nexport const registerInitializer = (\n context: StandardDecoratorContext,\n initializer: (this: unknown) => void\n): void => {\n context.addInitializer?.(initializer);\n};\n","import { TableHooks } from '../schema/table.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: Function): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (!meta.columns[entry.propertyName]) {\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n }\n for (const entry of bag.relations) {\n if (!meta.relations[entry.propertyName]) {\n addRelationMetadata(ctor, entry.propertyName, entry.relation);\n }\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n notNull?: boolean;\n primary?: boolean;\n}\n\nexport type ColumnInput = ColumnOptions | ColumnDef;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as any).constructor === 'function') {\n return (target as any).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n registerInitializer(context, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerColumn(ctor, propertyName, column);\n });\n};\n\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as any).constructor === 'function') {\n return (instanceOrCtor as any).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n\n registerInitializer(ctx, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerRelation(ctor, propertyName, relationMetadata);\n });\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","import type { SelectQueryNode, OrderByNode } from './query.js';\nimport { SqlOperator } from '../sql/sql.js';\nimport { ColumnRef } from './types.js';\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 {\n type: 'Column';\n /** Table name the column belongs to */\n table: string;\n /** Column name */\n name: string;\n /** Optional alias for the column */\n alias?: string;\n /** Optional scope marker (e.g., 'outer' for correlated references) */\n scope?: 'outer' | 'default';\n}\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\n type: 'Function';\n /** Function name (e.g., COUNT, SUM) */\n name: string;\n /** Optional canonical function key for dialect-aware rendering */\n fn?: string;\n /** Function arguments */\n args: OperandNode[];\n /** Optional alias for the function result */\n alias?: string;\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\n orderBy?: OrderByNode[];\n /** Optional separator argument used by GROUP_CONCAT-like functions */\n separator?: OperandNode;\n /** Optional DISTINCT modifier */\n distinct?: boolean;\n}\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 = (\n node: ColumnRef | FunctionNode | CaseExpressionNode | WindowFunctionNode\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\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 { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.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\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n return {\r\n type: 'Literal',\r\n value\r\n } as LiteralNode;\r\n};\r\n\r\nconst toNode = (col: ColumnRef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnRef;\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 isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n if (isLiteralValue(val)) {\r\n return valueToOperand(val);\r\n }\r\n\r\n return toNode(val);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\n/**\n * Marks a column reference as an outer-scope reference for correlated subqueries.\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\n */\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\n ...columnOperand(col),\n scope: 'outer'\n});\n\n/**\n * Creates an outer-scoped column reference using a specific table or alias name.\n */\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: 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 | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: 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 | ColumnRef): 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 | ColumnRef,\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 | ColumnRef, 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 | ColumnRef, 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 | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: 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 | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","/**\r\n * 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 { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\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\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n column: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n","import { ColumnNode } from './expression-nodes.js';\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Builds or normalizes a column AST node from a column definition or existing node\n * @param table - Table definition providing a default table name\n * @param column - Column definition or existing column node\n */\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\n if ((column as ColumnNode).type === 'Column') {\n return column as ColumnNode;\n }\n\n const def = column as ColumnRef;\n const baseTable = def.table\n ? table.alias && def.table === table.name\n ? table.alias\n : def.table\n : table.alias || table.name;\n\n return {\n type: 'Column',\n table: baseTable,\n name: def.name\n };\n};\n\n/**\n * Builds column AST nodes for a list of column names\n * @param table - Table definition providing the table name\n * @param names - Column names\n */\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\n names.map(name => ({\n type: 'Column',\n table: table.alias || table.name,\n name\n }));\n\n/**\n * Builds a table AST node for the provided table definition\n * @param table - Table definition\n */\nexport const createTableNode = (table: TableRef): TableNode => ({\n type: 'Table',\n name: table.name\n});\n\n/**\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\n */\nexport const fnTable = (name: string, args: any[] = [], alias?: string, opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n): DerivedTableNode => ({\n type: 'DerivedTable',\n query,\n alias,\n columnAliases\n});\n","import { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport { LiteralNode, OperandNode } from '../ast/expression.js';\n\r\nexport class StandardFunctionStrategy implements FunctionStrategy {\r\n protected renderers: Map<string, FunctionRenderer> = new Map();\r\n\r\n constructor() {\r\n this.registerStandard();\r\n }\r\n\r\n protected registerStandard() {\n // Register ANSI standard implementations\n this.add('COUNT', ({ compiledArgs }) => `COUNT(${compiledArgs.join(', ')})`);\n this.add('SUM', ({ compiledArgs }) => `SUM(${compiledArgs[0]})`);\n this.add('AVG', ({ compiledArgs }) => `AVG(${compiledArgs[0]})`);\n this.add('MIN', ({ compiledArgs }) => `MIN(${compiledArgs[0]})`);\n this.add('MAX', ({ compiledArgs }) => `MAX(${compiledArgs[0]})`);\n this.add('ABS', ({ compiledArgs }) => `ABS(${compiledArgs[0]})`);\n this.add('UPPER', ({ compiledArgs }) => `UPPER(${compiledArgs[0]})`);\n this.add('LOWER', ({ compiledArgs }) => `LOWER(${compiledArgs[0]})`);\n this.add('LENGTH', ({ compiledArgs }) => `LENGTH(${compiledArgs[0]})`);\r\n this.add('TRIM', ({ compiledArgs }) => `TRIM(${compiledArgs[0]})`);\r\n this.add('LTRIM', ({ compiledArgs }) => `LTRIM(${compiledArgs[0]})`);\r\n this.add('RTRIM', ({ compiledArgs }) => `RTRIM(${compiledArgs[0]})`);\r\n this.add('SUBSTRING', ({ compiledArgs }) => `SUBSTRING(${compiledArgs.join(', ')})`);\r\n this.add('CONCAT', ({ compiledArgs }) => `CONCAT(${compiledArgs.join(', ')})`);\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURRENT_DATE`);\r\n this.add('CURRENT_TIME', () => `CURRENT_TIME`);\r\n this.add('EXTRACT', ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`);\r\n this.add('YEAR', ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})`);\r\n this.add('MONTH', ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})`);\r\n this.add('DAY', ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})`);\r\n this.add('DATE_ADD', ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_SUB', ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_DIFF', ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('UNIX_TIMESTAMP', () => `UNIX_TIMESTAMP()`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})`);\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})`);\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})`);\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})`);\n this.add('DATE_TRUNC', ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})`);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\r\n\r\n protected add(name: string, renderer: FunctionRenderer) {\r\n this.renderers.set(name, renderer);\r\n }\r\n\r\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = this.formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n }\n\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => `${ctx.compileOperand(order.column)} ${order.direction}`);\n return `ORDER BY ${parts.join(', ')}`;\n }\n\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n }\n\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? StandardFunctionStrategy.DEFAULT_GROUP_CONCAT_SEPARATOR;\n }\n\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n };\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\r\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.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 /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n ctx: CompilerContext\r\n ): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(kind: SetOperationKind): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\r\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\r\n protected readonly functionStrategy: FunctionStrategy;\r\n\r\n protected constructor(functionStrategy?: FunctionStrategy) {\r\n this.expressionCompilers = new Map();\r\n this.operandCompilers = new Map();\r\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy): Dialect {\r\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy);\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 this.compileFunctionOperand(fnNode, ctx)\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 /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\n if (renderer) {\n return renderer({\n node: fnNode,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx)\n });\n }\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\n }\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { SqlDialectBase } from './sql-dialect.js';\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args, dialect);\r\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: any) => {\r\n if (ctx && dialect) {\r\n return (dialect as any).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string, dialect?: SqlDialectBase): string {\r\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.name) : fn.name;\r\n return `${schemaPart}${quoted}(${args})${ordinality}`;\r\n }\r\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n /**\r\n * Compiles all JOIN clauses from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing join definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param compileFrom - Function to compile table sources (tables or subqueries).\r\n * @param compileExpression - Function to compile join condition expressions.\r\n * @returns SQL JOIN clauses (e.g., \" LEFT JOIN table ON condition\") or empty string if no joins.\r\n */\r\n static compileJoins(ast: SelectQueryNode, ctx: CompilerContext, compileFrom: (from: any, ctx: CompilerContext) => string, compileExpression: (expr: any, ctx: CompilerContext) => string): string {\r\n if (!ast.joins || ast.joins.length === 0) return '';\r\n const parts = ast.joins.map(j => {\r\n const table = compileFrom(j.table as any, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy\r\n .map(c => `${quoteIdentifier(c.table)}.${quoteIdentifier(c.name)}`)\r\n .join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy\r\n .map(o => `${quoteIdentifier(o.column.table)}.${quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode, FunctionTableNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\r\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\r\nimport { CteCompiler } from './cte-compiler.js';\r\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\r\nimport { JoinCompiler } from './join-compiler.js';\r\nimport { GroupByCompiler } from './groupby-compiler.js';\r\nimport { OrderByCompiler } from './orderby-compiler.js';\r\n\r\n\r\nexport abstract class SqlDialectBase extends Dialect {\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\r\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\r\n\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = CteCompiler.compileCtes(\r\n ast,\r\n ctx,\r\n this.quoteIdentifier.bind(this),\r\n this.compileSelectAst.bind(this),\r\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\r\n this.stripTrailingSemicolon.bind(this)\r\n );\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\r\n }\r\n\r\n private compileSelectWithSetOps(\r\n ast: SelectQueryNode,\r\n baseSelect: string,\r\n ctes: string,\r\n ctx: CompilerContext\r\n ): string {\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n return `${ctes}${combined}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.into);\r\n const columnList = this.compileInsertColumnList(ast.columns);\r\n const values = this.compileInsertValues(ast.values, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n return this.returningStrategy.compileReturning(returning, ctx);\r\n }\r\n\r\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\r\n private compileInsertValues(values: any[][], ctx: CompilerContext): string {\r\n return values\r\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\r\n .join(', ');\r\n }\r\n\r\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const columns = this.compileSelectColumns(ast, ctx);\r\n const from = this.compileFrom(ast.from, ctx);\r\n const joins = JoinCompiler.compileJoins(ast, ctx, this.compileFrom.bind(this), this.compileExpression.bind(this));\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const groupBy = GroupByCompiler.compileGroupBy(ast, this.quoteIdentifier.bind(this));\r\n const having = this.compileHaving(ast, ctx);\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.table);\r\n const assignments = this.compileUpdateAssignments(ast.set, ctx);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\r\n }\r\n\r\n private compileUpdateAssignments(\r\n assignments: { column: ColumnNode; value: any }[],\r\n ctx: CompilerContext\r\n ): string {\r\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.quoteIdentifier(col.name);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.from);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `DELETE FROM ${table}${whereClause}${returning}`;\r\n }\r\n\r\n protected formatReturningColumns(returning: ColumnNode[]): string {\r\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\r\n }\r\n\r\n protected compileDistinct(ast: SelectQueryNode): string {\r\n return ast.distinct ? 'DISTINCT ' : '';\r\n }\r\n\r\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n return ast.columns.map(c => {\r\n const expr = this.compileOperand(c, ctx);\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\r\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast as any;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\r\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.having) return '';\r\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\r\n }\r\n\r\n protected stripTrailingSemicolon(sql: string): string {\r\n return sql.trim().replace(/;$/, '');\r\n }\r\n\r\n protected wrapSetOperand(sql: string): string {\r\n const trimmed = this.stripTrailingSemicolon(sql);\r\n return `(${trimmed})`;\r\n }\r\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\n });\n\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\n });\n\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n return `DATE_TRUNC('${partClean}', ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { PostgresFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n }\r\n}\r\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\nimport { FunctionRenderContext } from '../../functions/types.js';\nimport { LiteralNode } from '../../ast/expression.js';\n\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `GROUP_CONCAT(${arg}, ${separator})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { SqliteFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * SQLite dialect implementation\r\n */\r\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n }\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 {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQLite uses json_extract(col, '$.path')\r\n return `json_extract(${col}, '${node.path}')`;\r\n }\r\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 protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `DATEPART(wk, ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n // SQL Server 2022+ has DATETRUNC\n return `DATETRUNC(${partClean}, ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n const orderClause = this.buildOrderByExpression(ctx);\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\n });\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode } from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { FunctionTableFormatter } from '../base/function-table-formatter.js';\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n protected readonly dialect = 'mssql';\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super(new MssqlFunctionStrategy());\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 hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = this.compileCtes(ast, ctx);\r\n\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n const tail = pagination || orderBy;\r\n return `${ctes}${combined}${tail}`;\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 {\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\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 => {\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\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileTableSource(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileTableSource(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\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 = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n\r\n if (pagination) {\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\r\n }\r\n\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\r\n }\r\n\r\n private compileOrderBy(ast: SelectQueryNode): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n return ' ORDER BY ' + ast.orderBy\r\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n }\r\n\r\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\r\n const off = ast.offset ?? 0;\r\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\r\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\r\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileTableSource(table: TableSourceNode, ctx: CompilerContext): string {\n if (table.type === 'FunctionTable') {\n return FunctionTableFormatter.format(table, ctx, this as any);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table, ctx);\n }\n const base = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`\n : this.quoteIdentifier(table.name);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileDerivedTable(table: DerivedTableNode, ctx: CompilerContext): string {\n const sub = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx).trim().replace(/;$/, '');\n const cols = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${sub}) AS ${this.quoteIdentifier(table.alias)}${cols}`;\n }\n\r\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\r\n const defs = ast.ctes.map(cte => {\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(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `WITH ${defs} `;\r\n }\r\n\r\n private wrapSetOperand(sql: string): string {\r\n const trimmed = sql.trim().replace(/;$/, '');\r\n return `(${trimmed})`;\r\n }\r\n}\r\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode, TableSourceNode } 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 {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\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';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode, FunctionTableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? ({ type: 'Table', name: tableName } as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\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/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\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, TableSourceNode } 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(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\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 {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\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\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\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 {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withGroupBy([node]);\n }\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 {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\n }\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, rootAlias?: string): ExpressionNode => {\n const rootTable = rootAlias || root.name;\n const defaultLocalKey =\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\n ? findPrimaryKey(root)\n : findPrimaryKey(relation.target);\n const localKey = relation.localKey || defaultLocalKey;\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne:\n return eq(\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\n { type: 'Column', table: rootTable, name: localKey }\n );\n case RelationKinds.BelongsTo:\n return eq(\n { type: 'Column', table: relation.target.name, name: localKey },\n { type: 'Column', table: rootTable, name: relation.foreignKey }\n );\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\n root: TableDef,\n relationName: string,\n relation: BelongsToManyRelation,\n joinKind: JoinKind,\n extra?: ExpressionNode,\n rootAlias?: string\n): JoinNode[] => {\n const rootKey = relation.localKey || findPrimaryKey(root);\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\n const rootTable = rootAlias || root.name;\n\n const pivotCondition = eq(\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\n { type: 'Column', table: rootTable, name: rootKey }\n );\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 = (\n root: TableDef,\n relation: RelationDef,\n extra?: ExpressionNode,\n rootAlias?: string\n): ExpressionNode => {\n const base = baseRelationCondition(root, relation, rootAlias);\n return extra ? and(base, extra) : base;\n};\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n return baseRelationCondition(root, relation, rootAlias);\n};\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.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';\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\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(\n relationName: string,\n predicate?: ExpressionNode\n ): RelationResult {\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\n const pk = findPrimaryKey(this.table);\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\n return { state: nextState, hydration: joined.hydration };\n }\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\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(\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n const relation = this.getRelation(relationName);\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\n if (additionalCorrelation) {\n correlation = and(correlation, additionalCorrelation);\n }\n const whereInSubquery = ast.where\n ? and(correlation, ast.where)\n : correlation;\n\n return {\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\n state: SelectQueryState,\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode\n ): SelectQueryState {\n const relation = this.getRelation(relationName);\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\n if (relation.type === RelationKinds.BelongsToMany) {\n const joins = buildBelongsToManyJoins(\n this.table,\n relationName,\n relation as BelongsToManyRelation,\n joinKind,\n extraCondition,\n rootAlias\n );\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\n }\n\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition, rootAlias);\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\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 {\n return this.createQueryAstService(this.table, state);\n }\n\n private rootTableName(): string {\n const from = this.state.ast.from;\n if (from.type === 'Table' && from.alias) return from.alias;\n return this.table.name;\n }\n}\n\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 {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\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) {\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\n const childPk = row[childPkKey];\n if (childPk === null || childPk === undefined) continue;\n\n const seen = getRelationSeenSet(rootId, rel.name);\n if (seen.has(childPk)) continue;\n seen.add(childPk);\n\n if (rel.type === RelationKinds.HasOne) {\n if (!parent[rel.name]) {\n parent[rel.name] = buildChild(row, rel);\n }\n continue;\n }\n\n const bucket = parent[rel.name] as any[];\n bucket.push(buildChild(row, rel));\n }\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) {\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\n }\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 { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<any>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, any>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, 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\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, 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\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: 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\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: 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 { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\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 toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasOneReference<TChild> implements HasOneReference<TChild> {\r\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = this.root[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 toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\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: EntityContext,\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 hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\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 toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column.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: EntityContext, 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: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = 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 loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasOneRelation\r\n): Promise<Map<string, Record<string, any>>> => {\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 qb = 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 qb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, qb);\r\n const lookup = new Map<string, Record<string, any>>();\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 if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n\r\n return lookup;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, 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: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = 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, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\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: EntityContext,\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: EntityContext,\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\nconst 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 (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, any>>();\r\n cache.set(toKey(rootValue), data as Record<string, any>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, 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> | HasOneReference<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 | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, 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 { OrmSession } from './orm-session.ts';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityProxy, createEntityFromRow } from './entity.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport { HydrationContext } from './hydration-context.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\nconst executeWithEntityContext = async <TTable extends TableDef>(\r\n entityCtx: EntityContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> => {\r\n const ast = qb.getAST();\r\n const compiled = entityCtx.dialect.compileSelect(ast);\r\n const executed = await entityCtx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n\r\n if (ast.setOps && ast.setOps.length > 0) {\r\n return rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n }\r\n\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n session: OrmSession,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n return executeWithEntityContext(session, qb);\r\n}\r\n\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\r\n _execCtx: ExecutionContext,\r\n hydCtx: HydrationContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n const entityCtx = hydCtx.entityContext;\r\n if (!entityCtx) {\r\n throw new Error('Hydration context is missing an EntityContext');\r\n }\r\n return executeWithEntityContext(entityCtx, qb);\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\n\r\nimport { ColumnDef } from '../schema/column.js';\r\n\r\nimport { SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\r\n\r\nimport { HydrationPlan } from '../core/hydration/types.js';\r\n\r\nimport {\n\n ColumnNode,\n\n ExpressionNode,\n\n FunctionNode,\n\n LiteralNode,\n\n BinaryExpressionNode,\n\n CaseExpressionNode,\n\n WindowFunctionNode,\n\n and,\n\n exists,\n\n notExists\n\n} from '../core/ast/expression.js';\nimport { derivedTable } from '../core/ast/builders.js';\n\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\n\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\n\r\n\r\n\r\ntype SelectDialectInput = Dialect | DialectKey;\r\n\r\nimport { SelectQueryState } from './select-query-state.js';\r\n\r\nimport { HydrationManager } from './hydration-manager.js';\r\n\r\nimport {\r\n\r\n resolveSelectQueryBuilderDependencies,\r\n\r\n SelectQueryBuilderContext,\r\n\r\n SelectQueryBuilderDependencies,\r\n\r\n SelectQueryBuilderEnvironment\r\n\r\n} from './select-query-builder-deps.js';\r\n\r\nimport { QueryAstService } from './query-ast-service.js';\r\n\r\nimport { ColumnSelector } from './column-selector.js';\n\nimport { RelationManager } from './relation-manager.js';\n\nimport { RelationIncludeOptions } from './relation-types.js';\n\nimport type { RelationDef } from '../schema/relation.js';\n\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\n\r\nimport { Entity, RelationMap, RelationTargetTable } from '../schema/types.js';\n\r\nimport { OrmSession } from '../orm/orm-session.ts';\r\n\r\nimport { ExecutionContext } from '../orm/execution-context.js';\r\n\r\nimport { HydrationContext } from '../orm/hydration-context.js';\r\n\r\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\r\n\r\nimport { createJoinNode } from '../core/ast/join-node.js';\n\n\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\n\ntype DeepSelectConfig<TTable extends TableDef> = {\n root?: (keyof TTable['columns'] & string)[];\n} & {\n [K in keyof TTable['relations'] & string]?: (\n keyof RelationTargetTable<TTable['relations'][K]>['columns'] & string\n )[];\n};\n\ntype WhereHasOptions = {\n correlate?: ExpressionNode;\n};\n\ntype RelationCallback = <TChildTable extends TableDef>(\n qb: SelectQueryBuilder<any, TChildTable>\n) => SelectQueryBuilder<any, TChildTable>;\n\n\n/**\n\r\n * Main query builder class for constructing SQL SELECT queries\r\n\r\n * @typeParam T - Result type for projections (unused)\r\n\r\n * @typeParam TTable - Table definition being queried\r\n\r\n */\r\n\r\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\r\n\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n\r\n private readonly context: SelectQueryBuilderContext;\r\n\r\n private readonly columnSelector: ColumnSelector;\r\n\r\n private readonly relationManager: RelationManager;\r\n\r\n private readonly lazyRelations: Set<string>;\r\n\r\n\r\n\r\n /**\r\n\r\n * Creates a new SelectQueryBuilder instance\r\n\r\n * @param table - Table definition to query\r\n\r\n * @param state - Optional initial query state\r\n\r\n * @param hydration - Optional hydration manager\r\n\r\n * @param dependencies - Optional query builder dependencies\r\n\r\n */\r\n\r\n constructor(\r\n\r\n table: TTable,\r\n\r\n state?: SelectQueryState,\r\n\r\n hydration?: HydrationManager,\r\n\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n\r\n lazyRelations?: Set<string>\r\n\r\n ) {\r\n\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n\r\n this.env = { table, deps };\r\n\r\n const initialState = state ?? deps.createState(table);\r\n\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n\r\n this.context = {\r\n\r\n state: initialState,\r\n\r\n hydration: initialHydration\r\n\r\n };\r\n\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n\r\n this.columnSelector = new ColumnSelector(this.env);\r\n\r\n this.relationManager = new RelationManager(this.env);\r\n\r\n }\r\n\r\n\r\n\r\n private clone(\n\n context: SelectQueryBuilderContext = this.context,\n\n lazyRelations = new Set(this.lazyRelations)\n\n ): SelectQueryBuilder<T, TTable> {\n\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\n\n }\n\n /**\n * Applies an alias to the root FROM table.\n * @param alias - Alias to apply\n */\n as(alias: string): SelectQueryBuilder<T, TTable> {\n const from = this.context.state.ast.from;\n if (from.type !== 'Table') {\n throw new Error('Cannot alias non-table FROM sources');\n }\n const nextFrom = { ...from, alias };\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\n return this.clone(nextContext);\n }\n\r\n\r\n\r\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\n\n return typeof (query as any).getAST === 'function'\n\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\n\n : (query as SelectQueryNode);\n\n }\n\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\n if (!correlation) return ast;\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\n return {\n ...ast,\n where: combinedWhere\n };\n }\n\r\n\r\n\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n\r\n }\r\n\r\n\r\n\r\n private applyAst(\r\n\r\n context: SelectQueryBuilderContext,\r\n\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n\r\n const nextState = mutator(astService);\r\n\r\n return { state: nextState, hydration: context.hydration };\r\n\r\n }\r\n\r\n\r\n\r\n private applyJoin(\r\n\r\n context: SelectQueryBuilderContext,\r\n\r\n table: TableDef,\r\n\r\n condition: BinaryExpressionNode,\r\n\r\n kind: JoinKind\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const joinNode = createJoinNode(kind, table.name, condition);\r\n\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n\r\n }\r\n\r\n\r\n\r\n private applySetOperation(\r\n\r\n operator: SetOperationKind,\r\n\r\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\r\n\r\n ): SelectQueryBuilderContext {\r\n\r\n const subAst = this.resolveQueryNode(query);\r\n\r\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Selects specific columns for the query\r\n\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n\r\n * @returns New query builder instance with selected columns\r\n\r\n */\r\n\r\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.select(this.context, columns));\n\n }\n\n\n /**\n * Selects columns from the root table by name (typed).\n * @param cols - Column names on the root table\n */\n selectColumns<K extends keyof TTable['columns'] & string>(...cols: K[]): SelectQueryBuilder<T, TTable> {\n const selection: Record<string, ColumnDef> = {};\n\n for (const key of cols) {\n const col = this.env.table.columns[key];\n if (!col) {\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\n }\n selection[key] = col;\n }\n\n return this.select(selection);\n }\n\n\r\n\r\n /**\r\n\r\n * Selects raw column expressions\r\n\r\n * @param cols - Column expressions as strings\r\n\r\n * @returns New query builder instance with raw column selections\r\n\r\n */\r\n\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a Common Table Expression (CTE) to the query\r\n\r\n * @param name - Name of the CTE\r\n\r\n * @param query - Query builder or query node for the CTE\r\n\r\n * @param columns - Optional column names for the CTE\r\n\r\n * @returns New query builder instance with the CTE\r\n\r\n */\r\n\r\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n\r\n const subAst = this.resolveQueryNode(query);\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n\r\n * @param name - Name of the CTE\r\n\r\n * @param query - Query builder or query node for the CTE\r\n\r\n * @param columns - Optional column names for the CTE\r\n\r\n * @returns New query builder instance with the recursive CTE\r\n\r\n */\r\n\r\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\n\n return this.clone(nextContext);\n\n }\n\n\n /**\n * Replaces the FROM clause with a derived table (subquery with alias)\n * @param subquery - Subquery to use as the FROM source\n * @param alias - Alias for the derived table\n * @param columnAliases - Optional column alias list\n * @returns New query builder instance with updated FROM\n */\n fromSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const fromNode = derivedTable(subAst, alias, columnAliases);\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\n return this.clone(nextContext);\n }\n\r\n\r\n\r\n /**\r\n\r\n * Selects a subquery as a column\r\n\r\n * @param alias - Alias for the subquery column\r\n\r\n * @param sub - Query builder or query node for the subquery\r\n\r\n * @returns New query builder instance with the subquery selection\r\n\r\n */\r\n\r\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n const query = this.resolveQueryNode(sub);\n\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\n\n }\n\n\n /**\n * Adds a JOIN against a derived table (subquery with alias)\n * @param subquery - Subquery to join\n * @param alias - Alias for the derived table\n * @param condition - Join condition expression\n * @param joinKind - Join kind (defaults to INNER)\n * @param columnAliases - Optional column alias list for the derived table\n * @returns New query builder instance with the derived-table join\n */\n joinSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n condition: BinaryExpressionNode,\n joinKind: JoinKind = JOIN_KINDS.INNER,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\n return this.clone(nextContext);\n }\n\n\r\n\r\n /**\r\n\r\n * Adds an INNER JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the INNER JOIN\r\n\r\n */\r\n\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a LEFT JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the LEFT JOIN\r\n\r\n */\r\n\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a RIGHT JOIN to the query\r\n\r\n * @param table - Table to join\r\n\r\n * @param condition - Join condition expression\r\n\r\n * @returns New query builder instance with the RIGHT JOIN\r\n\r\n */\r\n\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Matches records based on a relationship\r\n\r\n * @param relationName - Name of the relationship to match\r\n\r\n * @param predicate - Optional predicate expression\r\n\r\n * @returns New query builder instance with the relationship match\r\n\r\n */\r\n\r\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Joins a related table\r\n\r\n * @param relationName - Name of the relationship to join\r\n\r\n * @param joinKind - Type of join (defaults to INNER)\r\n\r\n * @param extraCondition - Optional additional join condition\r\n\r\n * @returns New query builder instance with the relationship join\r\n\r\n */\r\n\r\n joinRelation(\r\n\r\n relationName: string,\r\n\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n\r\n extraCondition?: ExpressionNode\r\n\r\n ): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Includes related data in the query results\r\n\r\n * @param relationName - Name of the relationship to include\r\n\r\n * @param options - Optional include options\r\n\r\n * @returns New query builder instance with the relationship inclusion\r\n\r\n */\r\n\r\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\n\n const nextLazy = new Set(this.lazyRelations);\n\n nextLazy.add(relationName as string);\n\n return this.clone(this.context, nextLazy);\n\n }\n\n /**\n * Selects columns for a related table in a single hop.\n */\n selectRelationColumns<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, ...cols: C[]): SelectQueryBuilder<T, TTable> {\n const relation = this.env.table.relations[relationName] as RelationDef | undefined;\n if (!relation) {\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n }\n const target = relation.target;\n\n for (const col of cols) {\n if (!target.columns[col]) {\n throw new Error(\n `Column '${col}' not found on related table '${target.name}' for relation '${relationName}'`\n );\n }\n }\n\n return this.include(relationName as string, { columns: cols as string[] });\n }\n\n\n /**\n * Convenience alias for selecting specific columns from a relation.\n */\n includePick<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\n return this.selectRelationColumns(relationName, ...cols);\n }\n\n\n /**\n * Selects columns for the root table and relations from a single config object.\n */\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\n let qb: SelectQueryBuilder<T, TTable> = this;\n\n if (config.root?.length) {\n qb = qb.selectColumns(...config.root);\n }\n\n for (const key of Object.keys(config) as (keyof typeof config)[]) {\n if (key === 'root') continue;\n const relName = key as keyof TTable['relations'] & string;\n const cols = config[relName as keyof DeepSelectConfig<TTable>] as string[] | undefined;\n if (!cols || !cols.length) continue;\n qb = qb.selectRelationColumns(relName, ...(cols as string[]));\n }\n\n return qb;\n }\n\n\r\n\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n\r\n }\r\n\r\n\r\n\r\n getTable(): TTable {\r\n\r\n return this.env.table as TTable;\r\n\r\n }\r\n\r\n\r\n\r\n async execute(ctx: OrmSession): Promise<Entity<TTable>[]> {\r\n\r\n return executeHydrated(ctx, this);\r\n\r\n }\r\n\r\n\r\n\r\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<Entity<TTable>[]> {\r\n\r\n return executeHydratedWithContexts(execCtx, hydCtx, this);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE condition to the query\r\n\r\n * @param expr - Expression for the WHERE clause\r\n\r\n * @returns New query builder instance with the WHERE condition\r\n\r\n */\r\n\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a GROUP BY clause to the query\r\n\r\n * @param col - Column definition or column node to group by\r\n\r\n * @returns New query builder instance with the GROUP BY clause\r\n\r\n */\r\n\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a HAVING condition to the query\r\n\r\n * @param expr - Expression for the HAVING clause\r\n\r\n * @returns New query builder instance with the HAVING condition\r\n\r\n */\r\n\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds an ORDER BY clause to the query\r\n\r\n * @param col - Column definition or column node to order by\r\n\r\n * @param direction - Order direction (defaults to ASC)\r\n\r\n * @returns New query builder instance with the ORDER BY clause\r\n\r\n */\r\n\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a DISTINCT clause to the query\r\n\r\n * @param cols - Columns to make distinct\r\n\r\n * @returns New query builder instance with the DISTINCT clause\r\n\r\n */\r\n\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a LIMIT clause to the query\r\n\r\n * @param n - Maximum number of rows to return\r\n\r\n * @returns New query builder instance with the LIMIT clause\r\n\r\n */\r\n\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds an OFFSET clause to the query\r\n\r\n * @param n - Number of rows to skip\r\n\r\n * @returns New query builder instance with the OFFSET clause\r\n\r\n */\r\n\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\r\n\r\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\r\n\r\n return this.clone(nextContext);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using UNION\r\n\r\n * @param query - Query to union with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('UNION', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using UNION ALL\r\n\r\n * @param query - Query to union with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('UNION ALL', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using INTERSECT\r\n\r\n * @param query - Query to intersect with\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('INTERSECT', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Combines this query with another using EXCEPT\r\n\r\n * @param query - Query to subtract\r\n\r\n * @returns New query builder instance with the set operation\r\n\r\n */\r\n\r\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n\r\n return this.clone(this.applySetOperation('EXCEPT', query));\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE EXISTS condition to the query\r\n\r\n * @param subquery - Subquery to check for existence\r\n\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n\r\n */\r\n\r\n whereExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(exists(correlated));\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n\r\n * @param subquery - Subquery to check for non-existence\r\n\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n\r\n */\r\n\r\n whereNotExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(notExists(correlated));\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n\r\n * @param relationName - Name of the relationship to check\r\n\r\n * @param callback - Optional callback to modify the relationship query\r\n\r\n * @returns New query builder instance with the relationship existence check\r\n\r\n */\r\n\r\n whereHas(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n\r\n }\r\n\r\n\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\r\n\r\n\r\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(exists(finalSubAst));\n\n }\n\r\n\r\n\r\n /**\r\n\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n\r\n * @param relationName - Name of the relationship to check\r\n\r\n * @param callback - Optional callback to modify the relationship query\r\n\r\n * @returns New query builder instance with the relationship non-existence check\r\n\r\n */\r\n\r\n whereHasNot(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n\r\n }\r\n\r\n\r\n\r\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(notExists(finalSubAst));\n\n }\n\r\n\r\n\r\n /**\r\n\r\n * Compiles the query to SQL for a specific dialect\r\n\r\n * @param dialect - Database dialect to compile for\r\n\r\n * @returns Compiled query with SQL and parameters\r\n\r\n */\r\n\r\n compile(dialect: SelectDialectInput): CompiledQuery {\r\n\r\n const resolved = resolveDialectInput(dialect);\r\n\r\n return resolved.compileSelect(this.context.state.ast);\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Converts the query to SQL string for a specific dialect\r\n\r\n * @param dialect - Database dialect to generate SQL for\r\n\r\n * @returns SQL string representation of the query\r\n\r\n */\r\n\r\n toSql(dialect: SelectDialectInput): string {\r\n\r\n return this.compile(dialect).sql;\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Gets the hydration plan for the query\r\n\r\n * @returns Hydration plan or undefined if none exists\r\n\r\n */\r\n\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n\r\n return this.context.hydration.getPlan();\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n\r\n * @returns Query AST with hydration applied\r\n\r\n */\r\n\r\n getAST(): SelectQueryNode {\r\n\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n\r\n * Creates a column node for use in expressions\r\n\r\n * @param table - Table name\r\n\r\n * @param name - Column name\r\n\r\n * @returns ColumnNode with the specified table and name\r\n\r\n */\r\n\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n\r\n\r\n/**\r\n\r\n * Creates a literal value node for use in expressions\r\n\r\n * @param val - Literal value (string or number)\r\n\r\n * @returns LiteralNode with the specified value\r\n\r\n */\r\n\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nconst isTableDef = (value: unknown): value is TableDef => {\n return typeof value === 'object' && value !== null && 'columns' in (value as TableDef);\n};\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\nexport const getTableDefFromEntity = (ctor: EntityConstructor): TableDef | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n if (!meta.table) {\n bootstrapEntities();\n }\n return meta.table;\n};\n\nexport const selectFromEntity = <TTable extends TableDef>(\n ctor: EntityConstructor\n): SelectQueryBuilder<any, TTable> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return new SelectQueryBuilder(table as TTable);\n};\n"],"mappings":"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","names":["normalizePropertyName","resolveConstructor","propertyName","ctor","state","hydration","relationSelectionResult","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasOne","hasMany","belongsTo"]}